1. 程式人生 > 其它 >C語言 學習筆記

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.數學運算

  1. abs(x)——整數x的絕對值
  2. fabs(x)——求x的絕對值
  3. sin(x),cos(x),tan(x)——求sinx,cosx,tanx
  4. exp(x)——求e的x次方
  5. pow(x,y)——求x的y次方
  6. sqrt(x)——求根號下x
  7. log(x)——求lnx
  8. 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.陣列

陣列:連續的,大小固定並且裡面的資料型別一致的記憶體空間

宣告: 資料型別 陣列名稱[長度]

初始化:

  1. 資料型別 陣列名稱[長度n] = {元素1,元素2…元素n};
  2. 資料型別 陣列名稱[] = {元素1,元素2…元素n};
  3. 資料型別 陣列名稱[長度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.結構體變數與指標變數

宣告:部分資料源自網路,如有侵權,請聯絡我刪除!
文中如存在謬誤、混淆等不足,歡迎批評指正!