第三次集训
如何使用scanf编写出高质量代码
-
使用scanf之前先使用printf提示用户以什么样的方式输出
-
scanf中尽量不要使用非输出控制符,* 尤其是不要使用\n*
(p:带%的是输出控制符,不带%的则不是)
-
应该编写代码对用户的非法输入做适当处理。
`while ((ch=getchar()) !='\n')`
`continue;`
运算符
-
算术运算符
+(加) -(减) *(乘) /(除) %(取余)
-
关系运算符
(大于) >=(大于等于) <(小于) <=(小于等于) !=(不等于) ==(等于)
-
逻辑运算符
!(非) &&(并且) ||(或)
-
赋值运算符
=
+=
*=
/=
-=
优先级别:算数 > 关系 > 逻辑 > 赋值
除法与取模运算符:
-
除法/的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商为小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。
- 如:16/5 == 3 16/5.0 == 3.20000 -13/4 == -4
- -13/-3 == -4 3/5 == 0 5/3 == 1
- 最典型的例题就是求 s =1+1/2+1/3+1/4+1/5......+1/100的值
-
取余%的运算对象必须是整数,结果是整数后的余数,其余数的符号只与被除数相同。
- 如: 13%3 == 1 13%-3 == 1 -13%3 == -1
- -13%23 == -13 3%5 == 3
逻辑运算符
!(非) &&(并且) ||(或)
!真 假
!假 真
真&&假 假
假&&真 假
假&&假 假
真||假 ------- 真
真||真 ------ 真
假||假 ------ 假
C语言对真假的处理:非零既为真,零为假;
&&运算符:当左边的表达式为假时,右边的表达式不执行。
||运算符:当左边的表达式为真时,右边的表达式不执行。
一些琐碎的运算符知识
-
自增【或者自减】
-
分类:
前自增 ---- ++i
后自增 ---- --i
- 前自增和后自增的异同:
** 相同: 最终都使i的值加1
不同:前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值***
-
三目运算符
A?B:C
等价于
if (A)
B;
else
C;
*逗号表达式
格式:
(A,B,C,D)
功能
-
从左到右执行
-
最终表达式式最后一项的值
*** 为什么会出现自增?***
答:代码更精炼
自增的速度更快
*p:(i ++ 和 ++i 单独成一个语句,不要把它作为一个完整复合语句的一部分来使用)*
流程控制
1.什么是流程控制?
答:程序代码执行的顺序
2.流程控制的分类
- 顺序执行
-
选择执行
定义
某些代码可能执行,也可能不执行,有选择的执行某些代码
分类
if* 1.if最简单的用法
if (表达式) 语句
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行
2.if的范围问题 1.if(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行
if无法控制语句B的执行或不执行
或者讲:语句B一定会执行
2.if (表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B
由此可见:if默认只能控制一个语句*的执行或不执行
如果想控制多个语句的执行或不执行
就必须把这些语句用{}括起来
3.if....else....的用法
4.if....else....if.....else用法
5.c语言对真假的处理 非零是真 零就是假
真用去表示 假用零表示
6.if举例--求分数的等级
7.if常见问题解析
空语句的问题
if (3 > 2);//等价于
if (3 > 2)
;//这是一个空语句
2.
if(表达式1);
语句A;
else
语句B;//这是错误的
3.
if(表达式1)
语句A;
else ;
语句B;//这是正确的
//等价于
else
;
语句B;
4.
if(表达式1)
语句A;
else if (表达式2)
语句B;
5.
if(表达式1)
语句A;
else if (表达式2)
语句B;
else (表达式3)
语句C;//错误,正确写法为去掉 (表达式3)或在else (表达式3)之间加if
6.
if(表达式1)
语句A;
else if (表达式2)
;
else (表达式3);
语句C;// 语法正确,但逻辑上是错误的。
3.流程控制为什么重要?
答:流程控制是自学编程的基础,看懂程序的前提!
如何学习一些需要算法的程序(郝老师的学习方法)
- 尝试自己去解决它,大部分人都自己无法解决。
- 如果解决不了,就看答案。 关键是把答案看懂,这个要花很大的精力,也是学习的重点。
- 看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的意思。
- 照着答案去敲代码。
- 调试错误。
- 不看答案,自己单独把答案敲出来。
- 如果彻底无法彻底理解,就把它背会。
Switch
电梯程序放在下面
循环
循环定义:某些代码会被重复执行
分类:
- for 1.格式
for(1;2;3)
语句A
2.执行的流程【重点】
-
单个for循环的使用
-
多个for循环的嵌套使用
1.for(1;2;3)//1
for(4;5;6)//2
A;
B;
- 整体是两个语句,1 2 3是第一个语句 ;4是第二个语句
-
for(1;2;3)
for(4;5;6)
{
A;
B;
}
-整体是一个语句
3.范围问题
4.举例子:
1+2+3....+100
1+1/2+1/3+....+1/100
<强制类型转换>
格式:(数据类型)(表达式)
功能:将表达式的值强制转化为前面所执行的数据类型
例子:(int)(4.5+2.2) 最终值为6 (float)(5) 最终值为 5.000000
int main(void)
{
int i;
float sum = 0;
for ( i = 1; i <=100; i++)
{
sum = sum + 1/float(i);//强制转换
//更简单的写法为 sum = sum + 1.0/i;
}
printf("1+1/2+1/3……+1/100=%f\n",sum);//float必须用%f输出
return 0;
}
<浮点数的存储带来的问题>
-
float和double都不能保证可以精确的存储一个数
举例:
有一个浮点型变量x,如何判断x的值是否是零 if(|x-0.000001)|<0.000001) 是零 else 不是零 -
while
1.执行顺序
格式:
while(表达式)
语句
2.与for的相互转化
for和while可以相互转换
for和while的嵌套
{
int i,j ,k,m;
for(i=1;i<=4;i++)
for(m=1;m<4;m++)
printf("哈哈\n");
printf("嘿嘿\n");
return 0;
}
```int main()
{
int i,j ,k,m;
for(i=1;i<=4;i++)
printf("1111\n");
for(m=1;m<4;m++)
{
printf("333\n");
printf("222\n");
}
return 0;
}
```for(1;2;3)
等价于
while(2)
{
A;
3;
}
3.举例
从键盘输入一个数字,如果该数字是回文数,则返回yes
-
do....while(具体应用代码在后面)
-
break和continue
break
-
break如果用于循环是用来终止循环
-
break如果用于Switch,则是用于终止Switch
-
break不能直接用于if,除非if属于循环内部的一个子句
代码实操
1.程序的选择执行
#include<stdio.h>
int main(void)
{
if (3)
printf("AAAA\n"); //会输出
if (0)
printf ("BBBB\n");//不会输出
if (0 == 0);
printf ("CCCC\n");//会输出
return 0;
}
2
int main(void)
{
float score;//score 分数
printf("请输入你的考试成绩:");
scanf("%f",&score);
if (score>100)
printf ("这是做梦!\n");
else if (score >= 90 && score <= 100)//不能写成90<=score<=100
printf ("优秀!\n");
else if (score>=80 && score<90)
printf ("良好!\n");
else if (score>=60 && score<80)
printf ("及格!\n");
else if (score >= 0 && score < 60)
printf ("不及格!继续加油\n");
else
printf ("输入的分数过低,进厂吧你!");
return 0;
}
3.for循环1
int main(void)
{
int i;
int sum = 0;
for (i = 1;i<=4;++i)
sum = sum + i;
printf ("sum = %d\n",sum);
return 0;
}
for循环---奇数求和代码
int main(void)
{
int i;
int sum = 0;
for (i = 1; i<10;i+=2)//i+=2 等价于 i = i + 2
{
sum = sum + i;
}
printf ("i = %d",i);
printf ("sum = %d",sum);
return 0;
}
1---100奇数求和
int main(void)
{
int i;
int sum = 0;
for (i = 0; i<=100;++i)
{
if (i%2 == 1)
sum = sum + i;//sum += i
}
printf ("sum = %d",sum);
return 0;
}
1到100奇数平均值代码
int main(void)
{
int i;
int sum = 0;
int cnt = 0;
float avg ;//平均值英文缩写
for (i = 0; i<=100;++i)
{
if (i%2 == 1)
{
sum += i;
++cnt;
}
}
avg = 1.0*sum / cnt;
printf ("sum = %d",sum);
printf ("cnt = %d\n",cnt);
printf("avg = %f\n",avg);
return 0;
}
菲波拉契序列程序
int main(void)
{
int n,i;
int f1, f2, f3;
f1 = 1;
f2 = 1;
printf("请输入您想要求的序列:");
scanf("%d",&n);
if (1 == n)
{
f3 = 1;
}
else if (2 == n)
{
f3 = 1;
}
else
{
for (i = 3; i<=n; i++)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("%d",f3);
return 0;
}
一元二次方程do...while代码
#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;
printf("delta=%lf\n",delta);
if(delta > 0)
{
x1 = (-b + sqrt(delta))/( a * 2);
x2 = (-b - sqrt(delta))/( a * 2);
printf("该方程有两个解, x1 = %lf,x2 = %lf\n",x1,x2);
}
else if(delta==0)
{
x1=(-b)/(2*a);
x2=x1;
printf("该方程有唯一解, x1 = x2 =%lf\n",x1);
}
else
{
printf("无解\n");
}
printf("继续请输入Y,退出请输入其他值:");
scanf(" %c", &ch);
}while('y'==ch || 'Y'==ch);
return 0;
}
电梯程序
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;
}
*break的应用
int main(void)
{
int i;
switch (2)
{
case 2:
printf("嘻嘻嘻嘻\n");
break;
}
for (i=0; i<3; ++i)
{
if (3 > 2)
break;
printf("嘿嘿嘿嘿\n"); //
}
return 0;
}
break的应用
课后作业
5.10 7
5.10.13
a. x -= 1;
b. m = n % k;
c. p = q / (b - a);
d. x = (a + b) / (c * d);
5.11.3
#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;
}
5.11.8
#include<stdio.h>
int main()
{
int a, b, i,j;
printf("请输入第一个整数:");
scanf ("%j",&a);
do {
printf("请再次输入一个整数:");
scanf ("%j",&b);
c = b%a;
printf("%j\n",i); }
while (b > 0);
return 0;
}
\
6.16
第五题和第十二题实在不会写,看答案也不太理解
第八题
#include<stdio.h>
int main()
{
int friends;
int i = 1;
for (friends = 5; friends <= 150; i++)
{
friends = 2 * (friends - i);
printf("R博士第 %d 周有 %d 个朋友\n", g,F );
}
return 0;
}
\
7.11
第2题 a. number >= 90 && number <100; b. ch!='q' && ch!='k'; c. number >= 1 && number <= 9 && number != 5; d. number < 1 || number >9
第10题:
#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;
}
```