C語言基礎部分
一、 如何把自己的函式加進去
①無返回值
#include<stdio.h>
void jolly(void);
int main(void)
{
jolly();
return 0;
}
void jolly(void) //這裡沒有‘;’
{
printf("forhe's a jolly goof fellow\n");
}
/*這裡main是主函式,先執行main(),再執行自己定義的函式*/
②有返回值
#include<stdio.h>
double sum_squares(long a,long b);
int main()
{
………….
}
Double sum_squares(long a,long b)
{
Doubletotal=0;
Long I;
………….
Return total;
}
二、 print語句
1、會替換以前的資料,轉義序列
#include<stdio.h>
Int main()
{
float salary;
printf(“Enter your desired monthly salary:”);
printf(“$_______\b\b\b\b\b\b\b”);//\b是往後退
printf(“%f”,&salary);
printf(“\n\t$%.2f a month is $%.2f a year.”,
salary,salary*12.0);//3
printf(”\rGee!\n”);//4
/*對於第三行,列印完後,游標會在本行不動,繼續讀第4個,這時/r會返回第一行,列印Gee!,因為列印是替換機制,所有列印第四行必須替換第三行東西。/t是製表符,和tab建作用相同,有時系統設定tab是4個空格或8個空格,輸出就會有幾個空格*/
2、print語句後從右到左計算
Int a=1;
Printf("a=%d,++a=%d”,a,++a);
輸出 2,2
三、 資料型別
1、浮點數舍入錯誤
Float型別的數字通常只能儲存所有數字開頭起6或7位有效數字。
如2e10+1再減去2e10時顯示只能2後5到6個零
2、double16位有效數字
Float7位有效數字(3.500000)
※3、型別轉化
①char和short都會自動轉換成int
②float會被轉換成double
③如果目標型別事無符號整型,且待賦值的數是整數時,額外的數會被忽略。如:目標型別是8位unsigned char,代付的值是原始資料求模256
四、(字串和格式化輸出)
1、char name[40],此時scanf(“%s,name”)
//name不用取地址符&
2、scanf()在取到合適的值後會在有空格的地方停止
//如輸入Kevin chen,輸出只會是Kevin
/*scanf(“%d ,%d”)格式字串的空白意味著跳過下一個輸入項前面的所有空白*/
3、使用#include<string.h>才可以使用strlen()函式,給出字串中字元長度(包括空格和標點符號)
4、c預處理
#define BOOK “westlife’biography”
/*用大寫字母表示常量,對於字串,必須用雙引號,並且雙引號不會打出*/
/*如果想輸出雙引號,單引號,斜槓,”\””就會輸出雙引號*/
5、const限定符
Const int vim=15
//此刻vim值不可修改
6、printf(“010.2f”,qq);
/*10前的0代表如果qq不夠10個寬度,用零補,如0572043666*/
7、%.4s 、
//意味著對於python來說只打印pyth
8、列印較長的字串
//不能在雙引號括起來的字串中間直接斷開
方法①用\隔開
②用“
//對於一句話,可以使用多個“隔開
9、printf()用*表示寬度
Printf(“the number is %*d”,width,number);
例子
#include<stdio.h>
#include<string.h>
int main()
{
charname1[20];
charname2[20];
printf("please enter two names:");
scanf("%s %s",name1,name2);
printf("%s %s\n",name1,name2);
printf("%*zd%*zd\n",strlen(name1),strlen(name1),strlen(name2),
strlen(name2));
printf("%zd%*zd",strlen(name1),strlen(name1),strlen(name2));
return 0;
}
輸入Kevin bee
輸出Kevin bee
5 3
5 3
10、scanf中會跳過含有*的項
Scanf(“%*d,%*d,%d”,&n);
Printf(“the last number is %d”,n);
11、列印%,輸出時必須用兩個%,這樣才可輸出%
12、%s會是列印一句話,%c會列印一個字元
13、%lf表示double型別
14、最後程式的getchar會取走scanf沒有取走的換行符(每次後一個scanf會將上一個scanf後用戶輸入的換行符替換掉),多加一次putchar就會起到暫停的作用
五、 運算子、語句
1、整數除法結果的小數部分被丟棄,這一過程被稱為截斷
2、7.0可直接用7.表示
3、截斷計算結果的小數部分,不會四捨五入
4、求餘數的運算子只能用於整數,不能用於浮點數
當char型別賦值超過一位元組大小,待賦值將是原始值求模(求餘數)256
※5、強制型別裝換
A=1.6+1.7=3.3
B=(int)1.6+(int)1.7=2
例如(float)9變為9.0
6、列印字母a-g
Char ch=’a’;
While(ch<=’g’)
Printf(“%5c”,ch++);
Printf(“\n”);
/*”=”一定要在《後面*/
7、while迴圈注意
當while這一句後沒有花括號,緊接著一句在迴圈內,其餘不在
例子:while(x++<103)
Printf(“%dd\n”,x);//這句話在迴圈內
Printf(“%4d\n”,x);//沒有在迴圈內
※8、將程式段帶註釋的成功去除
#if 0
語句//註釋
#endif
這樣帶註釋的語句就成功去除
9、想要使用pow()函式
要用<math.h>,同時使用gcc –lm(加檔案)
#include<stdio.h>
#include<math.h>
void cube(double x);//說明是double型別
int main()
{
double n,m;
printf("you will get a cube\n");
printf("please enter a number\n");
scanf("%lf",&n);
m=pow(n,3);
cube(m);//給引數
return 0;
}
void cube(double x)
{
printf("%f",x);
}
※10、邏輯運算子
a=1,b=2,c=3,d=4,m=1,n=1;
(m=a>b)&&(n=c>d)
M=0,所以這句話的真值為0,此時不在執行後一句話,既n不改變
所以輸出m=0,n=1
11、sizeof運算子
①sizeof(x=f+2)
/*不會對x賦值,只是求x此時所佔的位元組*/
②sizeof()以位元組微單文給出指定型別大小
/*運算物件是型別時,圓括號必不可少,如int,但是對於特定量,可有可無,但是一直用帶括號的,輸出的格式化是%zd代表十進位制,%zx代表16進位制*/
③sizeof一個數組名的時候會算上所有
Float a【10】
Sizeof(a)=40
12、條件運算子 ? :
Max=(a>b)?a:b
/*如果a》b成立,則max=a,否則max=b
六、 迴圈
1、 a=scanf(…)的情形
a=scanf(‘%ld”,&num);
/*如果輸入的是字串要求的,a此時=1,既a為真*/
2、 while(a)和while(a!=0)相同
3、為了檢查比較的==和=不用錯,一般用1==stay來表示
4、_Bool型別
_Bool input_is_good//不用下劃線,is是另外一種用法
給這句話賦值就可以弄布林值,布林值只能存1或0,表示真假
5、關係運算符(<)比算術運算子低(+-),比賦值運算子高
6、①while是入口條件迴圈,滿足開始條件才可迴圈。
While(scanf(“%d”,&num)==1)
;
/*此時程式會跳過數字,知道不是數字,while結束,此時“;”什麼都不做,只是一個空語句*/
②do while是出口條件迴圈
Do{
Printf(“qq”)
}while();
Statement//這句話不在迴圈內
7、不能用關係運算符比較字串,比方xxx==yyy
8、比較浮點數,儘量用《和》,因為浮點數的舍入誤差會導致在邏輯上應該相等的不相等。使用fbs()函式算出絕對值可以方便比較浮點數
8、while迴圈當有數值時,會一直迴圈
While(age=55)
{
}
/*這種情況也會無限迴圈,因為還是常數*/
9、while(a)就是等於while(a!=0)或者就是while(a!=false)
10、for迴圈
①for(count=1;count<=22;count++)
printf(“hello”)
/*順序是先過count=1,然後再判斷,之後列印
接著再進行第三句,更新資料,然後判斷(第一句只執行一次)*/
執行第一句之後,還要再判斷條件才可輸出
※②for(x=1;y<=75;y=(++x*5)+50)
Printf(“%d %d”,x,y);
//等於
For(x=1;y<=75;y=x*5+50)
{
Printf(“%d %d”,x,y);
++x;
}
//也等於
For(x=1;y<=75;++x,y=x*5+50)//使用逗號表示式
③for(printf(“hello”);num!=6;)
/*print只執行一次,num!=6是條件*/
11、①a=249,500;
解釋為a=249;
500;
②a=(249,500);
這個時候a=500
12、巢狀迴圈(輸出三角形等問題)
For(row=0;row《ROWS;row++)
{
For(ch=(‘A’+row);ch<(‘A’+CHARS);ch++)
Printf(“%c”,ch);
Printf(“\n”);
}
有行有列
13、陣列對於scanf來說&的有無
①char name【20】不用&
②int score【10】,對score【0】賦值,用scanf要用&
七、 分支和跳轉
1、 if語句
①if(stament)
statement
else
statement
② if
Else if
Else if
Else
③else會和最近的一個else匹配
If( )①
If( )②
Else//與2匹配
If()①
{
If()②
}
Else//和①匹配
2、 getcahr和putchar
ch=putchar()和scanf(“%c”,&ch)等價
putchar同理
3、常量不能用自增或自減符號
a=2
n=++(a+a++)
錯誤,a+a++已經是常數
3、 continue和break
4.switch語句
switch(ch)
{
Case ‘a’://常數不加‘’
Statement;
Break;
Case ‘b’:
Statement;
Break;
Default://如果ch既不等於a,也不等於b,則輸出這句話
statement
}