天天看點

C++ 文法概括總結1 輸入輸出2 條件、數組3 指針4 函數5 其他

文章目錄

  • 1 輸入輸出
    • 1.1 注意事項
    • 1.2 輸入
      • 1.2.1 C
      • 1.2.2 C ++
      • 1.2.3 C/C++ 字元串輸入小結
    • 1.3 scanf / printf
  • 2 條件、數組
    • 2.1 if
    • 2.2 switch
    • 2.3 數組
  • 3 指針
    • 3.1 指針變量
    • 3.2 指針數組
  • 4 函數
    • 4.1 傳遞參數:變量
    • 4.2 傳遞參數:數組
  • 5 其他
    • 5.1 int / long long(空間大小)、OJ最大運算次數(時間大小)
    • 5.2 ASCII碼
    • 5.3 資料類型的轉換
    • 5.4 邏輯運算符
    • 5. 5 條件運算符
    • 5.6 typedef
    • 5.7 浮點數的比較

1 輸入輸出

1.1 注意事項

  • 一個.cpp檔案,最好不要 printf 和 cout 交雜,要麼全用C,要麼全用C++
  • 除了string的輸入用cin外,其餘任何都用scanf、printf
  • 涉及浮點數,都用double

1.2 輸入

1.2.1 C

#include<cstdio>

輸入 停止符(不能讀) 可讀 輸出 舉例
scanf 空格、/n 當讀入%c,可讀空白(空格、/n、/t) printf
getchar 讀一個字元【任何】 putchar

char ch;

ch = getchar();

putchar(ch);

gets \n 讀一行char數組【可讀 空格,不讀 \n】 puts

char chs[10];

gets(chs);

puts(chs);

// 用getchar 輸入字元串數組
char str[20];
for(int i=0;i<5;i++){
	str[i] = getchar();
}
str[5] = '\0';  		// 關鍵
           

1.2.2 C ++

#include<iostream>

輸入 停止符(不能讀) 可讀 輸出 舉例
cin>>xxx>>… 空格、/n cout<<xxx<<…
getline /n 讀一行char數組 或 string【可讀 空格,不讀 \n】

char chs[10]; string str;

cin.getline(chs,10);

getline(cin, str);

int a;
	char b[20];
	double db;
	string str;
	cin>>a>>b>>db>>str;
	cout<<a<<endl<<b<<endl<<setiosflags(ios::fixed)<<setprecision(2)<<db<<endl<<str<<endl;
	//
	cin.getline(b,5); //隻能讀4個+\0
	cout<<b<<endl;
	getline(cin,str);
	cout<<str<<endl;
           

1.2.3 C/C++ 字元串輸入小結

字元串類型 是否含有空格 輸入
char* 沒有 scanf
gets(char*);
string 沒有 cin
getline(cin, string);

1.3 scanf / printf

#include<cstdio>
#include<iostream>
#include<cmath>

using namespace std;

const double PI = acos(-1.0);
const int INF = 0x3fffffff;     //無窮大, 7個f

int main(){
	int a;
	scanf("%d",&a);
	printf("%d",a);
	printf("%6d",a);        // 右對齊,不足6位的補空格
	printf("%06d",a);       // 右對齊,不足6位的補0

	long long b;
	scanf("%lld",&b);
	printf("%lld",b);       // 保留小數

	char c;
	scanf("%c",&c); 	    // 可讀空白(空格、/n、/t)
	printf("%c",c);

	double d;
	scanf("%lf",&d);	    // %lf
	printf("%f",d);
	printf("%.2f",d);


	char s[20];
	scanf("%s",s);          // 沒有 &
	printf("%s",s);


	string str;
	cin>>str;
	printf("%s",str.c_str());

	return 0;
}

           

2 條件、數組

2.1 if

if(n){		// n != 0
		... 
	} 
	if(!n){		// n == 0
		... 
	}
           

2.2 switch

int a = 1 , b=1;
	int c = 5;
	switch(c){
		case 2:
		case 3:
		case 4:
			printf("%d",a+b);       //c=2 || c=3 || c=4
			break;
		case 5:
			printf("%d",a-b);
			break;
		default:
			printf("end");
	}
           

2.3 數組

二維初始化:

當數組較大( 1 0 6 10^6 106)時, 設定全局變量

3 指針

unsigned類型的整數

3.1 指針變量

int *a;
	int b;
	a = &b;		//a指向b
           

a的内容:b的位址

  • a 等價于 &b
  • *a 等價于 b

擴充:

搞懂以下代碼

int *a;
    int b;
    a = &b;		//a指向b


    //
    b = 100;
    printf("*a = %d  b = %d  a = %d  &b = %d\n",*a,b,a,&b);
    *a = 200;   //改變b
    printf("*a = %d  b = %d  a = %d  &b = %d\n",*a,b,a,&b);
    //
    a ++;                       // 跨越了一個int存儲單元(4B)
    printf("a = %d\n",a);
           
C++ 文法概括總結1 輸入輸出2 條件、數組3 指針4 函數5 其他

3.2 指針數組

int a[5];
	for(int i=0; i<5; i++){
		scanf("%d",a+i);            // 相當于 scanf("%d", &a[i]);
	}
	for(int i=0;i<5;i++){
		printf("%d ",*(a+i));       // 相當于 printf("%d ",a[i]);
	}
	//
	int *p;
	p = a;			                //相當于 p = &a[0];
	for(; p<a+5; p++){
		scanf("%d", p);
	}
	for(p=a; p<a+5; p++){
		printf("%d ",*p);
	}

           

4 函數

4.1 傳遞參數:變量

一共有5種情形,對應如下5個swap函數

// 不改變main中變量(函數中的變量是main中的副本)
void swap1(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}

//引用:改變main中的變量(函數中的變量是main中的别名)
void swap2(int &a, int &b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}

// 位址傳值/指針傳值:改變main中的變量
void swap3(int * a, int * b){
	int temp;			// int *temp;
	temp = *a;			// *temp = *a;  運作錯誤,理由:temp未初始化,存放随機
	*a = *b;
	*b = temp;
}

// 不改變main中變量
void swap4(int * a, int * b){	
	int *temp;
	temp = p;
	p = q;
	q = temp;
}

// 指針引用:不改變main中變量
void swap5(int * &p, int * &q){	
	int *temp;
	temp = p;
	p = q;
	q = temp;
}

int main(){
	int a=1, b=2;
	swap1(a, b);
	swap2(a, b);		// 交換
	swap3(&a, &b);		// 交換
	swap4(&a, &b);	
	int *p = &a, *q = &b;
	swap5(p, q);
	return 0;
}
           

4.2 傳遞參數:數組

void fun(int a[], int b[][3]){
	...
}

int main(){
	int a[10];
	int b[5][3];
	fun(a, b);
	return 0;
}
           

5 其他

5.1 int / long long(空間大小)、OJ最大運算次數(時間大小)

一般比賽平台,最大運算次數: 1 0 7 10^7 107

類型 位數 可表示範圍
int 32 − 2 31 -2^{31} −231( − 2 ∗ 1 0 9 -2*10^9 −2∗109) ~~~ 2 31 − 1 2^{31}-1 231−1( 2 ∗ 1 0 9 2*10^9 2∗109)
long long 64 − 2 63 -2^{63} −263( − 9 ∗ 1 0 18 -9*10^{18} −9∗1018) ~~~ 2 63 − 1 2^{63}-1 263−1( 9 ∗ 1 0 18 9*10^{18} 9∗1018)

總結:

  • x <= 1 0 9 10^9 109 或 32位,用int
  • x <= 1 0 18 10^{18} 1018 或 64位,用long long

5.2 ASCII碼

小寫 = 大寫 + 32

字元 ASCII碼
‘0’ 48
‘A’ 65
‘a’ 97
char c = 117;
	printf("%c",c);
	char c = '9';
	printf("%d",c);

           

5.3 資料類型的轉換

  1. char*(字元串數組)<——> int、double、 char*(字元串數組)

    sscanf()和sprintf()

    詳情見:此文章:3 cstring

  2. char*(字元串數組) <——> string

    詳情見:此文章:2 string

  3. int <——> double

    int a; double db; a = (int)db; db = (double)a;

5.4 邏輯運算符

類型 代碼
&&
||
!
位與 a & b
位或 a | b
位異或 a ^ b
取反 ~ a

1左移8位:

1<<8 = 2 8 2^{8} 28

5. 5 條件運算符

int max(int a, int b){
	return a>b?a:b ;
}
           

5.6 typedef

當複雜資料類型出現太多,起别名

typedef 資料類型 别名

如:typedef long long LL;

#include<cstdio>
using namespace std;

typedef long long LL;  

int main(){
	LL a = 23LL;
	printf("%lld",a);
	return 0;
}

           

5.7 浮點數的比較

#include<cstdio>
#include<cmath>

using namespace std;

const double eps = 1e-8;                            // 1*10^(-8)

// define中定義的函數:變量帶(),傳回bool
#define Equ(a,b) ( (fabs((a)-(b))) < (eps))         // a==b:  b-eps< a <b+eps
#define More(a,b) ( ((a)-(b)) > (eps))              // a>b:   a > b+eps
#define Less(a,b) ( ((a)-(b)) < (-eps))             // a<b:   a < b-eps
#define MoreEqu(a,b) ( ((a)-(b)) > (-eps))          // a>=b:  a > b-eps
#define LessEqu(a,b) ( ((a)-(b)) > (eps))           // a<=b:  a < b+eps

int main(){
	double db1 = 4 * asin(sqrt(2.0)/2);      // 4 * pi/4
	double db2 = 3 * asin(sqrt(3.0)/2);	     // 3 * pi/3
	// 浮點數的比較
	printf("%d\n",db1==db2);                // 不精确
	printf("%d\n",Equ(db1,db2));            // 精确

	// 修正
	double res = -0.00;                     //某個結果
    printf("%f\n",res+eps);                 // 修正

	return 0;
}

           

繼續閱讀