C語言 學習筆記
技術標籤:c語言
前言:為更好地學習資料結構,粗略的自學了C語言,以下為相關筆記整理。
一、C語言基本語句
1.固定格式
由標頭檔案和主函式組成
#include<stdioh>
int main()
{
...
return 0;
}
2.printf語句
格式:
printf("xxxx");
\n換行(最後一個預設有) \t空格
3.資料型別:int,float,double,char
int——整數型
int a = 3;
float——小數型(小數點後位數較少)
float a = 3.14;
double——小數型(小數點後位數較多)
double a = 3.14;
char——字元型
char a = 'A';
例題:請程式設計序將hello加密,加密規律是:用原來的字母后面第一個字母代替原來的字母。
#include<stdioh>
int main()
{
char c1='h',c2='e',c3=c4='l',c5='o';
c1 = c1+1;
c2 = c2+1;
c3 = c3+1;
c4 = c4+1;
c5 = c5+1;
printf("加密後是%c%c%c%c\n",c1,c2,c3,c4,c5);
return 0;
}
執行結果:ifmmp
4.printf語句輸出int,float,double,char
eg:
int a = 5;
printf("a = %d\n",a);
%d——整數,%f——小數,%c——字元、
5.scanf語句輸入int,float,double,char
ps:此處的scanf與python中的input類似
eg:
int a,b;
scanf("%d,%d",&a,&b);
int——%d
float——%f
double——%lf
char——%c
例題:編寫程式求兩個數的平均數。
#include<stdioh>
int main()
{
int a,b,s;
scanf("%d,%d",&a,&b);
s = (a+b)/2
printf("%d與%d的平均數為%d\n",a,b,s);
return 0;
}
執行結果:(鍵盤輸入)23,45——23與45的平均數為34
6.putchar(),getchar()語句
ps:類似於python中的input,print(針對於字元型)。
例題:編寫程式將AB轉換為小寫
#include<stdioh>
int main()
{
char a,b;
a = getchar();
b = getchar();
a = a+32;
b = b+32;
putchar(a);
putchar(b);
return 0;
}
執行結果:(鍵盤輸入)AB——ab
7.數學運算
- abs(x)——整數x的絕對值
- fabs(x)——求x的絕對值
- sin(x),cos(x),tan(x)——求sinx,cosx,tanx
- exp(x)——求e的x次方
- pow(x,y)——求x的y次方
- sqrt(x)——求根號下x
- log(x)——求lnx
- log10(x)——求lgx
三個小知識點
1.%m.nf (m為佔位格,nf為保留n為小數,小數點也佔一格,m為正時空格加前面,為負時空格加後面)
2.%e (科學計數法,eg:123.456——1,234560e+002 = 123.456*10的二次方)
3.(int)(表示式) (將表示式結果強制轉成整形,即抹去表示式結果中的小數點)
二、選擇語句
1.if語句
if(表示式)//注意:if和else後面沒有分號
{
...
}
else if(表示式)
{
...
}
else
{
...
}
巢狀式:
if(表示式)
{
...
}
else
{
if(表示式)
...;//只有一個條件時可以不用大括號
else
...;
}
例題:輸入兩個實數a,b,按數值由小到大的順序輸出這兩個數
#include<stdioh>
int main()
{
double a,b,t;
scanf("%lf,%lf",&a,&b);
if(a>b)
{
t=a;
a=b;
b=t;
}
printf("%f,%f\n",a,b);
return 0;
}
2.常見運算子號
1.算術運算子
2.自增自減運算子
3.關係運算符
4.邏輯運算子
5.三目運算子
表示式1?表示式2:表示式3
先判斷表示式1的值是否為真,若真執行表示式2;若假執行表示式3.
6.運算子優先順序比較
例題:輸入一個字元,判斷它是否為大寫字母,若是則將其轉換成小寫字母,若不是則不轉換,然後輸出最後得到的字元。
#include<stdioh>
int main()
{
char ch;
scanf("%c,&ch");
if(ch>='A'&&ch<='Z')
ch=ch+32;
printf("%c\n",ch)
return 0;
}
3.switch語句
switch(整型變數或字元型變數)
{
case常量1:語句1;break;
case常量2:語句2;break;
.
.
default:語句;break;//可省略該子語句
}
例題:某課成績原為A,B,C三個等級,現要將其轉成百分制分數段,規則是:A等,B等轉成70~100,C等轉成<70。請編寫一程式,等級由鍵盤輸入,輸出分數段。
#include<stdioh>
int main()
{
char dengji;
scanf("%c",dengji);
switch(dengji)
{
case'A':
case'B':printf("該生分數為70~100\n");break;//相同可省略
case'C':printf("該生分數為<70\n");break;
default:printf("該生的等級輸的不對!\n");break;
}
return 0;
}
三、迴圈語句
1.while語句
while(表示式)
{
執行程式碼塊
}
ps:表示式一般為關係表示式或邏輯表示式,當表示式的值為假時不執行迴圈體,反之則迴圈體一直執行。
2.do-while語句
do
{
執行程式碼塊
}
while(表示式);//注意:這裡有分號
ps:do-while語句與while語句不同之處在於,前者至少要迴圈一次語句再判斷條件,後者先判斷。
3.for語句
for(表示式1;表示式2;表示式3)
{
執行程式碼塊
}
ps:可以省略表示式1或表示式3,但是兩個分號不可以省略(;表示式2;)
1.執行表示式1(多為賦值語句),對迴圈變數做初始化;
2.判斷表示式2(關係表示式),若真,則執行程式碼塊,然後向下執行;若假,則結束迴圈;
3.執行表示式3(迴圈變數的步進值),(i++)等對於迴圈變數進行操作的語句;
4.執行for迴圈中執行程式碼塊後執行第二步;第一步初始化只會執行一次;
5.迴圈結束,程式繼續向下執行。
總結
在知道迴圈次數的情況下更適合使用for迴圈
在不知道迴圈次數的情況下應考慮使用while迴圈或do-while迴圈:
- 如果有可能一次都不迴圈應考慮使用while迴圈
- 如果至少迴圈一次應考慮使用do-while迴圈
本質上講三者可以相互轉換的
例題:列印三角形星星堆
#include <stdio.h>
int main()
{
int i, j, k;
for(i=1; i<5; i++)//i++為自加1
{
/* 觀察每行的空格數量,補全迴圈條件 */
for(j=i; j<5; j++)
{
printf(" "); //輸出空格
}
/* 觀察每行*號的數量,補全迴圈條件 */
for( k=0;k<2*i-1;k++)
{
printf("*"); //每行輸出的*號
}
printf("\n"); //每次迴圈換行
}
return 0;
}
4.結束語句之break語句
在多層迴圈中,一個break語句只跳出當前整個迴圈
5.結束語句之continue語句
結束本次迴圈開始執行下一次迴圈
四、陣列
1.陣列
陣列:連續的,大小固定並且裡面的資料型別一致的記憶體空間
宣告: 資料型別 陣列名稱[長度]
初始化:
- 資料型別 陣列名稱[長度n] = {元素1,元素2…元素n};
- 資料型別 陣列名稱[] = {元素1,元素2…元素n};
- 資料型別 陣列名稱[長度n];陣列名稱[0] = 元素1;陣列名稱[1] = 元素2;陣列名稱[n-1] = 元素n;
ps:下標均以0開始,初始化時陣列內元素的個數不能大於宣告的陣列長度
2.一維陣列
資料型別 陣列名稱[長度n]
eg:
int a[5] = {1,2,3,4};//可以少於長度,不寫預設為0
3.二維陣列
資料型別 陣列名稱【行】【列】
eg:
int a[2][3] = {{1,2,3},{4,5,6}};
4.輸出字元陣列
1.挨個輸出printf(‘’%c‘’,陣列名稱[i])
2.整體輸出printf(‘’%s‘’,陣列名稱)或者puts(陣列名稱)
例題:輸出一個三行*組成的菱形圖案。
#include <stdio.h>
int main()
{
char c[3][3] = {{' ','*',' '},{'*',' ','*'},{'*','*','*'}};
int i,j;
for(i=0;i<=2;i++)
{
for(j=0;j<=2;j++)
printf("%c",c[i][j]);
printf("\n");
}
return 0;
}
5.輸入字元陣列
1.挨個單詞輸入scanf(“%s%s…”, )
2.整句輸入gets()
6.陣列的遍歷
採用迴圈的方式將每個元素遍歷出來
int a[3] = {1,2,3};
int i;
for(i=0;i<3;i++)
{
printf("%d\n",a[i]);
}
五、函式
1.函式的定義
[資料型別說明] 函式名稱([引數])
{
執行程式碼塊;
return(表示式);
}
ps:自定義函式儘量放在主函式之前,如果要放在主函式之後需要在主函式之前先宣告自定義函式。宣告格式為:[資料型別說明] 函式名稱([引數]);
2.函式的呼叫
一般形式為:函式名([引數]);
[]中可以是常數,變數或其他構造型別資料及表示式,多個引數之間用逗號分隔。
3.函式的遞迴
遞迴就是一個函式在它的函式體內呼叫它自身。(注意遞迴函式必須有結束條件)
例題:猴子第一天摘下N個桃子,當時就吃了一半,還不過癮,就又多吃了一個。第二天又將剩下的桃子吃掉一半,又多吃了一個。以後每天都吃前一天剩下的一半零一個。到第10天在想吃的時候就剩一個桃子了,問第一天共摘下來多少個桃子?並反向列印每天所剩桃子數。
#include <stdio.h>
int getPeachNumber(int n)
{
int num;
if(n==10)
{
return 1;
}
else
{
num = (getPeachNumber(n+1)+1)*2;
printf("第%d天所剩桃子%d個\n", n, num);
}
return num;
}
int main()
{
int num = getPeachNumber(1);
printf("猴子第一天摘了:%d個桃子。\n", num);
return 0;
}
六、指標
指標的定義:指標是一個變數,用來存放地址的變數
指標的型別:基本型別(int,float,double,char),陣列指標,函式指標
指標的引用:指標引用後得到的是該地址所對應的變數的值
1.指標變數與普通變數
指標=&變數(關聯)
*指標=指標指定的變數的值
例題:輸入兩個整數,按先大後小的順序輸出這兩個數,請用指標來程式設計。
#include <stdio.h>
int main()
{
int a,b,*p,*q,*r;
printf("請輸入兩個整數:\n");
scanf("%d,%d",&a,&b);
p=&a;
q=&b;
if(a<b)
{
r=p;
p=q;
q=r;
}
printf("較大數為%d 較小數為%d\n",*p,*q);
return 0;
}
2.指標變數與一維陣列
指標=&陣列名[某數]
指標+i=&陣列名[某數+i]
*指標=指標指定的變數的值
&陣列名[某數]=陣列名+某數
陣列名[某數]=*(陣列名+某數)
eg:
int*p,*q,a[3]={5,10,15};
p=&a[0];
q=&a[1];
因為q指向a[1]=10,則q-1=a[1-1]=a[0]=5
例題:一個整型數組裡的5個元素由鍵盤輸入,將每個元素變為原來的兩倍後再依次輸出。
非指標型:
#include <stdio.h>
int main()
{
int a[5];
int i;
printf("請輸入5個整數:\n");
for(i=0;i<=4;i++)
{
scanf("%d",&a[i]);
a[i]=a[i]*2;
}
printf("加倍後的各整數為:\n");
for(i=0;i<=4;i++)
printf("%d\t",a[i]);
printf("\n");
return 0;
}
指標型:
#include <stdio.h>
int main()
{
int a[5];
int i,*p;
p=&a[0];
printf("請輸入5個整數:\n");
for(i=0;i<=4;i++)
{
scanf("%d",p+i);
*(p+i)=*(p+i)*2;
}
printf("加倍後的各整數為:\n");
for(i=0;i<=4;i++)
printf("%d\t",*(p+i));
printf("\n");
return 0;
}
3.指標變數與一維陣列相關函式
函式宣告:陣列名[]——*p
函式解釋:陣列名[i]——*(p+i)
函式使用:陣列名——q(使用前需先關聯)
例題:有兩個小組,分別有5名學生和10名學生。程式設計輸入這些學生的成績,並呼叫一個aver函式求這兩個小組的平均分。
非指標型:
#include <stdio.h>
int main()
{
float aver(float a[],int n);
float zu1[5],zu2[10];
int i;
printf("請輸入第一組的學生成績:\n");
for(i=0;i<=4;i++)
scanf("%f",&zu1[i]);
printf("請輸入第二組的學生成績:\n");
for(i=0;i<=9;i++)
scanf("%f",&zu2[i]);
printf("第一組平均分是%f\n",aver(zu1,5));
printf("第二組平均分是%f\n",aver(zu2,10));
return 0;
}
float aver(float a[],int n)
{
float sum=a[0],pingjunshu;
int i;
for(i=1;i<n;i++)
sum=sum+a[i];
pingjunshu=sum/n;
return(pingjunshu);
}
指標型:
#include <stdio.h>
int main()
{
float aver(float *p,int n);
float zu1[5],zu2[10];
int i,*q,*r;
q=&zu1[0];
r=&zu2[0];
printf("請輸入第一組的學生成績:\n");
for(i=0;i<=4;i++)
scanf("%f",q+i);
printf("請輸入第二組的學生成績:\n");
for(i=0;i<=9;i++)
scanf("%f",r+i);
printf("第一組平均分是%f\n",aver(q,5));
printf("第二組平均分是%f\n",aver(r,10));
return 0;
}
float aver(float *p,int n)
{
float sum=*p,pingjunshu;
int i;
for(i=1;i<n;i++)
sum=sum+*(p+i);
pingjunshu=sum/n;
return(pingjunshu);
}
4.指標變數與二維陣列
指標=&陣列名[a],[b]
*指標=指標指定的變數的值
指標+i=&(陣列名[a],[b]後面第一個元素)
以下待補充
5.指標變數與二維陣列相關函式
6.指標變數指向二維陣列的行變數
7.用指向二維陣列行變數的指標變數做形參
8.指標變數與字串
9.指標變數與字串相關函式
10.指標變數與函式
11.返回指標值的函式
12.指標與一維二維陣列的數值關係
七、結構體
1.定義結構體
struct為保留字
struct student
{
int xuehao;
char name[30];
char xingbie;
float chengji;
};
struct student a={001,"haha",'G',99};
|
|
a.xuehao=001;
a.name="haha";
a.xingbie='G';
a.chengji=99;
#include <stdio.h>
int main()
{
return 0;
}
2.結構體陣列
struct student
{
int xuehao;
char name[30];
char xingbie;
float chengji;
}xuesheng[3]={{001,"haha",99},{002,"hehe",20},{003,"xixi",90}};
|
|
xuesheng[0].xuehao=001;xuesheng[0].name="haha";xuesheng[0].chengji=99;
xuesheng[1].xuehao=002;xuesheng[1].name="hehe";xuesheng[1].chengji=20;
xuesheng[2].xuehao=003;xuesheng[2].name="xixi";xuesheng[2].chengji=90;
3.使用結構體變數做函式引數
4.結構體變數與指標變數
宣告:部分資料源自網路,如有侵權,請聯絡我刪除!
文中如存在謬誤、混淆等不足,歡迎批評指正!