C語言教程(上)


P0前言

  • 代碼有些可能運行不了,都是我直接敲寫,沒有運行。如果結果不對聯系QQ:2602629646
  • 堅持下去,有的代碼真的好玩。下面是我自己寫的。表白代碼-孤寡青蛙-希望你能用到左邊的代碼,而不是右邊的代碼🐶。
  • 最好不要手寫代碼
    1. 及時反饋:你的任何程序錯誤,編譯器會馬上給你指出。而書本不會
    2. 改正錯誤:隨隨便便一個代碼就是50行,你寫錯一個地方,在書本上很難改。特別是你的算法錯誤,把這一塊代碼移動到別處?
    3. 50行代碼占幾面紙啊!就挺浪費的。
    4. 本來就難,還沒點反饋,都看不到自己寫出來的是什么,真的容易勸退。
    5. 先用編譯器,再寫在本子上。一個錯誤,全部重寫。
  • 不要記代碼,多敲代碼,編譯器會及時反饋你的錯誤,是學習編程最好的方法。文章中會有一些不實用的東西,但考試就會考它,我會標注考試和老手。對於不用考試的了解一下就行,有的確實難,我也不太會,不懂也沒關系。
  • 編譯器dooccn網頁版編譯器-jsrun網頁版編譯器-Dotcpp在線編譯-C語言教學視頻-編譯器安卓版-電腦編譯器-筆記-練習

P1概念(考試)

  • 算法的特征:有窮性、確定性、可行性、零個或多個輸入、至少一個或多個輸出。
  • 程序的結構:順序結構、分支結構、循環結構。

P2輸出

  • C語言的輸出格式是printf(""),雙引號里面是什么內容,輸出的就是什么。注意大部分代碼都是英文的,包括標點符號,都需要在英文狀態下敲寫代碼。
  • print的意思是打印,f代表function函數。
  • 注意后面的“;”千萬不要掉了,就像寫文章一樣,句號不可缺少。
#include "stdio.h"
main(){
    printf("MrFlySand-5201314");
}
  • 上面代碼在屏幕上顯示的內容是:MrFlySand-5201314。其它的都是代碼的格式,這是每次敲寫代碼時必備的。
  • 格式:因為第3行的代碼在main的大括號中,所以第3行前面要按Tab,使代碼更加好看,利於閱讀。就是printf前面有四個空格。
  • 老手:有些的學過C語言,發現我大括號的位置和書本上不一樣。因為我認為像我這樣打可以節省屏幕的顯示,並且在更利於翻動。在你寫過上百行代碼就知道這樣做的好處了。

P3轉義字符

  • 在C語言中有一些轉義字符,代碼格式:反斜杠 + 任意字母,如:\n就是換行的意思。你也可以換其它任意字母,可以從a試到z。顯然這么多事,我是不會做的。你要是搞出來了可以加我QQ:2602629646,我看看長啥樣(有的轉義字符有可愛的表情包,學代碼就是要不斷的嘗試,這樣才能進步。
#include "stdio.h"
main(){
    printf("MrFlySand\n5201314");
}

/*
上面代碼在屏幕上顯示的內容是:
MrFlySand
5201314
*/

小練習

  • 練習1:如圖輸出。源碼
  • 練習2:如圖輸出。源碼
  • 練習3:如圖輸出。源碼

P4注釋

  • 在C語言中有注釋,有單行注釋和多行注釋。注釋在代碼中並不會執行。
  • 單行注釋的格式是//,代表這一行並不會執行。多行注釋的格式是/**/,代表兩個星號中的內容並不會執行。
  • 單行注釋代碼如下:
#include "stdio.h"
main(){
    printf("MrFlySand\n");
    //printf("飛沙");
    printf("5201314\n");
}

/*
輸出:
MrFlySand
5201314
*/
  • 多行注釋代碼如下:
#include "stdio.h"
main(){
    /*printf("MrFlySand\n");
    printf("飛沙");*/
    printf("5201314\n");
}

/*
輸出:
5201314
*/

P5輸出常量

  • 輸出格式%d(整型、整數)、%f(浮點型、小數)、%lf
  • 雙引號里面有幾個%,后面就需要幾個數。
  • 逗號打在雙引號的后面,后面的數字用逗號隔開。
#include "stdio.h"
main(){
    printf("%d", 5201314);//%d就是讀取后面的整數,后面有幾個整數就需要幾個%d
    printf("%f\n", 3.14);//%f就是讀取后面的小數,后面有幾個小數就需要幾個%f
    printf("%d %f\n", 5201314, 3.14);//后面的數字用英文逗號隔開,前面也說過
    printf("%d\n", 3.14);//后面是小數,前面是整型。取的只是整數部分,不是四舍五入
        //因為前面有三個`%d`,所以后面必須有三個數。
    printf("%.2lf %.3lf %.3lf\n", 3.1415, 3.1415, 3.1414);//保留2位小數、保留3位小數。都是四舍五入
}

/*
輸出:
5201314 3.140000
5201314 3.140000
3
3.14 1.141

* 注意:有的輸出后面有\n,所以看看輸出

*/

P6常量(考試)

整型常量

  • 十進制常量沒有前綴,由0~9的數字組成。合法的整型常量:520、-521、521L(L代表長整型)。不合法的常量:023、23D
  • 八進制常量以數字0開頭,由0~7的數字組成。合法的八進制常量:0435、012。不合法的八進制常量:123、02A
  • 十六進制整型常量,以0x或0X開頭(0是數字),由數字09、字母AF或a~f組成。合法:0xfff、0x123、0XA1。不合法:5A、0x3H。

實型常量

  • 小數形式:由正負號、0~9的數字和最多一個小數點組成(必須有一個小數點)。小數點前面可以沒有數字,但是不能同時省略。正確寫法如:-1.85、0.125、11.0、.15。
  • 指數形式:由二進制數加上階碼標志e或E以及階碼組成。一般形式:aEn,其中a為十進制數,a是正負整數或小數;n為十進制數,n是正負整數(n為正整數時“+”可以省略),其值為a×10n。例如合法實數:1.23e12(表示1.23×1012)、0.25E-2(表示1.25×102。不合法的實數:e-5、2.7E、6.4e+5.9

P7標識符、變量

  • 標識符:只能由字母、數字、下划線組成,數字不能出現在第一個位置上。並且標識符不能和關鍵字相同。區分大小寫。例如:name和Name是不同的標識符。
    • 標識符:我自己定義的,它可以存放數值。you、sum
    • 關鍵字:如int(用來定義整數)、floatdouble(用來定義小數)

賦值

#include "stdio.h"
main(){
    int you;
    you=520;
    printf("%d\n", you);
    you=1314;
    printf("%d\n", you);
}

/*
定義一個整型變量you,把520給you,you的值就是520。因為x是變量,所以x的值會隨時改變。然后又把1314給you,you的值變成1314。

輸出:
520
1314
*/

例:運算

#include "stdio.h"
main(){
    int x = 520;
    float y = 3.14;

    int sumInt = x + y;
    float sumFloat = x + y;
    printf("%d %f\n%d %.2f", x, y, sumInt, sumFloat);
}

/*
輸出:
520 3.140000
523 523.14
*/

例:數據交換

#include<stdio.h>
main(){
    int m=8,n=15,swap;
    swap=m;//把容器m里面的東西8,給容器swap,容器swap里面也同樣裝有8了。
    m=n;//把容器n中的東西給容器m中,因為n的值是15,所以m的值變成15。
    n=swap;//同上,n變成8
    printf("m=%d,n=%d",m,n);
}

/*
有三個容器m、n、swap

輸出:
m=15,n=8
*/

P8輸入

  • 輸入格式:scanf("%d",&a),只要有scanf就需要&地址符,&一定不要掉。這就是語法格式,沒必要懂。學到后面你就會學這個符號的意思。

例:輸入三個數字並輸出

#include"stido.h"
main(){
    int a, b, c;
    printf("請輸入三個整數:");
    scanf("%d %d %d", &a, &b, &c);//因為abc都是int,所以要用%d
    printf("a=%d b=%d c=%d", a, b, c);
}
/*
輸入:
11 22 33

輸出:
a=11 b=22 c=33
*/
  • scanf("%d %d %d", &a, &b, &c);可以看到%d之間是用空格隔開,所以在輸入時,數字與數字之間也要空格。如果%d之間用逗號隔開,則在輸入時也必須要用逗號隔開。%d之間用的什么符號,輸入時就需要什么符號。格式要保持相同,%d就是讀取后面的數字。
    • scanf("%d,%d,%d", &a, &b, &c);輸入時:1,22,333
    • scanf("a=%d,b=%d,c=%d", &a, &b, &c);輸入時:a=333,b=22,c=1
    • scanf("%d%d%d", &a, &b, &c);%d之間沒有任何東西時。在輸入時,可以用空格、tab、回車對數字進行隔開。如:1 2 3

例:輸入兩個數字,將他們相加、減、乘、除,並輸出各自的值

#include "stdio.h"
main(){
    int x, y, sum;
    scanf("%d %d", &x , &y);
    sum = x + y;
    printf("%d + %d = %d\n", x, y, sum);    
    printf("%d - %d = %d\n", x, y, x - y);
    printf("%d * %d = %d\n", x, y, x * y);
    printf("%d / %d = %d\n", x, y, x / y);
    printf("%d / %d = %f\n", x, y, (float)x / y);    
}

/*
把數字1給x,把數字2給y。因為`sum=x+y`,所以sum的值為3。
輸入:
1 2
輸出:
1 + 2 = 3
1 - 2 = -1
1 * 2 = 2
1 / 2 = 0
1 / 2 = 0.5
*/
  • 可以看到我定義了一個sum意思是“和”。在代碼中標識符有見名之意,及看到sum就知道它是求和。
  • 因為x、y都是整型,所以他們兩個相除,結果也是整型(整數)。那么我們就可以把前面的x或者后面的y變成浮點型(小數),那么它計算的結果就是浮點型。格式float(number),float(520)。
  • 如:2 = 5 / 2前后都是整型,結果為整型;2.5 = 5.0 / 2前面或后面只要有一個是浮點數,結果為浮點數。
    整數 = 整數 / 整數
    小數 = 小數 / 整數
    小數 = 整數 / 小數

例:已知半徑求周長

  • 宏定義:如果某個常量多次被使用,可以用宏定義一個常量,它的值不會發生任何改變。且宏定義要寫在開頭,及在main之前。
  • 格式:#define 大寫的英文名稱 數字,如#define EXPON 2.71828
#include"stdio.h"
#define PI 3.1415926
main(){
    int r = 10;
    float c;//因為pi是小數,所以周長的結果也是小數,定義float會比較好   
    c = 2*PI*r;//周長c 
    printf("周長:%lf,面積:%lf", c ,area);
}

小練習

  1. 練習:輸入三個整數,求出三個整數之積。
#include <stdio.h>
void main() { 
    int a,b,c,x;
	printf("請輸入a,b和c的值");
	scanf("%d%d%d",&a,&b,&c);
	x=a*b*c;
	printf("%d",x);
}
  1. 練習:輸入半徑求圓的周長(C=2πr)和面積(S=πr2),結果保留2位小數。
#include"stdio.h"
#define PI 3.1415926
main(){
    int r;
    float c, area;
    printf("請輸入半徑r:");
    scanf("%d",&r);
    c = 2 * PI * r;
    area = PI * r * r;
    printf("周長:%.2lf,面積:%.2lf", c ,area);
}
  1. 練習:求一個半徑r為3.0的球的體積(V=(4/3)πr3 )和表面積(S=4πr2),並保留2位小數。
#include <stdio.h>
#define PI 3.14159
void main(){
    float r=3.0,v,s;
    v=(4/3)*PI*r*r*r;//錯誤
    s=PI*r*r;
    printf("%.2f\n,%.2f",v,s); 

    v=(4.0/3)*PI*r*r*r;//正確
    s=PI*r*r;
    printf("%.2f\n,%.2f",v,s);   
}
  1. 練習:* 輸入三條邊長,求立方體的總面積和體積。
#include <stdio.h>
int main(void) { 
    int a,b,h;//立方體的三條邊長
    int x,y,z;//立方體的三個面
    int s,v;//面積、體積
    printf("輸入a,b和h的值");
    scanf("%d%d%d",&a,&b,&h);    
    x=a*b;
    y=a*h;
    z=b*h;
    s=2*(x+y+z);
    v=a*b*h;
    printf("總面積:%d,體積:%d", s, v);
}
  1. 練習:已知同學的語文、數學和英語的成績分別是91分、84分和78分,求這位同學3門課程的總分和平均分(並保留2位小數)。
#include <stdio.h>
int main(void){ 
    float a=1,b=2,c=3,sum,average;
    sum=a+b+c;
    average=sum/3;     
   	printf("%.2f,%.2f",sum,average);
	return 0;
}
  1. 練習:一瓶雪碧的價格是3元,輸入買的總瓶數n和客戶給的總錢數 sumMoney。計算出服務員應該找客戶多少錢?輸出:購買n瓶可樂需要x元,找零y元。
#include <stdio.h>
#define PRICE 3
int main(void){ 
    int n,giveMoney,y,sumMoney;
    scanf("%d%d",&n,&giveMoney);
    sumMoney=PRICE*n;
    y=giveMoney-sumMoney;
	printf("購買%d瓶可樂需%dx元,找零%d元。",n,sumMoney,y);
	return 0;
}
  1. 練習:已知三角形的三條邊長分別為a、b、c,求三角形的面積。三角形的面積為area(如下圖) ,s=(a+b+c)/2。
#include <stdio.h>
#include "math.h"
int main(void) { 
    float a,b,c;
    float s,area;
    scanf("%f%f%f",&a,&b,&c);
    s=(a+b+c)/2;
    area=sqrt(s*(s-a)*(s-b)*(s-c));
    printf("%f",area);
}
  1. 練習:輸入一個華氏溫度F,輸出攝氏溫度C,並保留3位小數。 公式為:C=5(F-32)/9
#include<stdio.h>
main(){
    float c,f;
    printf("輸入華氏溫度");
    scanf("%f",&f);
    c=(5.0/9)*(f-32);
    printf("攝氏度=%.3f\n",c);
}

P10數學函數

  • 在使用數學函數時,應該在源文件中使用預編譯命令#include"math.h",就像第二行一樣。
#include"stdio.h"
#include"math.h"
main(){
    int a = 9;
    printf("%f\n", sqrt(a));//開根號 
    printf("%f\n", pow(a, 2));//a^2
    printf("%f\n", rand();//產生 0~1的隨機整數
}
庫函數 功能說明 示例
pow(x,y) 計算 xy 的值 pow(2,5)=32.000000
rand( ) 產生 0~1的隨機整數 rand( )%900+100 生成三位隨機整數
sqrt(x) 求 x 的平方根() sqrt(36)=6.000000
abs(x) 求整數 x 的絕對值 abs(-5)=5
fabs(x) 求實數 x 的絕對值 fabs(-3.14)=3.14
floor(x) 求不大於 x 的最大整數(下舍入) floor(3.14)=3.000000
ceil(x) 求不小於 x 的最小整數(上舍入) ceil(3.14)=4.000000
log(x) 求 x 的自然對數 log(2)=0.693147
exp(x) 求 x 的自然指數(ex) exp(2)=7.389056
  1. 練習:按公式s = 2ab/(a+b)5計算輸出s的值。其中,a和b的值由鍵盤輸入,結果保留2位小數。
#include <stdio.h>
#include <math.h>
int main(void) { 
    float a,b,sum;
    printf("輸入a,b的值");
    scanf("%f%f",&a,&b);   
    sum=2*a*b/pow((a+b,5));
    printf("%.2f",sum);
}

P11除余%

  • 除余的運算的結果:當被除數不夠整除時余下的數.

都是正整數時:

#include "stdio.h"
main(){
 printf("%d\n",7%3);//7÷3=2余1
 printf("%d\n",21%3);//21÷3=7余0
 printf("%d\n",21%10);//21÷10=2余1
 printf("%d\n\n",21%11);//21÷11=1余10
}               

/*              
運行結果:
1
0
1
10
*/              

當有負整數時(了解)

#include "stdio.h"
main(){
 printf("%d\n",-7%3);
 printf("%d\n",-21%3);
 printf("%d\n",-21%10);
 printf("%d\n\n",-21%11);
 
 printf("%d\n",7%-3);
 printf("%d\n",21%-3);
 printf("%d\n",21%-10);
 printf("%d\n\n",21%-11);
 
 printf("%d\n",-7%-3);
 printf("%d\n",-21%-3);
 printf("%d\n",-21%-10);
 printf("%d\n",-21%-11);
}

/*              
運行結果:
-1
0
-1
-10

1
0
1
10

-1
0
-1
-10
*/
  • 通過上面的代碼可以發現:當%號前面是正數時,結果為正數。當%號前面是負數時,結果為負數。

P12%的輸出(了解)

#include "stdio.h"
main(){  
    int x=2;   
    printf("%d\n",x);
    printf("%%d\n",x); 
    printf("$%d\n",x); 
    printf("*%d\n",x); 
    printf("%%%d\n",x); 
    printf("%%%%d\n",x);
    printf("%%%%%d\n",x); 
}  

/*
運行結果:
2
%d
$2
*2
%2
%%d
%%2             
*/
  • 總結:兩個%,輸出一個%。雙引號里面有什么輸出就什么,從左往右執行。%d就是取后面的值。

P13學會用輸出調試代碼

  • printf是一個很好的調試工具,它能幫助你更好的了解這段代碼,查看每個變量的值。

例:輸出各個位數

  • 如果直接給你printf("%d\n", m/10000%10); ,你可能看不懂。那么你可以先看看printf("%d\n", m/10000); 輸出的結果是多少,比如結果是n。再用printf("%d\n", n%10); 再看看結果是什么,並分析里面的原理。當然你也可以把printf("%d\n", n%10); 改成printf("%d\n", n%2); printf("%d\n", n%3); 或者其它任意的數字。學習代碼就是要不斷的嘗試。
#include"stdio.h"
main(){
    int m = 12345;;
    printf("%d %d\n", m, m%10);// 12345/10=1234余5
    printf("%d %d\n", m/10, m/10%10);//
    printf("%d %d\n", m/100, m/100%10);
    printf("%d %d\n", m/1000, m/1000%10);
    printf("%d %d\n", m/10000, m/10000%10); 
}
  1. 練習:輸入分鍾,轉換成n小時n分鍾。如:
    • 輸入 90,輸出 1小時30分鍾
    • 輸入 100,輸出 1小時40分鍾
    • 輸入 200,輸出 3小時20分鍾
#include<stdio.h>
main(){
    int x,min,s;
    printf("輸入分鍾:");
    scanf("%d",&x);
    min=x/60;
    s=x%60;
    printf("轉換后:%d小時,%d分鍾",min,s);
}
  1. 練習:從鍵盤輸入一個3位數,要求對3位數進行拆分,分別輸出個、十、百位,每位數字間空一個空格。如:鍵盤輸入123 ,則輸出“1 2 3”

P14使用編譯器(重點)

  • 可能你看不懂英文,沒事。你只要知道它的錯誤在如一行就行了,如圖:錯誤在3~4行之間。后面的數字是列數,不用管。代碼寫多了,這種錯誤就能一眼看出來,當然如果會英文,也可以參考一下,反正我是看不懂的。

P15復合運算符

  • 5個算術運算符,+-*/% ,可以和賦值運算符“=”結合起來,形成復合賦值運算符:+=-=*=/=%=,注意兩個運算符中間不要有空格
  • 運算方向: 從左往右
    a+=表達式表示a=a+(一整個表達式)
    a+=5;表示a=a+5;
    a+=(b+100)/2;表示a=a+(b+100)/2;
    a*=b+12;表示a=a*(b+12);
    a/=12+6;表示a=a/(12+6);
    x+=3等價於x = x + 3
    x *= y+2 等價於 x = x*(y + 2)
    x %= y等價於x = x % y
  • 其中%除余/模除。除余的結果是除數÷被除數最后余下的數字。可以運行看看下面的代碼。
#include"stdio.h"
main(){
  int a = 11;
  printf("%d\n", a%2);// 11/2=5余1
  printf("%d\n", a%3);// 11/3=3余2
  printf("%d\n", a%4);// 11/4=2...3
  printf("%d\n", a%5);// 11/5=2...1
  printf("%d\n", a%11);// 11/11=1...0
}
  • int x = 3, y = 2;則表達式x += x *= y + 8的值為多少?
    x *= y + 8等價於x = x * (y + 8)

P16自增自減運算符(一元運算符)

  • i++(或i--):表示使用i的值,然后i加1(或減1)
  • ++i(或--i):表示使i的值加1(或減1),然后再使用i。
  • i++++i相當於i=i+1
  • i----i相當於i=i-1
  • 下方代碼i的使用相當於輸出
#include<stdio.h>
void main(){
    int i=10;
    //i=10,i的值先加1后,i的值變為11,輸出i的值是11
    printf("%d\n",++i);
    //i=11,i的值先減1后,i的值變為10,輸出的值是10
    printf("%d\n",--i);
    //i=10,先輸出10,后再加1得到i=11
    printf("%d\n",i++);
    //i=11,先輸出11,后再減1得到i=10
    printf("%d\n",i--);
    //i=10
    printf("%d\n",i);
}

注意:

  1. i++和i--僅適用於變量(整型和實型) ,不能用於常量或表達式。如2++,--(a+b)等都是非法的。
  2. 結合方向:自右向左。例如:-i++,即相當於-(i++)。若a=2,表達式-a++的值為-2,變量a的值變為3。
  3. 自增、自減運算符,無論作為前綴(++a,--a)還是后綴(a++,a--)運算符,對於變量本身來說自增1或自減1都具有相同的效果,但對表達式來說卻有着不同的值。
// 注意第二點,下面是說明第二點的代碼
#include"stdio.h"
main(){
    int a = 2, b;
    b = -a++;
    printf("%d\n",a);// 輸出的是變量a的值。a本來是2,a++后使a的值變大,所以a現在的值為3。
    printf("%d\n",b);// 輸出的是表達式的值。因為a++,++在后面。所以先使用,把-2給b,b的值變成-2,然后a加1.
    // 注意:變量和表達式是兩個不同的東西
}
/*
輸出:
3
-2
*/

P17逗號運算符(考試)

  • (a, a+b, b-c)的最后結果是:b-c
  • 表達式(x = y = 5, x + y, x + 3)的值是8。因為 x = 5, y = 5。所以 x + y = 10, x + 3 = 8 。最后保留最后的一個數。可以自己用編譯器試試看。
  • 逗號運算符(a,b),其計算的是最后的一個值
  • 如:a = (1, 2, 3)其a的最終結果為3
  • 如:a = (1, 2, 3, 4)其a的最終結果為4
  • 如:a = (x = y = 5, x + y, x + 3)其a的最終結果為8,因為x = 5,x + 3的值為9
#include"stdio.h"
main(){
  int x, y;
  int num1, num2;
  num1 = (x = y = 5, x + y, x + 3);
  num2 = (x = y = 3, x + y, x + 3);
  printf("%d %d\n", num1, num2);
}

/*
輸出:
8 6
*/

P18字符變量

  • 字符變量用char定義,格式:char 變量名 = '字符'(注意字符是單引號),如:char letter = 'a'
  • 每個字符在計算機中都有對應的ascii碼,如:字符0的ascii值為48;字符A的ascii值為65;字符a的ascii值為97,可見下圖

例:字符的ASCII碼值

  • %c是讀取一個或者輸出一個字符,%d是讀取一個或者輸出一個整數。
  • 下方a雖然是字符類型,用%c就是輸出它本身,用%d就是取出它的ascii碼值(它是一個整數)。
  • 下方num雖然是整數類型,用%c就是輸出它ascii碼所對應的字符,用%d就是輸出整數。
#include "stdio.h"
void main(){
  char a = '0';
  printf("%c %d", a, a);

  int num = 65;
  printf("%c %d", num, num);
}

/*輸出:
0 48
A 65
*/

例:字符運算

  • 因為字符是有對應的ascii碼值的,所以在運算時,會用該字符所對應的ascii值進行運算
#include "stdio.h"
void main(){
  char a;
  scanf("%c", &a);
  printf("%c %c", a, a+32); 
  printf("%c的ascii是%c", a+32, a+32);
}
/*
輸入:
Z

輸出:
Z z
z的ascii是122

*/
  • 練習1:從鍵盤輸入一個字母,要求輸出大小寫字母及大小寫字母所對應的ASCII碼值。
#include <stdio.h>
int main(void) { 
    char ch;
    ch=getchar();
    if(ch>='a'&&ch<='z'){
         printf("小寫字母:%c\n",ch);
         printf("小寫字母對應ASCII碼:%d\n",ch);
         printf("大寫字母:%c\n",ch-32);
         printf("大寫字母對應的ASCII碼:%d\n",ch-32);
    }else if(ch>='A'&&ch<='Z'){ 
        printf("大寫字母:%c\n",ch);
        printf("大寫字母對應的ASCII碼:%d\n",ch);
        printf("小寫字母:%c\n",ch+32);
	    printf("小寫字母對應的ASCII碼:%d\n",ch+32);
    }else{
        printf("原樣輸出:%c\n",ch);
    }
}

P19 if判斷

  • 格式:if(判斷真假){執行的語句}
  • 當括號里面成立時,執行大括號里面所有代碼。當括號里面不成立時,不會執行大括號里面所有代碼。
#include"stdio.h"
main(){
    if(2 > 1){
        printf("2大於1\n");
    }

    if(2 < 1){
        printf("MrFlySand");
    }
}
/*
輸出:
2大於1
*/

例:找零

  • 一瓶口樂3元,客戶會給你不確定的錢數,計算買一瓶口樂找多少錢?如果客戶給的錢數少於3,則輸出您的票面不夠
#include "stdio.h"
#define PRICE 3
void main(){
    int a;
    scanf("&d", &a);
    if(a >= PRICE){
        printf("找您%d元\n", a - PRICE);
    }else{
      printf("您的票面不夠,此商品的價格為%d", PRICE);
    }
}

P19 if else

  • 格式:if(判斷真假){執行的語句1}else{語句2}
  • 當括號里面成立時,執行大括號中的語句1。當括號里面不成立時,會執行大括號里面的語句2。

例:輸入一個數。輸出較大值

#include<stdio.h>
main()
{
    int a,b;
    scanf("%d%d",&a,&b);
    if(a>b){
        printf("%d較大",a);
    }else{
        printf("%d較大",b);
    }
}

例:判斷一個數是正數還是負數

  • 輸入一個數,當x>0就是正數;當x<0就是負數
#include"stdio.h"
main(){
  int number;
  scanf("%d", &number);
  if(x > 0){
    printf("%d是正數\n", number);
  }else{
    printf("%d是負數\n", number);
  }
}
  • 可以發現輸入0時,輸出的是0是負數。因為x > 0不成立,所以會跳到else。所以我們需要完善代碼,x = 0時,輸出0既不是正數也不是負數
#include"stdio.h"
main(){
  int number;
  scanf("%d", &number);
  if(x > 0){
    printf("%d是正數\n", number);
  }else if(x < 0){
    printf("%d是負數\n", number);
  }else{
    printf("0既不是正數也不是負數");
  }
}

==!=

  • 在C語言中,=表示的是賦值==表示等於!=表示不等於
  • 當表達式正確時,結果為1;當表達式不正確時,結果為0。
    1 == 1,意思就是:1等於1,表達式正確,則結果為1
    1 == 0,意思就是:1等於0,表達式不正確,則結果為0
    1!=1,意思就是:1不等於1,表達式不正確,則結果為0
    1!=0,意思就是:1不等於0,表達式正確,則結果為1
    1!=7,意思就是:1不等於7,表達式正確,則結果為1

例:輸入一個整數。如果能被5整除就輸出這個數,否則輸出這個數的平方。

Example 1:
Input: 5
Output: 5
Reason:5÷5=1余0,在if中成立,所以輸出5

Example 2:
Input: 25
Output: 25
Reason:5÷5=5余0,在if中成立,所以輸出25

Example 3:
Input: 4
Output: 16
Reason:4÷5=0余4,在if中不成立,所以輸出4*4
#include <stdio.h>
void main(){ 
  int x=0;
  printf("請輸入一個整數:");
  scanf("%d",&x);
  if(x%5==0)
    printf("%d\n",x);
  else
    printf("%d\n",x*x); 
}

例:輸入三個數。如果x + y == z則輸出***;如果x + z == y則輸出===,否則輸出+++

#include <stdio.h>
void main(){ 
  int x, y, z; 
  scanf("%d%d%d", &x, &y, &z); 
  if(x + y == z)
    printf("***\n");
  else if(x + z == y)
      printf("===\n");
  else
      printf("+++\n");
}

例:輸入一個數。能被3整除,或能被5整除,則輸出YES,否則輸出NO

  • ||左右兩邊的兩個數字表達式只要有一個為1,結果就為1;如果全為0,結果發才為0。
    • 5 || 3 結果為:1
    • 0 || 3 結果為:1
    • 5 || 0 結果為:1
    • 0 || 0 結果為:0
#include <stdio.h>
void main(){ 
  int x;
  scanf("請輸入一個整數:", &x);
  if(x%3==0 || x%5==0)
    printf("YES");
  else
    printf("NO");  
}

例:輸入一個數。既能被3整除,又能被5整除,則輸出YES,否則輸出NO

方法一:

  • &&左右兩邊的兩個數字表達式都不是0,結果才為1;只要有一個為0,結果就為0。
    • 5 && 3 結果為:1
    • 0 && 3 結果為:0
    • 5 && 0 結果為:0
    • 0 && 0 結果為:0
#include <stdio.h>
void main(){ 
  int x;
  scanf("請輸入一個整數:", &x);
  if(x%3==0 && x%5==0)
    printf("MrFlySand——YES");
  else
    printf("MrFlySand——NO");  
}

方法二:

  • 既能被3整除,又能被5整除的數字有:15、30、45、60。
  • 可以發現它們都是能被15整除的,所以可以直接用x % 15
  • 在計算機中x%3==0是要進行一系列的計算的,同樣x%5==0x%3==0 && x%5==0也都是要進行一系列的計算的。這樣就進行了3次計算。
  • 而下面的方法x%15==0只進行了1次計算,這樣就可以減少電腦運行的時間。
  • 學到后面你將學到更多的算法,敬請期待吧!
#include <stdio.h>
void main(){ 
  int x;
  scanf("請輸入一個整數:", &x);
  if(x%15==0)
    printf("YES");
  else
    printf("NO");  
}

例:輸入一個年份,判斷其是否為閏年?

  • 閏年:能被4整除但是不能被100整除或者能被400整除
#include"stdio.h"
main(){
  int year = 2021;
  if(year%4==0 && year%100!=0 || year%400==0){
    printf("%d是閏年\n", year);
  }else{
    printf("%d不是閏年\n", year);
  }
}

if后面的大括號

  • 注意if后面的大括號。沒有大括號時,只會執行if之后的一條語句,雖然x>0不成立,但依舊會輸出520,因為它不歸if管。當if后面有大括號時,大括號里面的代碼都屬於if,只有在if括號里面成立的時候,if后面的大括號里面的內容才會執行。
#include <stdio.h>
int main(){
    int x=-1;
    if(x>0)
        printf("MrFlySand");
    printf("520");
    
    int y=-1;
    if(y>0){
        printf("y_MrFlySand");
        printf("y_520");
    }
}

/*
運行結果:
520
*/
  • 運行下面的代碼編譯器會報錯。因為printf("123")屬於if,而printf("456")是單獨一條語句。else上面沒有if,所以會報錯。
#include <stdio.h>
int main(){
    int x=-1;
    if(x>0)
        printf("123");
        printf("456");
    else
        printf("789");
}
  • 修改后的代碼
#include <stdio.h>
int main(){
    int x=-1;
    if(x>0){
        printf("123");
        printf("456");
    }else
        printf("789");
}

小練習

  1. 練習:輸入一個數,判斷x是奇數還是偶數?
#include <stdio.h>
int main(void) { 
    int a;
    scanf("%d",&a);
    if(a%2==0)
      printf("a為偶數");
    else
      printf("a為奇數");
}
  1. 練習:輸入一個成績x。當x >= 90輸出優秀;當x >= 80輸出優;當x >= 70輸出良;當x >= 60輸出及格;當x < 60輸出不及格。
#include <stdio.h>
int main(void) { 
    int grade;
    scanf("%d",&grade);
    if(grade>=90)
        printf("優秀");        
    else if(grade>=80)
        printf("優");
    else if(grade>=70)          
        printf("良");
    else if(grade>=60)
        printf("及格");
    else 
        printf("不及格");
}
  1. 練習:求兩個大於0的數的倒數之和。當輸入的數小於等於0時(分母不為0),輸出error。
Example 1:
Input: 2 5
Output: 0.7
Reason:1/2 +1/5 =0.5 + 0.2 = 0.7

Example 2:
Input: 2 4
Output: 0.75
Reason:1/2 +1/4 =0.5 + 0.25 = 0.75

Example 3:
Input: 0 4
Output: error!
Reason:0<=0不符合規范
#include<stdio.h>
void main(){
    int m,n;
    float s;    
    printf("請輸入m和n的值:");
    scanf("%d%d", &m, &n);
    if(m>0 && n> 0){ 
        s = 1.0/m+1.0/n;
        printf ("倒數之和為%f\n",s);
    }
    else
        printf("error!\n");
}
  1. 練習:輸入一個3位數,判斷其是否為水仙花數。水仙花數條件:一個3位數,它的各位數字立方之和等於它本身,這個數就是水仙花數。
#include <stdio.h>
int main(void) { 
  int x,a,b,c;
  scanf("%d",&x);
  a=x%10;
  b=x%100/10;
  c=x/100;
  printf("%d,%d,%d\n",a,b,c);// 用輸出看看a、b、c的值分別對不對
  if(x>=100){
    if( x == a*a*a + b*b*b + c*c*c)
      printf("x為水仙花數");
    else
      printf("x不是水仙花數");
  }
  else 
  	printf("輸入錯誤");
	return 0;
}
  1. 練習:輸入一個數,判斷它是否是對等數。對等數條件:一個3位數,其各位數字的和與各位數字的積等於該數本身,如144=(1+4+4)*(1*4*4)。
#include <stdio.h>
int main(void) { 
    int x,a,b,c;
    scanf("%d",&x);
    a=x%10;
    b=x/10%10;
    c=x/100;
    if(x>=100){
        if(x == (a+b+c) * (a*b*c))
            printf("x為對等數");
        else
            printf("x不是對等數");
    }
    else 
        printf("輸入錯誤");
  return 0;
}
  1. 練習:鍵盤任意輸入一個字符,判斷其是否為小寫字母,如果是,輸出對應的大寫字母,否則原樣輸出。
    • a~z之間是小寫字母,可以用一個變量和字符a、z比較,也可以用字符a、z的ascii碼比較。
#include <stdio.h>  
int main(){
    char a;
    a=getchar();
    if(a>='a' && a<='z') 
        a += 32;
    putchar(a);
}
  1. 練習:某品牌服飾換季打折,折扣力度為:銷售額為300元以下9折,銷售額為300~500元8折,銷售額500元以上7折。編寫程序,要求由鍵盤輸入銷售額求打折后的銷售金額。
#include <stdio.h>
main(){
    float a,b;
    scanf("%f", &a);
    if(a<300)
        b=0.9;
    else if(a>=300 && a<=500)
        b=0.8;
    else
        b=0.7;    
    printf("%f",a*b);	
}
  1. 練習:輸入一個5位的正整數,判斷它是不是回文數。(例如:12321是回文數,個位與萬位相同,十位與千位相同)
#include <stdio.h>
int main(void) { 
    int x,a,b,c,d;
    a=x%10;
    b=x%100/10;
    c=x%1000/100;
    d=x/10000;
    if(x>=10000){
        if(a==d && b==c)
          printf("x為回文數");
        else
          printf("x不是回文數");
    }
    else
	     printf("輸入錯誤");
}
  1. 練習:從鍵盤輸入一個三位數的正整數,其個位與百位上的數字相加的和的個位數字等於十位上的數字則輸出“Yes”,否則輸出“No”。( 例如:輸入“176”,則輸出“Yes”;輸入“258”則輸出“No”)
    • 分析:程序中分別用g,s,b代表輸入數的個位,十位,百位,然后執行if語句判斷,輸出“Yes”或“No”
#include "stdio.h"
int main(){
	int x,g,s,b;
	scanf("%d",&x);
	g=x%10;
	s=x%100/10;
	b=x/100;
	if(x>=100){
		if(s==g+b)
			printf("yes");
		else
		    printf("no");
	}
	else
		printf("輸入錯誤");
	return 0;
}
  1. 練習:鍵盤輸入一個數值,如果該數值為兩位數,輸出兩位數個位與十位的和,如果不是兩位數則輸出error。如:輸入23,輸出2+3的和5。
#include <stdio.h>
int main(void) { 
    int x;
    scanf("%d",&x);
    if(x>=10 && x<=99){
        printf("%d",x%10 + x/10);
    }
    else
	printf("error");
    return 0;
}
  1. 練習:從鍵盤輸入一個值,如果是字母出其對應的ASCII碼值,否則原樣輸出。提示:判斷輸入的值是否為字母。
Example 1:
Input: a
Output: 65
Reason:a是字母,a的ascii是65

Example 2:
Input: 1
Output: 1
Reason:不是字母原樣輸出(注意不要是中文字符)

Example 3:
Input: 1
Output: 
Reason:1不是字母
#include <stdio.h>
int main(void) { 
    char ch;
    scanf("%c", &ch);
    if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
        printf("輸入對應的ASCII碼:%d",ch);
    else
        printf("%c",ch);
    return 0;
}
  1. 練習:計算三角形面積。功能:輸入三角形的三邊a,b,c,判斷a,b,c能否構成三角形,若能,計算面積。
#include<stdio.h>
#include<math.h>
  void main(){  
  float  a,b,c,area;
  double s;
  printf("Please enter three sides of a triangle:\n");
  scanf("%f%f%f",&a,&b,&c);      
  if(a+b<c||b+c<a||a+c<b){    
    printf("輸入的三邊不是三角形\n");
  }else{
    s=(a+b+c)/2.0;  
    area=sqrt(s*(s-a)*(s-b)*(s-c));
    printf("The area of the triangle is:%f\n",area);
  }
}
/*解釋說明:
如上代碼:我把area求解公式放在if里面,當輸入的三邊不符合條件時,就不用多做計算。
而下面的代碼,即使輸入的三邊不是三角形,但還是會額外做多余的計算,計算機的運行時間就更長。
*/
#include<stdio.h>
#include<math.h>
  void main(){  
  float  a,b,c,area;
  double s;
  printf("Please enter three sides of a triangle:\n");
  scanf("%f%f%f",&a,&b,&c);   
  s=(a+b+c)/2.0;  
  area=sqrt(s*(s-a)*(s-b)*(s-c));   
  if(a+b<c||b+c<a||a+c<b){    
    printf("輸入的三邊不是三角形\n");
  }else{
    printf("The area of the triangle is:%f\n",area);
  }
}
  1. 練習:解一元二次方程
  • 求一元二次方程ax2+bx+c=0的實根或輸出沒有實根的提示信息(設a!=0)。
  • disc=b2-4ac.
  • disc>0有兩個不同的根
  • disc=0有兩個相同的根
  • disc<0沒有根
#include"stdio.h"
#include"math.h"
main(){
  float a,b,c;
  float disc, x, y;
  scanf("%f%f%f",&a,&b,&c);
  disc = b*b-4*a*c;
  if(disc > 0){
    x = (-b+sqrt(disc)) / (2*a);
    y = (-b-sqrt(disc)) / (2*a);    
  }else if(disc == 0){
    y = x = (-b+sqrt(disc)) / (2*a);
  }else{
    printf("error");
  }
  printf("%f %f",x,y);
}
  1. 練習:判斷水仙花數。水仙花數:一個三位數,個位的立方 + 十位的立方 + 百位的立方 = 三位數本身。
#include<stdio.h>
#include"math.h"
int main()
{
    int a,g,s,b;
    scanf("%d",&a);
    g=a%10;
    s=a/10%10;
    b=a/100%10;
    if(pow(g,3)+pow(s,3)+pow(b,3)==a){
        printf("%d是水仙花數",a);
    }else{
        printf("%d不是水仙花數",a);
    }
}
  1. 練習:編寫程序,根據輸入的數字輸出相應的字符串。無償獻血對於敏血者有一定要求①年齡:18--55周歲②體重:男>=50千克,女>=45千克。判斷是否滿足獻血要求。由鍵盤輸入年齡、性別(1代表男,2代表女)和體重,判斷輸出獻血着是否滿足獻血要求。
#include<stdio.h>
main(){
    int a,b;
    float c;
    printf("請輸入年齡:");
    scanf("%d",&a);
    if(18<=a && a<=55){//18--55周歲
        printf("請輸入性別(1代表男,0代表女)");
        scanf("%d",&b);
        printf("請輸入體重:");
        scanf("%f",&c);
        if(b==1){//1代表男,0代表女
            if(c>=50)//男生體重大於50
                printf("滿足獻血條件");  
            else
                printf("不滿足獻血條件");  
        }else{
            if(c>=45)//女生體重大於45
                printf("滿足獻血條件"); 
            else
                printf("不滿足獻血條件");
        }            
    }else{
       printf("不符合獻血要求");
    }
}
  1. 練習:輸入一個字符,請判斷該字符是字母、數字還是特殊字符。
    提示:字母有a ~ z和A ~ Z;數字有0 ~ 9;其它是特殊字符
#include <stdio.h>
int main(void) { 
    char ch;
    scanf("%c",&ch);
    if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){
        printf("%c為字母",ch);        
    } else if(ch>='0'&&ch<='9'){
        printf("%c為數字",ch);
    } else{
        printf("%c為特殊字符",ch);
    }
}

P20 switch語句

  • switch(n)中的n為1時,則會輸出AB。因為n為1時,則會跳到case 1:並會執行冒號(:)之后 的代碼,執行完之后就會跳到case 2:。當case后面的數字都不和n相等時就會直接執defaule后面的句子,當然也可以不寫defaule。
  • 注意:case和數字之間要有空格,否則就是錯誤的。如case1就是錯誤的。

break

  • n=1時,會執行case 1,並輸出MrFlySand_1飛沙_1,因為沒有break,所以會跳到case 2,並輸出MrFlySand_1飛沙_1,因為有break,所以switch執行完成。
  • n=2時,會執行case 2,並輸出MrFlySand_2飛沙_2,因為有break,所以switch執行完成。
  • n=5時,會執行default,並輸出error,因為case后面都沒有5,所以switch執行完成。
#include<stdio.h>
main(){
    int n;
    scanf("%d",&n);
    switch(n){
    case 1:
        printf("MrFlySand_1");
        printf("飛沙_1");
    case 2:
        printf("MrFlySand_2");
        printf("飛沙_2");
        break;
    case 3:
        printf("MrFlySand_3");
        printf("飛沙_3");        
    default:
        printf("error");
    }
    return 0;
}

例:輸入數字1 ~ 7,輸出對應的英文日期,如果不是1 ~ 7,則輸出error。如:輸入1,輸出Monday

#include<stdio.h>
main(){
    int n;
    scanf("%d",&n);
    switch(n){
    case 1:
        printf("Monday");
        break;
    case 2:
        printf("Tuesday");
        break;
    case 3:
        printf("Wednesday");
        break;
    case 4:
        printf("Thursday");
        break;
    case 5:
        printf("Friday");
        break;
    case 6:
        printf("Saturday");
        break;
    case 7:
        printf("Sunday");
        break;
    default:
        printf("error");
    }
    return 0;
}

小練習

  1. 練習輸入數字,輸出對應的字符串。
輸入的數字 輸出的字符串
1 冠軍
2 亞軍
3 季軍
其他 error
#include <stdio.h>
main() { 
    int x;
    scanf("%d",&x);
    switch(x){
        case 1 :printf("冠軍");break;
        case 2 :printf("亞軍");break;
        case 3 :printf("季軍");break;
        default :printf("輸入錯誤")
    }
}
  1. 練習:計算器程序:用戶輸入運算數和四則運算符,輸出計算結果。分析:switch語句用於判斷運算符,然后根據所對應的運算符計算兩數的運算值。運算符不是+,-,* ,/時則給出出錯提示。
Example 1:
Input: 5+3
Output: 5+3=8
Reason:5和3都是數字,'+'是字符

Example 2:
Input: 5*3
Output: 5×3=15
Reason:5和3都是數字,'*'是字符

Example 3:
Input: 15/3
Output: 15÷3=5
Reason:5和3都是數字,'/'是字符


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM