P0前言
- 代碼有些可能運行不了,都是我直接敲寫,沒有運行。如果結果不對聯系QQ:2602629646
- 堅持下去,有的代碼真的好玩。下面是我自己寫的。表白代碼-孤寡青蛙-希望你能用到左邊的代碼,而不是右邊的代碼🐶。
- 最好不要手寫代碼:
- 及時反饋:你的任何程序錯誤,編譯器會馬上給你指出。而書本不會
- 改正錯誤:隨隨便便一個代碼就是50行,你寫錯一個地方,在書本上很難改。特別是你的算法錯誤,把這一塊代碼移動到別處?
- 50行代碼占幾面紙啊!就挺浪費的。
- 本來就難,還沒點反饋,都看不到自己寫出來的是什么,真的容易勸退。
- 先用編譯器,再寫在本子上。一個錯誤,全部重寫。
- 不要記代碼,多敲代碼,編譯器會及時反饋你的錯誤,是學習編程最好的方法。文章中會有一些不實用的東西,但考試就會考它,我會標注考試和老手。對於不用考試的了解一下就行,有的確實難,我也不太會,不懂也沒關系。
- 編譯器: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
*/
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
(用來定義整數)、float
和double
(用來定義小數)
賦值
#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
520 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,333scanf("a=%d,b=%d,c=%d", &a, &b, &c);
輸入時:a=333,b=22,c=1scanf("%d%d%d", &a, &b, &c);
當%d
之間沒有任何東西時。在輸入時,可以用空格、tab、回車對數字進行隔開。
例:輸入兩個數字,將他們相加、減、乘、除,並輸出各自的值
#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);
}
#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);
}
- 練習:求一個半徑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);
}
-
練習:按公式s = 2ab/(a+b)2計算輸出s的值。其中,a和b的值由鍵盤輸入,結果保留2位小數。
-
練習:一瓶雪碧的價格是3元,輸入買的總瓶數。計算出這些總瓶數的總價錢,輸出:購買n瓶可樂需要x元。
-
練習:一瓶雪碧的價格是3元,輸入買的總瓶數和客戶給的總錢數。計算出服務員應該找客戶多少錢?
-
練習:已知三角形的三條邊長分別為a、b、c,求三角形的面積。三角形的面積為area(如下圖) ,s=(a+b+c)/2。
-
練習:按公式s=2ab/(a+b)2,計算並輸出s的值。其中,a和b的值由鍵盤輸人,結果保留兩位小數。當從鍵盤輸入2賦給變量a,3賦給變量b時,s的值為多少?
-
練習:輸入一個華氏溫度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);
}
#include <stdio.h>
main(){
int v,l,w,h;
int s1,s2,s3,s;
printf("input length,width and height: ");
scanf("%d%d%d",&l,&w,&h);
v=a*b*c;//長方體的體積=長*寬*高
s1=a*b;//求單個長方體的面積
s2=b*c;
s3=a*c;
s=s1+s2+s3;
printf("v=%d,s1=%d,s2=%d,s3=%d,s=%d\n",v,s1,s2,s3,s);
}
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 |
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);
}
- 練習:輸入分鍾,轉換成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);
}
P14使用編譯器(重點)
- 可能你看不懂英文,沒事。你只要知道它的錯誤在如一行就行了,如圖:錯誤在3~4行之間。后面的數字是列數,不用管。代碼寫多了,這種錯誤就能一眼看出來,當然如果會英文,也可以參考一下,反正我是看不懂的。
P15復合運算符
- 5個算術運算符,
+
、-
、*
、/
、%
,可以和賦值運算符“=”結合起來,形成復合賦值運算符:+=
、-=
、*=
、/=
、%=
,注意兩個運算符中間不要有空格 - 運算方向: 從左往右
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=51
printf("%d\n", a%3);// 11/3=5...1
printf("%d\n", a%4);// 11/4=5...1
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。
#include<stdio.h>
void main(){
int i=10;
printf("%d\n",++i);//i的值先加1后輸出i的值11
printf("%d\n"--i);//i的值先減1后輸出的值10
printf("%d\n",i++);//i的值10先輸出后再加1得11
printf("%d\n",i--);//i的值11先輸出后再減1得10
}
注意:
- i++和i--僅適用於變量(整型和實型) ,不能用於常量或表達式。如2++,--(a+b)等都是非法的。
- 結合方向:自右向左。例如:-i++,即相當於-(i++)。若a=2,
表達式-a++
的值為-2,變量a
的值變為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碼值。
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既不是正數也不是負數");
}
}
例:輸入一個整數。如果能被5整除就輸出這個數,否則輸出這個數的平方。
#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);
}
/*
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
例:輸入三個數。如果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
結果為:10 || 3
結果為:15 || 0
結果為:10 || 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
結果為:10 && 3
結果為:05 && 0
結果為:00 && 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==0
和x%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");
}
- 練習:輸入一個數,判斷x是奇數還是偶數?
- 練習:輸入一個成績x。當
x >= 90
輸出優秀;當x >= 80
輸出優;當x >= 70
輸出良;當x >= 60
輸出及格;當x < 60
輸出不及格。 - 練習:求一元二次方程ax2+bx+c=0的實根或輸出沒有實根的提示信息(設a!=0)。
- 練習:輸入一個3位數,判斷其是否為水仙花數。水仙花數條件:一個3位數,它的各位數字立方之和等於它本身,這個數就是水仙花數。
- 練習:鍵盤輸入一個3位數,要求對3位數進行拆分,分別輸出個、十、百位,每位數字間空一個空格。如鍵盤輸入123 ,則輸出“1 2 3”
- 練習:輸入一個數,判斷它是否是對等數。對等數條件:一個3位數,其各位數字的和與各位數字的積等於該數本身,如
144=(1+4+4)*(1*4*4)。
- 練習:鍵盤任意輸入一個字符,判斷其是否為小寫字母,如果是,輸出對應的大寫字母,否則原樣輸出。
- 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);
}
- 練習:某品牌服飾換季打折,折扣力度為:銷售額為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);
}
- 練習:輸入一個5位的正整數,判斷它是不是回文數。(例如:12321是回文數,個位與萬位相同,十位與千位相同)
- 練習:從鍵盤輸入一個三位數的正整數,其個位與百位上的數字相加的和的個位數字等於十位上的數字則輸出“Yes”,否則輸出“No”。( 例如:輸入“176”,則輸出“Yes”;輸入“258”則輸出“No”)
- 分析:程序中分別用g,s,b代表輸入數的個位,十位,百位,然后執行if語4輸出“Yes”,否則輸出“No”
- 練習:鍵盤輸入一個數值,如果該數值為兩位數,輸出兩位數個位與十位的和,否則不輸出。例如:輸入23,輸出2+3的和5。
- 練習:從鍵盤輸入一個值,如果是字母出其對應的ASCII碼值,否則原樣輸出。提示:判斷輸入的值是否為字母的條件
- 練習:計算三角形面積。功能:輸入三角形的三邊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);
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("They can't form a triangle.\n");
else
printf("The area of the triangle is:%f\n",area);
}
- 練習:解一元二次方程
- 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);
}
- 練習:判斷水仙花數。水仙花數:一個三位數,個位的立方 + 十位的立方 + 百位的立方 = 三位數本身。
#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%18;
if(pow(g,3)+pow(s,3)+pow(b,3)==a){
printf("%d是水仙花數",a);
}else{
printf("%d不是水仙花數",a);
}
}
- 練習:輸入一個學生的生日(年:y0、月:m0、日:d0),並輸入當前日期(年:y1、月:m1、日:d1)。求出該學生的年齡(實足年齡)。
- 程序分析:年齡=現在的日期-過去的日期,並且
m0 < m1
才能算一整年。還要注意月份可能相同,但天數不相同。
2000.09.20和2000.12.20有19歲(月份沒到)
2000.12.30和2020.12.20有19歲(月份到了,天數沒到)
2000.12.20和2020.10.10有20歲(月份過了)
2000.12.20和2020.12.30有20歲(月份相同,天數過了)
#include <stdio.h>
main(){
int age,y0,y1,m0,m1,d0,d1;
printf("輸入生日日期(年,月,日)");
scanf("%d,%d,%d",&y0,&m0,&d0);
printf("輸入當前日期(年,月,日)");
scanf("%d,%d,%d",&y1,&m1,&d1);
age=y1-y0;
if(m0>m1) age--;
if((m0==m1) && (d0>d1)){
age--;
}
printf("age=%3d",age);
}
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;
}
例:年月日
- 輸入某年某月某日,判斷這一天是這一年的第幾天?
#include <stdio.h>
main(){
int day,month,year,sum;
printf("\nplease input year,month,day\n");
scanf("%d%d%d",&year,&month,&day);
switch(month){
case 1:sum=0;break;
case 2:sum=31;break;//1月已經過去,共31天
case 3:sum=59;break;//2月28天,共59天
case 4:sum=90;break;//3月31天,共90天
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("data error");break;
}
sum=sum+day;//月份所得的天數+天數
if(year%4==0 && year%100!=0 || year%400==0){//判斷是否為閏年
if(month>2)//如果是2月12日不用加閏年29天,只能過了2月才能有閏年的問題
++sum;
}
printf("it is the %dth day.",sum);
}
例:
#include <stdio.h>
int main(){
int m;
scanf("%d", &m);
if(m<=0){
printf("請重新運行輸入");
return 0;
}
switch(m/250){
case 0: printf("0-250");break;
case 1: printf("250-500");break;
case 2:
case 3: printf("500-1000");break;
case 4:
case 5:
case 6:
case 7:
case 8: printf("1000-2000");break;
default: printf("2000以上");
}
return 0;
}
- 練習輸入數字,輸出對應的字符串。
輸入的數字 | 輸出的字符串 |
---|---|
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("輸入錯誤")
}
}
- 練習:計算器程序:用戶輸入運算數和四則運算符,輸出計算結果。分析:switch語句用於判斷運算符,然后根據所對應的運算符計算兩數的運算值。運算符不是
+,-,* ,/
時則給出出錯提示。- [分析]輸入的是數字(可能是小數float)、字符(char)、數字。用
switch
來判斷字符的運算符號。 - 如
switch(a=getchar())
,case '+':
。如果a='+'
,則執行case '+':
后面的代碼
- [分析]輸入的是數字(可能是小數float)、字符(char)、數字。用
- 練習: 要求輸入某年某月某日后判斷這一天是這一年的第幾天。
- [分析]以3月5日為例,應先把前2個月的天數加起來,再加上5天;若是閏年且月份大於2時,則要多加1天。
- [分析]switch對輸入月份m進行判斷,若是1,3,5,7,8,10,12則d=31;若是4,6,9,11則d=30;若是2則執行if語句中的表達式,為真是d=29,否則d=28 ;若m是其他數字,則輸出出錯信息。最后輸出d的值。
- 請不要照抄前面的代碼
- 練習:編寫程序,根據輸入的數字輸出相應的字符串。無償獻血對於敏血者有一定要求①年齡:18--55周歲②體重:男>=50千克,女>=45千克。判斷是否滿足獻血要求。由鍵盤輸入年齡、性別(1代表男,2代表女)和體重,判斷輸出獻血着是否滿足獻血要求。
#include<stdio.h>
main(){
int a,b;
float c;
printf("請輸入年齡:");
scanf("%d",&a);
if(18<=a && a<=55){
printf("請輸入性別(1代表男,0代表女)");
scanf("%d",&b);
printf("請輸入體重:");
scanf("%f",&c);
if(b==1){
if(c>=50)
printf("滿足獻血條件");
else
printf("不滿足獻血條件");
}else{
if(c>=45)
printf("滿足獻血條件");
else
printf("不滿足獻血條件");
}
}
}
- 練習:求任意給兩個日期(Y0年M0月DO日和Y1年M1月D1日)相差的天數。函數再用
#include <stdio.h>
#include <stdlib.h>
int f(int y){
return(y%4==0&&y%100!=0||y%400==0); /*閏年1,平年0*/
}
int mday(int y,int m){
return(31-((m==4)+(m==6)+(m==9)+(m==11))-(3-f(y))*(m==2));/*這個月有幾天*/
}
int yday(int y,int m,int d) {/*這一年過了多少天*/
return(d+31*((m>1)+(m>3)+(m>5)+(m>7)+(m>8)+(m>10))+30*((m>4)+(m>6)+(m>9)+(m>11))+(28+f(y))*(m>2));
}
int yend(int y,int m,int d){/*這一年剩下多少天*/
return(365+f(y)-yday(y,m,d));
}
main(){
int y1,m1,d1;//過去的日期
int y2,m2,d2;//現在的日期
int n,i;
printf("y1,m1,d1=");
scanf("%d,%d,%d",&y1,&m1,&d1);//輸入第一個的日期
if(m1<1 || m1>12 || d1<1 || d1>mday(y1,m1)) //不在規定日期范圍內
exit(0);
printf("y2,m2,d2=");
scanf("%d,%d,%d",&y2,&m2,&d2);//輸入第二個的日期
if(m1<1 || m1>12 || d1<1 || d1>mday(y2,m2)) //不在規定日期范圍內
exit(0);
if(y1>y2 || y1==y2 && m1>m2 || y1==y2 && m1==m2 && d1>d2){
//y1如果大於y2,則用y1表示過去的時間
n=y1;y1=y2;y2=n;
n=m1;m1=m2;m2=n;
n=d1;d1=d2;d2=n;
}else{
n=yend(y1,m1,d1)/*計算以前剩下的天數*/ + yday(y2,m2,d2);/*計算現在過了多少天*/
for(i=y1+1;i<y2;i++)//計算相差多少年
n+=365+f(i);
}
printf("%d.%d.%d--->%d.%d.%d:n=%d\n",y1,m1,d1,y2,m2,d2,n);//n是相差的天數
}