一.运算符
1.算数运算符
| + | - | * | / | % |
|---|---|---|---|---|
| 加 | 减 | 乘 | 除 | 取余数 |
除法的运算结果和运算对线的数据类型有关,两个数如果都是int,则商也是int(若商有小数部分,则小数部分被截取),被除数和除数中,只要有一个或者两个都是浮点型数据,则商也是浮点型,不截取小数部分 如:16/5 ==3
16/5.0 ==3.20000
3/5 ==0
-13/4 ==-4
取余的运算对线必须是整数,结果是整除后的余数,其余数的符号与被除数相同 如:13%3 == 1
13%-3 == 1
-13%3 == -1
2.关系运算符
| < | >= | <= | != | == | |
|---|---|---|---|---|---|
| 大于 | 大于等于 | 小于 | 小于等于 | 不等于 | 等于 |
3.逻辑运算符
| ! | && | |
|---|---|---|
| 非 | 并且 | 或 |
真用1表示,假用0表示,若&&左边的表达式如果为假,右边的表达式不执行;无论左边表达式真假||两边的表达式都会执行
“||”表示“或”
4.赋值运算符
| = | += | *= | /= | -= |
|---|---|---|---|---|
| 如 a=3 | a=a+3 | a=a*3 | a=a/3 | a=a-3 |
5.自增自减
分类
前自增:++i
后自增:i++
前自增和后自增的相同:最终都使i的值加1
前自增和后自增的不同:前自增整体表达式的值是i加1之后的值,后自增整体表达式的值是i加1之前的值
# include <stdio.h>
int main()
{
int i;
int j;
int k;
int m;
i = j = 3;
k = i++;
m = ++j;
printf("i = %d, j = %d, k = %d, m = %d\n", i, j, k, m);
return 0;
}
前自减:--i
后自减:i--
前自减和后自减同理
6.三目运算符
A ? B:C
等价于
if(A)
B;
else
C;
如下
# include <stdio.h>
int main()
{
int i;
i = (3>2 ? 5 : 1);
printf("%d\n",i);
return 0;
}
7.运算符优先级别
算术>关系>逻辑>赋值
二.流程控制
顺序
选择
定义:某些代码可能执行,也可能不执行,有选择的执行某些代码
分类:
-
if语句
-
switch语句
1.if else语句
1.if最简单的用法
# include <stdio.h>
int main(void)
{
if (3 > 2)
printf("AAAA\n");
if (0)
printf("BBBB\n");
if (0 == 0)
printf("CCCC\n");
return 0;
}
只会输出AAAA和CCCC,原因如下
格式:
if(表达式)
语句
功能:
如果表达式为真,执行语句
如果表达式为假,不执行语句
2.if的范围问题
if默认的只能控制一个语句的执行或者不执行 if(表达式)
语句A
语句B
if只能控制语句A是执行与否,语句B不受控制,所以语句B一定执行
if(表达式)
{
语句A
语句B
}
此时if可以控制语句A和语句B的执行
3.if...else的用法
# include <stdio.h>
int main(void)
{
int i, j;
scanf("%d %d", &i, &j);
if (i > j)
printf("i大于j\n");
else
printf("i小于j\n");
return 0;
}
4.if...else if...else的用法
# include <stdio.h>
int main(void)
{
double delta = 3;
if (delta > 0)
printf("有两个解!\n");
else if (delta == 0)
printf("有一个唯一解!\n");
else
printf("无解!\n");
return 0;
}
格式:
if (1)
printf("A!\n");
else if (2)
printf("B\n");
else if (3)
printf("C\n");
else
printf("D");
5.c语言对真假的处理
非0是真 0是假 假用0表示,真用1表示
6.if举例--求分数的等级
# include <stdio.h>
int main(void)
{
float score;
printf("请输入您的考试成绩: ");
scanf("%f", &score);
if (score > 100)
printf("这是做梦!\n");
else if (score)
return 0;
}
例子一:互换两个数字
# include <stdio.h>
int main(void)
{
int i = 3;
int j = 4;
int t;
t = i;
i = j;
j = t;
printf("i = %d, j = %d\n", i, j);
return 0;
}
例子二:对任意三个数字进行排序
# include <stdio.h>
int main(void)
{
int a, b, c;
int t;
printf("请输入三个整数(中间用空格隔开):");
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{
t = a;
a = b;
b = t;
}
if (a < c)
{
t = a;
a = c;
c = t;
}
if (b < c)
{
t = b;
b = c;
c = t;
}
printf("%d %d %d\n", a, b, c);
return 0;
}
7.if的常见问题解析
空语句: if (a < c);等价于 if (a < c)和;
如果if语句1执行那么else if语句2不会再执行
else if接(表达式)或者else接结果
2.for语句
1.为什么需要for循环
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=1; i<=999; ++i)
sum = sum + 1;
printf("sum = %d\n", sum);
return 0;
}
输出结果为sum=499500
2.for循环最简单的用法
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=1; i<10; i+=2)
{
sum = sum + i;
printf("我今天很高兴!\n");
}
printf("i = %d\n", i);
return 0;
}
输出结果为:
我今天很高兴!
我今天很高兴!
我今天很高兴!
我今天很高兴!
i=11
3.for和if的嵌套使用
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=3; i<=12; ++i)
{
if (i%3 == 0)
sum = sum + i;
}
printf("sum = %d\n", sum);
return 0;
}
输出结果如图
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=3; i<=12; ++i)
{
if (i%3 == 0)
sum = sum + i;
printf("sum = %d\n", sum);
}
return 0;
}
输出结果如图
4.强制类型转换和对初学者很重要的求和程序讲解
# include <stdio.h>
int main(void)
{
int i;
float sum = 0;
for (i=1; i<=100; ++i)
{
sum = sum + 1/i;
}
printf("sum = %d\n", sum);
return 0;
}
输出结果为0
问题出在输出上应该用%f而不是%d(float必须用%f输出)
# include <stdio.h>
int main(void)
{
int i;
float sum = 0;
for (i=1; i<=100; ++i)
{
sum = sum + 1/i;
}
printf("sum = %f\n", sum);
return 0;
}
输出结果为1.0000
下面对整型变量i进行强制转换
# include <stdio.h>
int main(void)
{
int i;
float sum = 0;
for (i=1; i<=100; ++i)
{
sum = sum + 1/ (float)(i);
}
printf("sum = %f\n", sum);
return 0;
}
输出结果如图所示
强制类型转换:
格式:(数据类型)(表达式)
功能:把表达式的值强制转化为前面所执行的数据类型
例子:(int)(4.5+2.2)输出结果为6
(float)(5)输出结果为5.000000
5.浮点数的存储所带来的问题
float和double都不能保证可以精确到存储一个小数
举例:有一个浮点型变量x,如何判断x的值是否是0
if(|x-0.00000001| < 0.00000001)(就是说x和一个很小的数相减的绝对值小于这个很小的数就可以看做是0)
是
else
不是
6.for和if嵌套使用四个习题的讲解
1.求1到100之间的奇数之和
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=1; i<101; ++i)
{
if (i%2 == 1)
sum += i;
}
printf("sum = %d\n", sum);
return 0;
}
2.求1到100之间奇数的个数
# include <stdio.h>
int main(void)
{
int i;
int cnt = 0;
for (i=1; i<101; ++i)
{
if (i%2 == 1)
++cnt;
}
printf("cnt = %d\n", cnt);
return 0;
}
个数一般用cnt表示
3.求1到100之间奇数的平均值
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
int cnt = 0;
float avg;
for (i=1; i<101; ++i)
{
if (i%2 == 1)
{
sum += i;
++cnt;
}
}
avg = 1.0*sum / cnt;
printf("sum = %d\n", sum);
printf("cnt = %d\n", cnt);
printf("avg = %f\n", avg);
return 0;
}
4.求1到100之间奇数的和,再求1到100之间偶数的和
# include <stdio.h>
int main(void)
{
int i;
int sum1 = 0;
int sum2 = 0;
for (i=1; i<101; ++i)
{
if (i%2 == 1)
{
sum1 += i;
}
else
{
sum2 += i;
}
}
printf("sum1 = %d\n", sum1);
printf("sum2 = %d\n", sum2);
return 0;
}
7.多层for循环嵌套使用执行顺序
1.单个for循环的使用
2.多个for循环的嵌套使用
for(1; 2; 3) //第一个语句
for(4; 5; 6) //第二个语句
A; //第三个语句
B; //第四个语句
3.while语句
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
for (i=1; i<101; ++i)
{
sum = sum + i;
}
printf("sum = %d\n", sum);
return 0;
}
用while语句写上面的代码
# include <stdio.h>
int main(void)
{
int i;
int sum = 0;
i = 1;
whlie (i < 100)
{
sum = sum + i;
++i;
}
printf("sum = %d\n", sum);
return 0;
}
1.执行顺序
格式:
while(表达式)
语句;
2.与for的相互比较
for和while可以相互转换
for (1; 2; 3)
A;
等价于
1;
while (2)
{
A;
3;
}
3.举例
1.用while判断是否是回文数
# include <stdio.h>
int main()
{
int m;
int sum = 0;
int val;
printf("请输入要判断的数:");
scanf ("%d", &val);
m = val;
while (m)
{
sum = sum * 10 + m%10;
m /= 10;
}
if (sum == val)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
2.斐波拉切序列
# include <stdio.h>
int main()
{
int n;
int f1, f2, f3;
int i;
f1 = 1;
f2 = 2;
printf("请输入您需要求的想的序列:");
scanf("%d", &n);
if(1 ==n)
{
f3 = 1;
}
else if (2 == n)
{
f3 = 2
}
else{
for (i=3; i<=n; ++i)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("%d\n", f3);
return 0;
}
4.什么时候用while,什么时候用for
笑了,用多了自然知道hhh
4.switch语句
# include <stdio.h>
int main(void)
{
int val;
printf("请输入您要进入的楼层:");
scanf("%d", &val);
switch (val)
{
case 1;
printf("1层开!\n");
break;
case 2;
printf("2层开!\n");
break;
case 3;
printf("3层开!\n");
break;
default:
printf("没有盖到这一层!\n");
break;
}
return 0;
}
5.do while语句
主要用于人机交互
do
{
......
} whlie(表达式)
while(表达式)
{
......
}
for (1; 2; 3)
A;
do whlie不等价于while也不等价于for
do while实现一元二次方程
# include <stdio.h>
# include <math.h>
int main(void)
{
double a, b, c;
double delta;
double x1,x2;
char ch;
do
{
printf("请输入一元二次方程的三个系数:\n");
printf("a = ");
scanf ("%lf", &a);
printf("b = ");
scanf ("%lf", &b);
printf("c = ");
scanf ("%lf", &c);
delta = b*b - 4*a*c;
if (delta > 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("该一元二次方程有两个解,x1 = %lf,x2 = %lf\n",x1,x2);
}
else if (delta == 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = x1;
printf("该一元二次方程有唯一解,x1 = x2 = %lf\n",x1);
}
else
{
printf("无解\n");
}
printf("是否继续(Y/N):");
scanf(" %c", &ch); //%c前面必须加一个空格
}while('y' == ch || 'Y' == ch);
return 0;
}
6.break和continue的区别
break
break如果是用于循环是用来终止循环
break如果是用于switch,则是用于终止switch
break不能直接用于if,除非if属于循环内部的一个子句
continue
用于跳过本次循环余下的语句
转去判断是否需要进行下次循环
三.课后习题
C Primer Plus
- 5.10 第七题
# include <stdio.h>
int main(void)
{
char c1, c2;
int diff;
float num;
c1 = 's';
c2 = 'o';
diff = c1 - c2;
num = diff;
printf("%c%c%c:%d %3.2f\n", c1, c2, c1, diff, num);
return 0;
}
输出结果为sos:4 4.00
第十三题
a. x -= 1;\
b. m = n % k;\
c. p = q / (b - a);\
d. x = (a + b) / (c * d);
- 5.11 第三题
#include<stdio.h>
int main()
{
int a, b, c;
do
{
printf("请输入天数:");
scanf("%d",&a);
b = a%7;
c = a/7;
printf("%d days are %d weeks, %d days\n",a, c, b);
}while (a > 0);
return 0;
}
运行结果如图所示
第八题
#include<stdio.h>
int main()
{
int a, b, c, d;
printf("请输入第一个整数:");
scanf ("%d",&a);
do
{
printf("请再次输入一个整数:");
scanf ("%d",&b);
c = b%a;
printf("%d\n",c);
}while (b > 0);
return 0;
}
运行结果如图所示:
遇到的情况:继续执行时出现了无限循环输出
- 6.16 第五题
# include <stdio.h>
int main (void)
{
int i, j, num;
char c ;
printf("enter the core char you want to print(A...Z):");
scanf("%c",&c);
char ch ='A';
num = c -'A'+1;
for (i=1; i<=num;i++)
{
for(j=0;j<num-i ;j++)
printf("");
for (ch= 'A';j <num; j++)
printf("%c",ch++);
for(j=1,ch-=2;j<i ;j++,ch--)
printf("%c",ch);
printf("\n");
}
return 0;
}
运行结果如图所示
第十二题 (计算机二级内容)
# include <stdio.h>
int main()
{
double times, i;
printf("请输入项数:");
while ((scanf ("%lf",×) == 1) && (times > 0))
{
int a = 1;
double sum1 = 0, sum2 = 0;
for (i = 1.0; i <= times; i++,a = 0-a)
{
sum1 += 1.0 / i;
sum2 += a*1.0 / i;
}
printf("sum1 = %lf, sum2 = %lf", sum1, sum2);
}
printf("结束");
return 0;
}
运行结果如图所示
第十八题
# include <stdio.h>
int main()
{
int friends;
int i = 1;
for (friends = 8; friends < 150; i++)
{
friends = 2 * (friends - i);
printf("第 %d 周有 %d 个朋友\n", i, friends);
}
return 0;
}
运行结果如图所示:朋友初始数改为8
- 7.11 第二题
a. number >= 90 && number <100;\
b. ch!='q' && ch!='k';\
c. number >= 1 && number <= 9 && number != 5;\
d. number < 1 || number >9
第十题
#include<stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '#')
{
if (ch != '\n')
{
printf("step 1\n");
if (ch == 'b')
break;
else if (ch != 'c')
{
if (ch != 'h')
printf("step 2\n");
printf("step 3\n");
}
}
}
printf("Done\n");
return 0;
}
运行结果如图下所示
已注册杭电oj账号:zkshang