一.需要掌握的知识点
算法的概念与特点:算法就是解决问题的方法和步骤,沃斯曾经提出:数据结构+算法=程序
算法的表示:流程图和计算机语言(平行四边形是输入输出,菱形为判断,)
算法的特点:1.有穷性2.确定性3.可行性4.有0或多个输入,5.有1或多个输出
三种基本结构
分类
a.顺序结构
b.选择(分支)结构
c.循环结构(当型(while for)和直到型(do while))
特点(不要求掌握,不是考点):1.只有一个入口和一个出口 2.每一个部分都可能被执行3.不存在死循环
标准输入输出
格式化输入输出
printf(“%[<修饰符>]<格式字符>”,输出项列表)
常用的输出格式字符(已经将最常用的省略):
%x(或者%X),%o,%e(或者%E)(指数一般输出整数部分,‘.’,小数部分总共保留8位),
常有的修饰符
#在八进制和十六进制前显示:0,0x;
0(往往结合m(数据宽)一起使用),在不足的位置前补充0
+:显示+
-:左对齐
.n:精度,12.12如果输出的时候是“%.1f”那么输出就是12.1
关于输出宽度的说明:
一般浮点数输出时小数点后保留6位,m表示的是整数部分+小数部分+‘.’整体的位数,如果一个数它本身就比m 宽,那么还是输出这个数本身,m不起限制作用,关于小数:如果n与m起了冲突,那么还是以n为准,
普通字符:可打印字符和转义字符,转义字符注意\ddd和\xhh
scanf("%[<修饰符>]<格式字符>",地址列表)
需要注意:
lf(在输出的时候double 和float 都可以用f 输出,但是输入的话double只能用lf,同时需要注意就是最好将浮点型的变量都定义为lf这样更为精确不容易出现问题
抑制字符*
如何处理使输入的空格不赋值给字符:在%c前加一个‘ ’(空格)这样就可以跳过字符前的所有空格
精度要求:不要在格式控制中指定小数位数
不确定输入次数如何解决:用scanf的返回值
while(scanf("%d",&c)==1)
其他的输入输出
getchar :c=getchar() 说明:回车键表示结束,但只会读入输入的第一个字符
putchar:getchar(c)
gets:gets(s) 说明:可以读入回车字符
puts:puts (s) 说明:输出函数串后自带换行符
4.C语言的语句
控制语句:
(if(分支),循环,continue(结束本次循环),break(终止循环或多分支),switch (多分支)return(返回))
函数调用语句
表达式语句(例如赋值)
空语句
复合语句(用{}括起来)
三种语句
1.条件语句
注意:(1).else 与离他最近的且为配对的if进行配对
(2.)先计算if后面的表达式,也就是说如果if后的括号中是一个赋值语句那么即使不进入if下面的语句也会执行赋值操作,同时自加自减(if(a++))依旧是先判断a 是否等于1,然后再++,
(3)if 后的语句只有0或者非0之分
(4)如果是if(a=0)那么意思就是将a的值赋值为0,同时括号中的表达式的值也是0,如果是if(a=1)那么赋值后括号中表达式的值就是1
(5)补充一个条件运算符?:例如
(x>0)y=1;(x=0)y=0;(x<0)y=-1用条件运算符表示出来就是y=x>0?1:x==0?0:-1
2.多分支语句switch case
注意:(1)。switch后面只能是整数型或者字符型,如果是字符型那么case '1'(需要有个单引号)
(2)如果是字符型,但是涉及到数字的加减,例如
char a='4',然后要对a代表的数值与2进行相减,那么就需要写成
switch(a-'2')
(3)case可以合并,例如写成
case 10:
case 9: printf("good”)
(4)注意就是switch后需要加{}将所有case包起来,但是如果case 后有很多语句是不需要加大括号的
(5)关于break,
Switch(a)
{
case 1:a++;break;
case 2:a++;break;
}//如果a=1,那么最后的结构就是a=2
Switch(a)
{
case 1:a++;
case 2:a++;
}//如果a=1,那么最后的结果就是a=3
(6)关于default,可有可无
(7)注意就是case default虽然在编程的时候有顺序之分,但是执行的时候是没有顺序之分的,例如
Switch(a)
{
case 1:a++;break;
default:break;
case 2:a++;break;
}
和
Switch(a)
{
case 1:a++;break;
case 2:a++;break;
default:break;
}的结果是一样的
3.循环语句
while(执行语句的条件);,do{……}while(执行语句的条件);,for(初始化;执行语句的条件;语句3改变值)
注意:(1).括号里在每次判断的时候都会执行一次,注意自加自减语句
(2)有时候while 改成do while 还需要将用来判断的变量在语句中改个位置,具体情况具体判断,并且do while 不一定比while 执行的次数多
(3)for语句中如果是continue,那么语句3的操作依旧会执行,但如果是break那么就不会执行
关于转移语句
break和continue
break只能跳出本层循环或者switch ,读程序题时一定注意分层
举一个小例子
while(a>3)
{
switch(a)
{
case 1:……;break;//这里的break是跳出Switch语句,与循环无关
case 2:……;continue;//这里的continue是结束本次循环
}
}
二.常见的例题
关于日期(判断日期是否合法)
int judge(int y,int m,int d)
{
int f=1;
if(m<1||m>12){
f=0;return f;}
else
if(m<=7&&m%2==1||m>7&&m%2==0)
{
if(d>=1&&d<=31)f=1;
else f=0;
}
else if(m!=2)
{
if(d>=1&&d<=30)f=1;
else f=0;
}
else
{
if(d>=1&&d<=28)
f=1;
else f=0;
}
if((y%4==0&&y%100!=0||y%400==0)&&m==2&&d==29)f=1;
return f;
}
(判断某一天是今年的第几天)
(判断某一天是星期几)
2.倒序输出
3.解方程
4.抓小偷题(见清华大学出版社C语言程序设计(第三版)P90)
5.计算1000!的末尾有多少个0,判断1~1000中的每个数可以被多少个5整除,然后相加即可
补充:一元高次方程
易错的例题和补充:
编写判断精度的程序时注意:
1.数据的类型2.数据需要加绝对值3.循环的条件是>=精度4.书写语句注意*符号
读程序题需要注意:
注意分层
注意逻辑运算符的短路特性
注意while if等语句括号中的式子也会执行,同时注意是==还是=
不借助临时变量来实现两个变量的交换
a=a-b;(用a来记录a-b)
b=b+a;(b=b+a-b)
a = b-a;(a=a-a+b)
如果写成了
int x=017(第一个是数字0)
那么就是x=15
如果是
int x=0x17
那么就是x=27