C语言复习总纲中国农业大学信电学院计算机系吕春利老师的C语言教学例子.docx
《C语言复习总纲中国农业大学信电学院计算机系吕春利老师的C语言教学例子.docx》由会员分享,可在线阅读,更多相关《C语言复习总纲中国农业大学信电学院计算机系吕春利老师的C语言教学例子.docx(37页珍藏版)》请在冰豆网上搜索。
C语言复习总纲中国农业大学信电学院计算机系吕春利老师的C语言教学例子
中国农业大学信电学院、计算机系吕春利老师的C语言教学例子
学习计算机语言,一定要上机练习,上机练习的6个境界:
0、无可救药的境界:
不上机练习!
1、最低境界:
能把例子看书调通,运行正确结果。
(上机练习绝不能停留在这个阶段)
2、学习知识点境界:
能理解例子中的每个符号。
(通过看书、询问等解决那些“不懂”的符号)
3、尝试和验证理解境界:
尝试修改程序,看修改后的程序结果是否符合你的预期。
4、应用境界:
合上书本,能编写符合题目要求的程序。
(上机的要求)
5、随心所欲境界:
自己能想明白的事情,都能用计算机语言解决。
(自己给自己出题,或解决自己想解决的问题。
)
6、触类旁通:
一门语言在心,其他种语言1天左右能会用,1个月左右基本精通。
通过例子学习计算机语言的要求:
求质量基础上求数量!
对质量的要求是达到上边第4境界!
求数量的目的是学习语言的知识点!
计算机语言课程的精髓在训练一种“映射”能力:
把自己能想清楚地事情,映射到计算机语言的表达!
(也就是把客观世界的事物及其变化过程,映射到计算机世界的变量和算法。
变量反映现实世界的事物,算法反映事物的变化过程)
也就是说:
用计算机语言来描述客观世界及其变化过程,变量是描述客观世界的,算法描述变化过程。
"教育就是忘记了在学校所学的一切之后剩下的东西"--从爱因斯坦...
一种能力是不容易忘记的,比如骑车的能力,语言的能力,学习能力,“映射”能力……
我们这里的大量例子的目的:
首先是训练这种“映射”能力,其次是学习C语言的语法!
学会例子可以学会语法,学透例子才能提高能力!
例一
顺序结构例子
学习内容:
(记住如下内容)
1、main函数作为入口点、顺序结构
2、注意符号,一点都不能错
3、变量与常量的概念与定义;
4、语句与基本运算表达与赋值语句表达
5、输出函数
题目:
已知某种铅密度为11340kg/m3,求直径为8.9cm的铅球有多重。
程序:
#include"stdafx.h"/*VisualC++6.0环境要求的头文件,初学者可以不用理解它,以后讲*/
main()
{
doubled,r,v,h;
d=8.9;
r=d/100.0/2.0;/*这是计算半径*/
v=4.0/3.0*3.1415926*r*r*r;
h=v*11340;
printf("%f",h);
}
思考:
(1)哪些是变量?
哪些是常量?
它们有什么样的区别?
(2)语句的特征是什么?
变量和常量加运算符号构成表达式,表达式加“;”构成语句
(3)可以做哪些修改?
若空心球,内径为5.1?
若是钢管呢?
总结:
C语言程序的特点:
1、打开编译器,上来就是一个main(){}函数;
2、在main(){}函数内定义变量,思考表达式,语句;
3、把计算出来的变量用printf()输出出来。
/*************知识点与张莉老师主编书的页数对应*************/
常量:
P30,P31
变量:
P34—P36
double:
P41—P44
Printf():
P78
+-*/运算符:
P49
=赋值语句:
P59
编译工具TurboC:
P21
表达式与语句:
P70-P71
例二
循环结构例子
学习内容:
1、循环结构的表达,while(表达式真假){循环体}语句的语法功能。
2、复合语句的表达和意义
3、输出语句的应用
4、能想明白的事情表达成算法的练习。
5、程序调试方法:
一步一步执行,边执行边看程序中变量值的变化
计算1+2+3+。
。
+100
#include"stdafx.h"
{intsum,i;
i=1;
sum=0;/*为何这里要写sum=0?
这句去掉可不可以?
*/
while(i<=100)/*注意这个while后面没有“;”,为什么?
{sum=sum+i;/*红色的两句为什么要用一对花括号括上*/
i=i+1;/*i=i+1;的作用是什么?
printf("sum=%d\nfff",sum);
1、修改计算1*2*。
6;
2、计算12+22+32+42+……
3、计算1+3+5+7+………
4、计算1+1/2+1/3+1/4+1/5+…
5、计算1+1/2-1/3+1/4-1/5+…
6、已知pi/4=1-1/3+1/5-1/7+1/9………求pi的值
表达式真假:
P56—P58
复合语句:
P72
Int:
P36
While语句:
P111
例三
分支结构
计算分段函数:
1、分支结构的表达,if()else语句的语法功能。
3、程序调试方法:
doublex;
inty;
x=0;
if(x<0)/*if()后没有“;”号,为什么?
{y=1;}
else/*有else前面一定要有if,换句话else一定要和if配对,*/
{y=-1;}/*思考:
if一定要和else配对么?
printf("y=%d",y);
例四:
输入a,b,c三个数,依次输出最大、第二大、最小
1、分支结构的表达,if()语句的语法功能。
4、scanf格式化输入函数的使用
inta,b,c,t;
scanf("a=%d,b=%d,c=%d",&a,&b,&c);
if(a
{t=a;a=b;b=t;}
if(a{t=a;a=c;c=t;}if(b{t=b;b=c;c=t;}printf("\n%d,%d,%d",a,b,c);}例五:求解一元二次方程intmain(intargc,char*argv[]){doublea,b,c,det,x1,x2,p,q;printf("\npleaseinputa,b,c:");scanf("%lf,%lf,%lf",&a,&b,&c);if(0==a)/*这里这样写不好,对小数的比较应该用绝对值小于某个小数*/{printf("nota2ciequation");if(0==b){printf("notaequation");}else{printf("x=%f",-c/b);}}else{det=b*b-4*a*c;if(det>=0){x1=(-b+sqrt(det))/(2*a);x2=(-b-sqrt(det))/(2*a);printf("\nx1=%f,x2=%f",x1,x2);}else{p=-b/(2*a);q=sqrt(-det)/(2*a);printf("\nhascomplexroots:");printf("x1=%f+%fi\n",p,q);printf("x2=%f-%fi\n",p,q);}}getch();}例六:解释浮点数的大小比较为什么不能直接用==#include"stdafx.h"main(){doublea=1.0/3,c=1.0,b=1.0/729;inti=1,n=100;while(i{c=a*c;i=i*i;}printf("\nc=%f",c);if(c-b==0)printf("==0");elseprintf("!=0");return;}由于历史上的原因,多数教材和参考书上会介绍一些具有“小技巧”的“短小”、“精炼”的例子程序,并说明这样写的程序如何“高效”,即执行速度快或节省内存。实践表明现在用一些小‘技巧’写出这样‘短小’、‘精悍’的程序已经过时了,不是现代主流软件产业所要求的了,新时期的主流要求是‘代码的可维护性’,即一个人写的代码易于让另外的人理解并修改。这背后的原因主要基于两个事实:1、判断一段代码正确与否所花的时间可能要比编写这段代码所花的时间要长。2、软件产业的现状和要求是‘铁打的营盘,流水的兵’,即软件人才的流动性很大,但软件产品的生存期要很长,比如‘瑞星’杀毒软件已经在市场立足10多年,但又有多少程序员能在同一个公司、同一个产品上编10年代码?这就要求你写的代码必须要可读性强、易于修改。试想充满‘技巧’和‘个性’的长篇程序代码如何让人读懂和修改?如何让人接手?”所以同学们刚开始学习编程语言时就要培养写“可读性强”,“易于修改”程序的意识和习惯。习惯一些好的编程规范:如写程序要用“缩进”体现出层次;多写程序注释;不要写if(a==0),要写if(0==a),以防止忘记一个“=”;if,while,for等不管后面是否为复合语句,一律加上“{}”,这目的就是为了可读性;定义指针就初始化为常量int*p=NULL,杜绝野指针的存在;少用全局变量……。例七:绯波纳锲数列能想明白的事情表达成算法的练习。#include"stdafx.h"intmain(intargc,char*argv[]){unsignedlongan,an_1,an_2,n=3;an_1=1;an_2=1;n=3;while(n<=20){an=an_1+an_2;/*①*/printf("\na[%d]=%ld,%f",n,an,1.0*an/an_1);/*②*/an_2=an_1;/*③*/an_1=an;/*④*/n++;}return0;}思考:1、③、④句调换会结果会是什么?2、②句挪到④后结果会怎样?3、②句中为何用“*1.0”?例八:已知pi/4=1-1/3+1/5-1/7+1/9………求pi的值学习内容:1、学习找规律2、表达你所发现的规律intmain(intargc,char*argv[]){doublef,sum;ints;f=1.0;sum=0;s=1;while(f<20000000000){sum=sum+1.0/f*s;f=f+2.0;s=s*-1;}printf("pi=%15.14f",sum*4);return0;}例九:输入一个数,判断这个数是不是质数(也叫素数,即除了1和本身外无其他因子)学习内容:语法break的作用和使用:结束该循环!训练能力:小学时,给你一个数,你就能判断它是不是一个质数。现在你把这个判断过程用计算机语言表达出来!intmain(intargc,char*argv[]){unsignedintx,i;scanf("%d",&x);for(i=2;i<=x/2;i++){if(x%i==0){break;}}if(i<=x/2)printf("%disnotaprime",x);elseprintf("%disaprime",x);return1;}例十:“今有物不知其数,三三数之剩二;五五数之剩三,七七数之剩二;问物几何?”学习内容:1、用“穷举”法求解一些问题。“穷举”法非常常用!2、算符“%”;3、算符“&&”;intmain(intargc,char*argv[]){intx;for(x=1;x<10000;x++){if(x%3==2&&x%5==3&&x%7==2){printf("x=%d",x);break;/*去掉break会怎样?*/}}return0;}例十一:已知x为正整数,x*x除以391(17*23)的余数是13,求解x;学习内容:1、用“穷举”法求解一些问题。“穷举”法非常常用!2、算符优先级;intmain(intargc,char*argv[]){intx;for(x=1;x<100000;x++){if(x*x%(17*23)==13){printf("x=%d",x);break;/*去掉break会怎样?*/}}return0;}例十一:已知x为正整数,x*x除以(19*23)的余数是13,求解x;学习内容:1、计算机语言这种工具的局限性。2、注意运算超界intmain(intargc,char*argv[]){intx;for(x=1;x<100000;x++){if(x*x%(19*23)==13){printf("x=%d",x);break;}}return0;}例十二:判断一年是否为闰年?解法一:intmain(intargc,char*argv[]){unsignedintyear;year=2000;if((0==year%400)||(year%100!=0&&year%4==0))printf("%disleapyear",year);elseprintf("%disnotleapyear",year);return0;}解法二:辅助变量的使用intmain(intargc,char*argv[]){intleap;if(0==year%400)leap=1;elseif(0==year%100)leap=0;elseif(0==year%4)leap=1;elseleap=0;if(1==leap)printf("%disleapyear",year);elseprintf("%disnotleapyear",year);return0;}例十三:为什么闰年的规律是那个样的?模拟计算,如果不润;每四年一闰;每四年一闰,百年不闰;每四年一闰,百年不闰,四百年再补一闰;四种规则与实际年的差别。学习内容:1、能力训练2、Printf(%m.nf”)的输出格式3、If()语句intmain(intargc,char*argv[]){doubledeff_0,deff_4,deff_100,deff_400,RealYear=365.24219;inti,det4=0,det100=0,det400=0;i=1;while(i<=5000){deff_0=(365-RealYear)*i;if(0==i%4)det4++;deff_4=deff_0+det4;if(0==i%100)det100--;deff_100=deff_4+det100;if(0==i%400)det400++;deff_400=deff_100+det400;printf("\ni=%4d,%15f,%10f,%10f,%10f",i,deff_0,deff_4,deff_100,deff_400);i++;}return0;}例十四:三对情侣参加婚礼,三个新郞为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请找出谁将和谁结婚。*问题分析与算法设计将A、B、C三人用1,2,3表示,将X和A结婚表示为“X=1”,将Y不与A结婚表示为“Y!=1”。按照题目中的叙述可以写出表达式:x!=1A不与X结婚x!=3X的未婚夫不是Cz!=3C不与Z结婚题意还隐含着一夫一妻,则有:x,y,z三个值各不相同;学习内容:1、客观事物到计算机变量的映射2、计算机用于推理的展示3、字符型常量的表示和应用voidmain(){intx,y,z;for(x=1;x<=3;x++)/*穷举x的全部可能配偶*/for(y=1;y<=3;y++)/*穷举y的全部可能配偶*/for(z=1;z<=3;z++)/*穷举z的全部可能配偶*/if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z)/*判断配偶是否满足题意*/{printf("Xwillmarryto%c.\n",'A'+x-1);/*打印判断结果*/printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}例十五:字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….学习内容:1、getchar()2、switch3、逻辑运算符的优先级intmain(intargc,char*argv[]){charc;longtotal_counter=0,a_counter=0,b_counter=0,c_counter=0,e_counter=0;while(c!='`'){c=getchar();if(c>='a'&&c<='z'||c>='A'&&c<='Z'){total_counter++;switch(c){case'a':case'A':a_counter++;break;case'b':case'B':b_counter++;break;case'c':case'C':c_counter++;break;case'e':case'E':e_counter++;break;}}}printf("pa=%f,pb=%f,pc=%f,pe=%f",(double)a_counter/total_counter,(double)b_counter/total_counter,(double)c_counter/total_counter,(double)e_counter/total_counter);return0;}例十六:字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….z出现的频率。学习内容:1、数组定义与使用2、字符常量的概念和使用intmain(intargc,char*argv[]){charc='0';longtotal_counter=0,a_zCounter[26];inti;for(i=0;i<26;i++)a_zCounter[i]=0;while(c!='`'){c=getchar();if(c-'a'<26&&c-'a'>=0){total_counter++;a_zCounter[c-'a']++;}elseif(c-'A'<26&&c-'A'>=0){total_counter++;a_zCounter[c-'A']++;}}printf("\n");for(i=0;i<26;i++){printf("p%c=%f,",i+'a',(double)a_zCounter[i]/total_counter);}return0;}例十七牛顿截玄法解一元高次方程学习内容:1、函数的定义(函授的黑箱性、模块性)2、函数的使用(参数、返回值、return语法及语句作用)3、牛顿截玄法4、体会计算机的能力和魅力自顶向下、逐步细化模块设计、结构编码doubley(doublex){doublet;//t=x*x*x-5*x*x+16*x-80;t=x*x*x*x*x-5*x*x*x+16*x-80;returnt;}doublexpoint(doublex1,doublex2){doublex;x=(x1*y(x2)-x2*y(x1))/(y(x2)-y(x1));returnx;}doubleroot(doublex1,doublex2){doubley1,x,y0;y1=y(x1);x=xpoint(x1,x2);y0=y(x);while(y0>0.0000001||y0<-0.000001)/*当y的绝对值〉小量就循环*/{x=xpoint(x1,x2);y0=y(x);if(y1*y0>0){y1=y0;x1=x;}else{x2=x;}}returnx;}intmain(intargc,char*argv[]){printf("x=%14.13lf",root(0,100));return0;}例十八用数组实现斐波纳妾数列学习内容:1、数组使用intmai
{t=a;a=c;c=t;}
if(b{t=b;b=c;c=t;}printf("\n%d,%d,%d",a,b,c);}例五:求解一元二次方程intmain(intargc,char*argv[]){doublea,b,c,det,x1,x2,p,q;printf("\npleaseinputa,b,c:");scanf("%lf,%lf,%lf",&a,&b,&c);if(0==a)/*这里这样写不好,对小数的比较应该用绝对值小于某个小数*/{printf("nota2ciequation");if(0==b){printf("notaequation");}else{printf("x=%f",-c/b);}}else{det=b*b-4*a*c;if(det>=0){x1=(-b+sqrt(det))/(2*a);x2=(-b-sqrt(det))/(2*a);printf("\nx1=%f,x2=%f",x1,x2);}else{p=-b/(2*a);q=sqrt(-det)/(2*a);printf("\nhascomplexroots:");printf("x1=%f+%fi\n",p,q);printf("x2=%f-%fi\n",p,q);}}getch();}例六:解释浮点数的大小比较为什么不能直接用==#include"stdafx.h"main(){doublea=1.0/3,c=1.0,b=1.0/729;inti=1,n=100;while(i{c=a*c;i=i*i;}printf("\nc=%f",c);if(c-b==0)printf("==0");elseprintf("!=0");return;}由于历史上的原因,多数教材和参考书上会介绍一些具有“小技巧”的“短小”、“精炼”的例子程序,并说明这样写的程序如何“高效”,即执行速度快或节省内存。实践表明现在用一些小‘技巧’写出这样‘短小’、‘精悍’的程序已经过时了,不是现代主流软件产业所要求的了,新时期的主流要求是‘代码的可维护性’,即一个人写的代码易于让另外的人理解并修改。这背后的原因主要基于两个事实:1、判断一段代码正确与否所花的时间可能要比编写这段代码所花的时间要长。2、软件产业的现状和要求是‘铁打的营盘,流水的兵’,即软件人才的流动性很大,但软件产品的生存期要很长,比如‘瑞星’杀毒软件已经在市场立足10多年,但又有多少程序员能在同一个公司、同一个产品上编10年代码?这就要求你写的代码必须要可读性强、易于修改。试想充满‘技巧’和‘个性’的长篇程序代码如何让人读懂和修改?如何让人接手?”所以同学们刚开始学习编程语言时就要培养写“可读性强”,“易于修改”程序的意识和习惯。习惯一些好的编程规范:如写程序要用“缩进”体现出层次;多写程序注释;不要写if(a==0),要写if(0==a),以防止忘记一个“=”;if,while,for等不管后面是否为复合语句,一律加上“{}”,这目的就是为了可读性;定义指针就初始化为常量int*p=NULL,杜绝野指针的存在;少用全局变量……。例七:绯波纳锲数列能想明白的事情表达成算法的练习。#include"stdafx.h"intmain(intargc,char*argv[]){unsignedlongan,an_1,an_2,n=3;an_1=1;an_2=1;n=3;while(n<=20){an=an_1+an_2;/*①*/printf("\na[%d]=%ld,%f",n,an,1.0*an/an_1);/*②*/an_2=an_1;/*③*/an_1=an;/*④*/n++;}return0;}思考:1、③、④句调换会结果会是什么?2、②句挪到④后结果会怎样?3、②句中为何用“*1.0”?例八:已知pi/4=1-1/3+1/5-1/7+1/9………求pi的值学习内容:1、学习找规律2、表达你所发现的规律intmain(intargc,char*argv[]){doublef,sum;ints;f=1.0;sum=0;s=1;while(f<20000000000){sum=sum+1.0/f*s;f=f+2.0;s=s*-1;}printf("pi=%15.14f",sum*4);return0;}例九:输入一个数,判断这个数是不是质数(也叫素数,即除了1和本身外无其他因子)学习内容:语法break的作用和使用:结束该循环!训练能力:小学时,给你一个数,你就能判断它是不是一个质数。现在你把这个判断过程用计算机语言表达出来!intmain(intargc,char*argv[]){unsignedintx,i;scanf("%d",&x);for(i=2;i<=x/2;i++){if(x%i==0){break;}}if(i<=x/2)printf("%disnotaprime",x);elseprintf("%disaprime",x);return1;}例十:“今有物不知其数,三三数之剩二;五五数之剩三,七七数之剩二;问物几何?”学习内容:1、用“穷举”法求解一些问题。“穷举”法非常常用!2、算符“%”;3、算符“&&”;intmain(intargc,char*argv[]){intx;for(x=1;x<10000;x++){if(x%3==2&&x%5==3&&x%7==2){printf("x=%d",x);break;/*去掉break会怎样?*/}}return0;}例十一:已知x为正整数,x*x除以391(17*23)的余数是13,求解x;学习内容:1、用“穷举”法求解一些问题。“穷举”法非常常用!2、算符优先级;intmain(intargc,char*argv[]){intx;for(x=1;x<100000;x++){if(x*x%(17*23)==13){printf("x=%d",x);break;/*去掉break会怎样?*/}}return0;}例十一:已知x为正整数,x*x除以(19*23)的余数是13,求解x;学习内容:1、计算机语言这种工具的局限性。2、注意运算超界intmain(intargc,char*argv[]){intx;for(x=1;x<100000;x++){if(x*x%(19*23)==13){printf("x=%d",x);break;}}return0;}例十二:判断一年是否为闰年?解法一:intmain(intargc,char*argv[]){unsignedintyear;year=2000;if((0==year%400)||(year%100!=0&&year%4==0))printf("%disleapyear",year);elseprintf("%disnotleapyear",year);return0;}解法二:辅助变量的使用intmain(intargc,char*argv[]){intleap;if(0==year%400)leap=1;elseif(0==year%100)leap=0;elseif(0==year%4)leap=1;elseleap=0;if(1==leap)printf("%disleapyear",year);elseprintf("%disnotleapyear",year);return0;}例十三:为什么闰年的规律是那个样的?模拟计算,如果不润;每四年一闰;每四年一闰,百年不闰;每四年一闰,百年不闰,四百年再补一闰;四种规则与实际年的差别。学习内容:1、能力训练2、Printf(%m.nf”)的输出格式3、If()语句intmain(intargc,char*argv[]){doubledeff_0,deff_4,deff_100,deff_400,RealYear=365.24219;inti,det4=0,det100=0,det400=0;i=1;while(i<=5000){deff_0=(365-RealYear)*i;if(0==i%4)det4++;deff_4=deff_0+det4;if(0==i%100)det100--;deff_100=deff_4+det100;if(0==i%400)det400++;deff_400=deff_100+det400;printf("\ni=%4d,%15f,%10f,%10f,%10f",i,deff_0,deff_4,deff_100,deff_400);i++;}return0;}例十四:三对情侣参加婚礼,三个新郞为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请找出谁将和谁结婚。*问题分析与算法设计将A、B、C三人用1,2,3表示,将X和A结婚表示为“X=1”,将Y不与A结婚表示为“Y!=1”。按照题目中的叙述可以写出表达式:x!=1A不与X结婚x!=3X的未婚夫不是Cz!=3C不与Z结婚题意还隐含着一夫一妻,则有:x,y,z三个值各不相同;学习内容:1、客观事物到计算机变量的映射2、计算机用于推理的展示3、字符型常量的表示和应用voidmain(){intx,y,z;for(x=1;x<=3;x++)/*穷举x的全部可能配偶*/for(y=1;y<=3;y++)/*穷举y的全部可能配偶*/for(z=1;z<=3;z++)/*穷举z的全部可能配偶*/if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z)/*判断配偶是否满足题意*/{printf("Xwillmarryto%c.\n",'A'+x-1);/*打印判断结果*/printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}例十五:字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….学习内容:1、getchar()2、switch3、逻辑运算符的优先级intmain(intargc,char*argv[]){charc;longtotal_counter=0,a_counter=0,b_counter=0,c_counter=0,e_counter=0;while(c!='`'){c=getchar();if(c>='a'&&c<='z'||c>='A'&&c<='Z'){total_counter++;switch(c){case'a':case'A':a_counter++;break;case'b':case'B':b_counter++;break;case'c':case'C':c_counter++;break;case'e':case'E':e_counter++;break;}}}printf("pa=%f,pb=%f,pc=%f,pe=%f",(double)a_counter/total_counter,(double)b_counter/total_counter,(double)c_counter/total_counter,(double)e_counter/total_counter);return0;}例十六:字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….z出现的频率。学习内容:1、数组定义与使用2、字符常量的概念和使用intmain(intargc,char*argv[]){charc='0';longtotal_counter=0,a_zCounter[26];inti;for(i=0;i<26;i++)a_zCounter[i]=0;while(c!='`'){c=getchar();if(c-'a'<26&&c-'a'>=0){total_counter++;a_zCounter[c-'a']++;}elseif(c-'A'<26&&c-'A'>=0){total_counter++;a_zCounter[c-'A']++;}}printf("\n");for(i=0;i<26;i++){printf("p%c=%f,",i+'a',(double)a_zCounter[i]/total_counter);}return0;}例十七牛顿截玄法解一元高次方程学习内容:1、函数的定义(函授的黑箱性、模块性)2、函数的使用(参数、返回值、return语法及语句作用)3、牛顿截玄法4、体会计算机的能力和魅力自顶向下、逐步细化模块设计、结构编码doubley(doublex){doublet;//t=x*x*x-5*x*x+16*x-80;t=x*x*x*x*x-5*x*x*x+16*x-80;returnt;}doublexpoint(doublex1,doublex2){doublex;x=(x1*y(x2)-x2*y(x1))/(y(x2)-y(x1));returnx;}doubleroot(doublex1,doublex2){doubley1,x,y0;y1=y(x1);x=xpoint(x1,x2);y0=y(x);while(y0>0.0000001||y0<-0.000001)/*当y的绝对值〉小量就循环*/{x=xpoint(x1,x2);y0=y(x);if(y1*y0>0){y1=y0;x1=x;}else{x2=x;}}returnx;}intmain(intargc,char*argv[]){printf("x=%14.13lf",root(0,100));return0;}例十八用数组实现斐波纳妾数列学习内容:1、数组使用intmai
{t=b;b=c;c=t;}
printf("\n%d,%d,%d",a,b,c);
例五:
求解一元二次方程
intmain(intargc,char*argv[])
doublea,b,c,det,x1,x2,p,q;
printf("\npleaseinputa,b,c:
");
scanf("%lf,%lf,%lf",&a,&b,&c);
if(0==a)/*这里这样写不好,对小数的比较应该用绝对值小于某个小数*/
{printf("nota2ciequation");
if(0==b)
{printf("notaequation");
else
{printf("x=%f",-c/b);
{det=b*b-4*a*c;
if(det>=0)
{x1=(-b+sqrt(det))/(2*a);
x2=(-b-sqrt(det))/(2*a);
printf("\nx1=%f,x2=%f",x1,x2);
{p=-b/(2*a);
q=sqrt(-det)/(2*a);
printf("\nhascomplexroots:
printf("x1=%f+%fi\n",p,q);
printf("x2=%f-%fi\n",p,q);
getch();
例六:
解释浮点数的大小比较为什么不能直接用==
doublea=1.0/3,c=1.0,b=1.0/729;
inti=1,n=100;
while(i{c=a*c;i=i*i;}printf("\nc=%f",c);if(c-b==0)printf("==0");elseprintf("!=0");return;}由于历史上的原因,多数教材和参考书上会介绍一些具有“小技巧”的“短小”、“精炼”的例子程序,并说明这样写的程序如何“高效”,即执行速度快或节省内存。实践表明现在用一些小‘技巧’写出这样‘短小’、‘精悍’的程序已经过时了,不是现代主流软件产业所要求的了,新时期的主流要求是‘代码的可维护性’,即一个人写的代码易于让另外的人理解并修改。这背后的原因主要基于两个事实:1、判断一段代码正确与否所花的时间可能要比编写这段代码所花的时间要长。2、软件产业的现状和要求是‘铁打的营盘,流水的兵’,即软件人才的流动性很大,但软件产品的生存期要很长,比如‘瑞星’杀毒软件已经在市场立足10多年,但又有多少程序员能在同一个公司、同一个产品上编10年代码?这就要求你写的代码必须要可读性强、易于修改。试想充满‘技巧’和‘个性’的长篇程序代码如何让人读懂和修改?如何让人接手?”所以同学们刚开始学习编程语言时就要培养写“可读性强”,“易于修改”程序的意识和习惯。习惯一些好的编程规范:如写程序要用“缩进”体现出层次;多写程序注释;不要写if(a==0),要写if(0==a),以防止忘记一个“=”;if,while,for等不管后面是否为复合语句,一律加上“{}”,这目的就是为了可读性;定义指针就初始化为常量int*p=NULL,杜绝野指针的存在;少用全局变量……。例七:绯波纳锲数列能想明白的事情表达成算法的练习。#include"stdafx.h"intmain(intargc,char*argv[]){unsignedlongan,an_1,an_2,n=3;an_1=1;an_2=1;n=3;while(n<=20){an=an_1+an_2;/*①*/printf("\na[%d]=%ld,%f",n,an,1.0*an/an_1);/*②*/an_2=an_1;/*③*/an_1=an;/*④*/n++;}return0;}思考:1、③、④句调换会结果会是什么?2、②句挪到④后结果会怎样?3、②句中为何用“*1.0”?例八:已知pi/4=1-1/3+1/5-1/7+1/9………求pi的值学习内容:1、学习找规律2、表达你所发现的规律intmain(intargc,char*argv[]){doublef,sum;ints;f=1.0;sum=0;s=1;while(f<20000000000){sum=sum+1.0/f*s;f=f+2.0;s=s*-1;}printf("pi=%15.14f",sum*4);return0;}例九:输入一个数,判断这个数是不是质数(也叫素数,即除了1和本身外无其他因子)学习内容:语法break的作用和使用:结束该循环!训练能力:小学时,给你一个数,你就能判断它是不是一个质数。现在你把这个判断过程用计算机语言表达出来!intmain(intargc,char*argv[]){unsignedintx,i;scanf("%d",&x);for(i=2;i<=x/2;i++){if(x%i==0){break;}}if(i<=x/2)printf("%disnotaprime",x);elseprintf("%disaprime",x);return1;}例十:“今有物不知其数,三三数之剩二;五五数之剩三,七七数之剩二;问物几何?”学习内容:1、用“穷举”法求解一些问题。“穷举”法非常常用!2、算符“%”;3、算符“&&”;intmain(intargc,char*argv[]){intx;for(x=1;x<10000;x++){if(x%3==2&&x%5==3&&x%7==2){printf("x=%d",x);break;/*去掉break会怎样?*/}}return0;}例十一:已知x为正整数,x*x除以391(17*23)的余数是13,求解x;学习内容:1、用“穷举”法求解一些问题。“穷举”法非常常用!2、算符优先级;intmain(intargc,char*argv[]){intx;for(x=1;x<100000;x++){if(x*x%(17*23)==13){printf("x=%d",x);break;/*去掉break会怎样?*/}}return0;}例十一:已知x为正整数,x*x除以(19*23)的余数是13,求解x;学习内容:1、计算机语言这种工具的局限性。2、注意运算超界intmain(intargc,char*argv[]){intx;for(x=1;x<100000;x++){if(x*x%(19*23)==13){printf("x=%d",x);break;}}return0;}例十二:判断一年是否为闰年?解法一:intmain(intargc,char*argv[]){unsignedintyear;year=2000;if((0==year%400)||(year%100!=0&&year%4==0))printf("%disleapyear",year);elseprintf("%disnotleapyear",year);return0;}解法二:辅助变量的使用intmain(intargc,char*argv[]){intleap;if(0==year%400)leap=1;elseif(0==year%100)leap=0;elseif(0==year%4)leap=1;elseleap=0;if(1==leap)printf("%disleapyear",year);elseprintf("%disnotleapyear",year);return0;}例十三:为什么闰年的规律是那个样的?模拟计算,如果不润;每四年一闰;每四年一闰,百年不闰;每四年一闰,百年不闰,四百年再补一闰;四种规则与实际年的差别。学习内容:1、能力训练2、Printf(%m.nf”)的输出格式3、If()语句intmain(intargc,char*argv[]){doubledeff_0,deff_4,deff_100,deff_400,RealYear=365.24219;inti,det4=0,det100=0,det400=0;i=1;while(i<=5000){deff_0=(365-RealYear)*i;if(0==i%4)det4++;deff_4=deff_0+det4;if(0==i%100)det100--;deff_100=deff_4+det100;if(0==i%400)det400++;deff_400=deff_100+det400;printf("\ni=%4d,%15f,%10f,%10f,%10f",i,deff_0,deff_4,deff_100,deff_400);i++;}return0;}例十四:三对情侣参加婚礼,三个新郞为A、B、C,三个新娘为X、Y、Z。有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。这人听后知道他们在开玩笑,全是假话。请找出谁将和谁结婚。*问题分析与算法设计将A、B、C三人用1,2,3表示,将X和A结婚表示为“X=1”,将Y不与A结婚表示为“Y!=1”。按照题目中的叙述可以写出表达式:x!=1A不与X结婚x!=3X的未婚夫不是Cz!=3C不与Z结婚题意还隐含着一夫一妻,则有:x,y,z三个值各不相同;学习内容:1、客观事物到计算机变量的映射2、计算机用于推理的展示3、字符型常量的表示和应用voidmain(){intx,y,z;for(x=1;x<=3;x++)/*穷举x的全部可能配偶*/for(y=1;y<=3;y++)/*穷举y的全部可能配偶*/for(z=1;z<=3;z++)/*穷举z的全部可能配偶*/if(x!=1&&x!=3&&z!=3&&x!=y&&x!=z&&y!=z)/*判断配偶是否满足题意*/{printf("Xwillmarryto%c.\n",'A'+x-1);/*打印判断结果*/printf("Ywillmarryto%c.\n",'A'+y-1);printf("Zwillmarryto%c.\n",'A'+z-1);}}例十五:字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….学习内容:1、getchar()2、switch3、逻辑运算符的优先级intmain(intargc,char*argv[]){charc;longtotal_counter=0,a_counter=0,b_counter=0,c_counter=0,e_counter=0;while(c!='`'){c=getchar();if(c>='a'&&c<='z'||c>='A'&&c<='Z'){total_counter++;switch(c){case'a':case'A':a_counter++;break;case'b':case'B':b_counter++;break;case'c':case'C':c_counter++;break;case'e':case'E':e_counter++;break;}}}printf("pa=%f,pb=%f,pc=%f,pe=%f",(double)a_counter/total_counter,(double)b_counter/total_counter,(double)c_counter/total_counter,(double)e_counter/total_counter);return0;}例十六:字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….z出现的频率。学习内容:1、数组定义与使用2、字符常量的概念和使用intmain(intargc,char*argv[]){charc='0';longtotal_counter=0,a_zCounter[26];inti;for(i=0;i<26;i++)a_zCounter[i]=0;while(c!='`'){c=getchar();if(c-'a'<26&&c-'a'>=0){total_counter++;a_zCounter[c-'a']++;}elseif(c-'A'<26&&c-'A'>=0){total_counter++;a_zCounter[c-'A']++;}}printf("\n");for(i=0;i<26;i++){printf("p%c=%f,",i+'a',(double)a_zCounter[i]/total_counter);}return0;}例十七牛顿截玄法解一元高次方程学习内容:1、函数的定义(函授的黑箱性、模块性)2、函数的使用(参数、返回值、return语法及语句作用)3、牛顿截玄法4、体会计算机的能力和魅力自顶向下、逐步细化模块设计、结构编码doubley(doublex){doublet;//t=x*x*x-5*x*x+16*x-80;t=x*x*x*x*x-5*x*x*x+16*x-80;returnt;}doublexpoint(doublex1,doublex2){doublex;x=(x1*y(x2)-x2*y(x1))/(y(x2)-y(x1));returnx;}doubleroot(doublex1,doublex2){doubley1,x,y0;y1=y(x1);x=xpoint(x1,x2);y0=y(x);while(y0>0.0000001||y0<-0.000001)/*当y的绝对值〉小量就循环*/{x=xpoint(x1,x2);y0=y(x);if(y1*y0>0){y1=y0;x1=x;}else{x2=x;}}returnx;}intmain(intargc,char*argv[]){printf("x=%14.13lf",root(0,100));return0;}例十八用数组实现斐波纳妾数列学习内容:1、数组使用intmai
c=a*c;
i=i*i;
printf("\nc=%f",c);
if(c-b==0)
printf("==0");
printf("!
=0");
return;
由于历史上的原因,多数教材和参考书上会介绍一些具有“小技巧”的“短小”、“精炼”的例子程序,并说明这样写的程序如何“高效”,即执行速度快或节省内存。
实践表明现在用一些小‘技巧’写出这样‘短小’、‘精悍’的程序已经过时了,不是现代主流软件产业所要求的了,新时期的主流要求是‘代码的可维护性’,即一个人写的代码易于让另外的人理解并修改。
这背后的原因主要基于两个事实:
1、判断一段代码正确与否所花的时间可能要比编写这段代码所花的时间要长。
2、软件产业的现状和要求是‘铁打的营盘,流水的兵’,即软件人才的流动性很大,但软件产品的生存期要很长,比如‘瑞星’杀毒软件已经在市场立足10多年,但又有多少程序员能在同一个公司、同一个产品上编10年代码?
这就要求你写的代码必须要可读性强、易于修改。
试想充满‘技巧’和‘个性’的长篇程序代码如何让人读懂和修改?
如何让人接手?
”所以同学们刚开始学习编程语言时就要培养写“可读性强”,“易于修改”程序的意识和习惯。
习惯一些好的编程规范:
如写程序要用“缩进”体现出层次;多写程序注释;不要写if(a==0),要写if(0==a),以防止忘记一个“=”;if,while,for等不管后面是否为复合语句,一律加上“{}”,这目的就是为了可读性;定义指针就初始化为常量int*p=NULL,杜绝野指针的存在;少用全局变量……。
例七:
绯波纳锲数列
能想明白的事情表达成算法的练习。
unsignedlongan,an_1,an_2,n=3;
an_1=1;
an_2=1;
n=3;
while(n<=20)
an=an_1+an_2;/*①*/
printf("\na[%d]=%ld,%f",n,an,1.0*an/an_1);/*②*/
an_2=an_1;/*③*/
an_1=an;/*④*/
n++;
return0;
1、③、④句调换会结果会是什么?
2、②句挪到④后结果会怎样?
3、②句中为何用“*1.0”?
例八:
已知pi/4=1-1/3+1/5-1/7+1/9………求pi的值
1、学习找规律
2、表达你所发现的规律
doublef,sum;
ints;
f=1.0;
sum=0;
s=1;
while(f<20000000000)
sum=sum+1.0/f*s;
f=f+2.0;
s=s*-1;
printf("pi=%15.14f",sum*4);
例九:
输入一个数,判断这个数是不是质数(也叫素数,即除了1和本身外无其他因子)
语法break的作用和使用:
结束该循环!
训练能力:
小学时,给你一个数,你就能判断它是不是一个质数。
现在你把这个判断过程用计算机语言表达出来!
unsignedintx,i;
scanf("%d",&x);
for(i=2;i<=x/2;i++)
{if(x%i==0)
break;
if(i<=x/2)
printf("%disnotaprime",x);
printf("%disaprime",x);
return1;
例十:
“今有物不知其数,三三数之剩二;五五数之剩三,七七数之剩二;问物几何?
”
1、用“穷举”法求解一些问题。
“穷举”法非常常用!
2、算符“%”;
3、算符“&&”;
{intx;
for(x=1;x<10000;x++)
{if(x%3==2&&x%5==3&&x%7==2)
{printf("x=%d",x);
break;/*去掉break会怎样?
例十一:
已知x为正整数,x*x除以391(17*23)的余数是13,求解x;
2、算符优先级;
for(x=1;x<100000;x++)
{if(x*x%(17*23)==13)
已知x为正整数,x*x除以(19*23)的余数是13,求解x;
1、计算机语言这种工具的局限性。
2、注意运算超界
{if(x*x%(19*23)==13)
例十二:
判断一年是否为闰年?
解法一:
unsignedintyear;
year=2000;
if((0==year%400)||(year%100!
=0&&year%4==0))
printf("%disleapyear",year);
printf("%disnotleapyear",year);
解法二:
辅助变量的使用
intleap;
if(0==year%400)
leap=1;
elseif(0==year%100)
leap=0;
elseif(0==year%4)
if(1==leap)
例十三:
为什么闰年的规律是那个样的?
模拟计算,如果不润;每四年一闰;每四年一闰,百年不闰;每四年一闰,百年不闰,四百年再补一闰;四种规则与实际年的差别。
1、能力训练
2、Printf(%m.nf”)的输出格式
3、If()语句
{doubledeff_0,deff_4,deff_100,deff_400,RealYear=365.24219;
inti,det4=0,det100=0,det400=0;
while(i<=5000)
{deff_0=(365-RealYear)*i;
if(0==i%4)det4++;
deff_4=deff_0+det4;
if(0==i%100)det100--;
deff_100=deff_4+det100;
if(0==i%400)det400++;
deff_400=deff_100+det400;
printf("\ni=%4d,%15f,%10f,%10f,%10f",i,deff_0,deff_4,deff_100,deff_400);
i++;
例十四:
三对情侣参加婚礼,三个新郞为A、B、C,三个新娘为X、Y、Z。
有人不知道谁和谁结婚,于是询问了六位新人中的三位,但听到的回答是这样的:
A说他将和X结婚;X说她的未婚夫是C;C说他将和Z结婚。
这人听后知道他们在开玩笑,全是假话。
请找出谁将和谁结婚。
*问题分析与算法设计
将A、B、C三人用1,2,3表示,将X和A结婚表示为“X=1”,将Y不与A结婚表示为“Y!
=1”。
按照题目中的叙述可以写出表达式:
x!
=1A不与X结婚
=3X的未婚夫不是C
z!
=3C不与Z结婚
题意还隐含着一夫一妻,则有:
x,y,z三个值各不相同;
1、客观事物到计算机变量的映射
2、计算机用于推理的展示
3、字符型常量的表示和应用
voidmain()
intx,y,z;
for(x=1;x<=3;x++)/*穷举x的全部可能配偶*/
for(y=1;y<=3;y++)/*穷举y的全部可能配偶*/
for(z=1;z<=3;z++)/*穷举z的全部可能配偶*/
if(x!
=1&&x!
=3&&z!
=3&&x!
=y&&x!
=z&&y!
=z)/*判断配偶是否满足题意*/
printf("Xwillmarryto%c.\n",'A'+x-1);/*打印判断结果*/
printf("Ywillmarryto%c.\n",'A'+y-1);
printf("Zwillmarryto%c.\n",'A'+z-1);
例十五:
字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….
1、getchar()
2、switch
3、逻辑运算符的优先级
charc;
longtotal_counter=0,a_counter=0,b_counter=0,c_counter=0,e_counter=0;
while(c!
='`')
c=getchar();
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
total_counter++;
switch(c)
case'a':
case'A':
a_counter++;break;
case'b':
case'B':
b_counter++;break;
case'c':
case'C':
c_counter++;break;
case'e':
case'E':
e_counter++;break;
printf("pa=%f,pb=%f,pc=%f,pe=%f",(double)a_counter/total_counter,(double)b_counter/total_counter,(double)c_counter/total_counter,(double)e_counter/total_counter);
例十六:
字母频率的统计(只统计a-z26个英文字母),即一片英文文章中,a出现的频率,b出现的频率…….z出现的频率。
1、数组定义与使用
2、字符常量的概念和使用
charc='0';
longtotal_counter=0,a_zCounter[26];
inti;
for(i=0;i<26;i++)a_zCounter[i]=0;
if(c-'a'<26&&c-'a'>=0)
a_zCounter[c-'a']++;
elseif(c-'A'<26&&c-'A'>=0)
a_zCounter[c-'A']++;
printf("\n");
for(i=0;i<26;i++)
{printf("p%c=%f,",i+'a',(double)a_zCounter[i]/total_counter);
例十七牛顿截玄法解一元高次方程
1、函数的定义(函授的黑箱性、模块性)
2、函数的使用(参数、返回值、return语法及语句作用)
3、牛顿截玄法
4、体会计算机的能力和魅力
自顶向下、逐步细化
模块设计、结构编码
doubley(doublex)
{doublet;
//t=x*x*x-5*x*x+16*x-80;
t=x*x*x*x*x-5*x*x*x+16*x-80;
returnt;
doublexpoint(doublex1,doublex2)
x=(x1*y(x2)-x2*y(x1))/(y(x2)-y(x1));
returnx;
doubleroot(doublex1,doublex2)
{doubley1,x,y0;
y1=y(x1);
x=xpoint(x1,x2);
y0=y(x);
while(y0>0.0000001||y0<-0.000001)/*当y的绝对值〉小量就循环*/
{x=xpoint(x1,x2);
if(y1*y0>0)
{y1=y0;x1=x;
}else
{x2=x;
printf("x=%14.13lf",root(0,100));
例十八用数组实现斐波纳妾数列
1、数组使用
intmai
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1