• ​​C语言教程(下)​​

P0前言


  • 代码有些可能运行不了,都是我直接敲写,没有运行。
  • 坚持下去,有的代码真的好玩。下面是我自己写的。​​表白代码​​​-​​孤寡青蛙​​-希望你能用到左边的代码,而不是右边的代码????。
  • 最好不要手写代码

    1. 及时反馈:你的任何程序错误,编译器会马上给你指出。而书本不会
    2. 改正错误:随随便便一个代码就是50行,你写错一个地方,在书本上很难改。特别是你的算法错误,把这一块代码移动到别处?
    3. 50行代码占几面纸啊!就挺浪费的。
    4. 本来就难,还没点反馈,都看不到自己写出来的是什么,真的容易劝退。
    5. 先用编译器,再写在本子上。一个错误,全部重写。

  • 不要记代码,多敲代码,编译器会及时反馈你的错误,是学习编程最好的方法。文章中会有一些不实用的东西,但考试就会考它,我会标注考试和老手。对于不用考试的了解一下就行,有的确实难,我也不太会,不懂也没关系。
  • 编译器:​​dooccn网页版编译器​​​-​​jsrun网页版编译器​​​-​​Dotcpp在线编译​​​-​​C语言教学视频​​​-​​编译器安卓版​​​-​​电脑编译器​​​-​​笔记​​​-​​练习​

P1概念(考试)

C语言教程(上)_ascii码


  • 算法的特征:有穷性、确定性、可行性、零个或多个输入、至少一个或多个输出。
  • 程序的结构:顺序结构、分支结构、循环结构。

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。显然这么多事,我是不会做的。
#include "stdio.h"
main(){
printf("MrFlySand\n5201314");
}

/*
上面代码在屏幕上显示的内容是:
MrFlySand
5201314
*/

小练习

C语言教程(上)_ascii码_02

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
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。
    C语言教程(上)_ascii码_05

#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使用编译器(重点)

C语言教程(上)_ascii码_06


  • 可能你看不懂英文,没事。你只要知道它的错误在如一行就行了,如图:错误在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

}

注意:


  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,可见下图
    C语言教程(上)_#include_07

例:字符的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==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");
}

小练习


  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没有根
    C语言教程(上)_#include_08

#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){
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("不满足献血条件");
}
}
}


  1. ​练习​​:输入一个字符,请判断该字符是字母、数字还是特殊字符。
  2. 提示:字母有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​​​就是错误的。
    C语言教程(上)_C语言_09

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都是数字,'/'是字符




❤️本文来自作者:MrFlySand

C语言教程(上)_C语言_10