第一篇:2011年春学期C语言程序设计教学总结
2011年春学期C语言程序设计教学总结
C语言程序设计作为电子专业的一门新开的专业基础课,旨在为学生后续学习单片机打下基础。它对培养学生的逻辑思维能力、理解能力、自学能力等方面有着很重要的作用。学习《C语言程序设计》课的目的有二: 一是建立起对计算机的初步了解,学习计算机的基本知识;二是能够应用C语言编制程序,以解决实际问题。因此,这门课既是一门基础课,又是一门应用课,而在这两者中,后者尤为重要,也就是说,要以应用为目的和出发点。本着这个目的,在《C语言程序设计》教学中,应注意到以下几点。对于新开课程,一切都还在摸索阶段,本学期的教学任务对我这个刚踏上讲台的信任来说又提出了新的要求,这个学期我从事的是三个班级的C语言程序设计教学工作,分别为09电子班、11电子1班和11电子2班。
通过对课堂的观察、与学生的交流、实践总结的填写、及完成项目的情况,发现部分学生上课时都能听懂,可到自己动手操作时却脑子却一片空白,无从下手,出现了听得懂、编不出的现象。其原因不外乎以下几方面:首先,对语句语法的理解不够深刻。学生对于一些基本语句的使用、语法的规则,掌握不够,随着学习的深入,把新知识掌握了却把旧知识遗忘了。比如,少数学生对于使用频率高的自定义函数仍不能正确的定义与调用;学生完成了难度较大的贪食蛇,再做通讯录时,却不能正确运用标准的输入输出函数。其次,C语言强调的是模块化的思想,而学生习惯于顺序编程的思维方式。而有的学生比较依赖老师,老师讲多少就学习多少,这样会使学生的编程思想嵌入固定的模式中,学生也减少了思考的机会。再次,学生在学习C语言时,开始是积极的,但随着项目内容的深入,有的内容需要记忆、思考,难度增大了,兴趣就减退了,调动不起积极性,觉得学习C语言很难。
从本学期开课以来,随着课程的逐步深入,这学期的C语言程序设计各个项目都按照预定计划顺利开展,随着本学期的结束,我感触颇多,无论是从教学对象、教学内容、教学过程,还是教师的课堂教学设计,都出现新的变更,学生有最开始的呗引领入门至兴趣日益曾浓,通过平常学生反馈的信息可以得出以下几点总结:
1、注意培养学生的学习兴趣 为使初学者能尽快地掌握计算机知识,进入计算机的应用领域,在课程讲授过程中,要特别注意培养学生的学习兴趣。初接触计算机时,很多学生感到新奇、好玩,这不能说是兴趣,只是一种好奇。随着课程的不断深入,大量的规则、定义、要求和机械的格式出现,很容易使一部分(甚至是大部分)学生产生枯燥无味的感觉。为了把学生的好奇转化为学习兴趣,授课时要改变过去先给出定义和规则的讲授办法,而是从具体问题入手,努力把枯燥无味的“语言”讲的生动,活泼。在第一节课上,就给学生找一些数学已学课程的问题,用算法语言来求解,使学生体会程序设计的用途和一种全新的解决问题的方法。在课程的进行中,引导学生学一种算法,就尝试在同行课程中应用。此外,还可经常介绍一些趣味性算例,如:“菲波纳契兔子问题”,“水仙花数”,“竞赛记分”等,培养学生的学习兴趣,让大家积极主动,自觉独立地获取知识,打好学习程序设计语言的基础。整个教学过程中应该把解题思路,方法和步骤(即“算法”)当作授课的重点,从而让学生明白如何分析并解决实际问题,逐渐培养学生进行程序设计的正确思维模式。
2、注重学生的接受能力
注重课堂教学中学生的接受能力,通过批改作业,掌握学生学到多少,然后根据不同的情况有的放矢地讲解。实践课重在培养学生的实践能力,学生只有勤于动脑,亲自实践,才能真正体会到其中的奥妙。在开始设计一个项目时,同学们普遍觉得比较难。对于学生在编程过程中好的算法,及时给予肯定、表扬,并鼓励学生,有难度才有挑战,把完成项目当作学习,也当作对自己能力的培养。完成一个项目,同学们都有这样的体会:原来这个项目是这么简单。虽然开始有点难,但是只要自己跟着老师的步伐,多思考,多看书,对自己的程序反复调试,都可以做出来。对学生在程序调试过程中出现的的问题,只要学生能够通过自己努力解决的问题,只是给学生提示一下错误出现的哪个位置,尽量让学生自己去解决;对于学生确实不能解决的问题,提示知识点,再给予解答,这样培养了学生自主探究问题、合作学习、解决问题的能力,还教给他们学习的方法而不是仅仅传授给他们知识,要让他们学会学习,发掘学生自身潜能。
3、教给学生思考问题的方法
教给他们思考问题的方法,在讲课时,着重从三方面入手:一是帮助同学归纳总结已学过的知识,使之系统化,在理性认识上得到更进一步的提高。二是根据同学们学习中遇到的疑难问题,重点分析一些具有代表性的例题,通过现成的例子举一反三,不仅仅讲懂一个程序,更重要的是讲解思考问题的方法,设计程序的思路,使学生拿到一个题目后知道,应该怎样分析题目,怎样一步步展开,解决问题的关键是什么。引导学生们不要采取死记硬背的方法,提倡把课程学活。把注意力放在解决问题的思路上和提高解决问题的能力上。三是选一些典型的题目,老师和学生共同探讨不同的编程方法,活跃解题思路,人人开动脑筋,对同一个题目从不同的角度去考虑,运用学过的知识,用不同的方法去解决,然后再系统讲解。这样既能充分调动同学们学习的主动性和积极性,活跃学习空气,又能在同学之间起到一个互相学习和交流的作用。根据教学内容和学生的实际水平,在教学的过程中,适时地根据项目演示结果,提出问题,启发引导学生去分析问题,解决问题,提问以达到理解、掌握知识,提高思想觉悟的目的。在新旧知识的衔接点上提出问题,以旧知识引出新知识,引导学生思考,回忆旧知识,并在旧知识基础上理解新知识;在分析项目的实现过程、项目的重点、难点时提出问题,就像导游将游览路线、游览对象的精华描述给游客。
4、合理安排时间
合理安排时间,让同学们有尽可能多的上机实习机会。语言课是一门实践很强的课,是否能学好的标志是能否编出正确的程序,因此在学习过程中,除了要多做习题外,还必须要多上机实习,在实习中发现问题并解决它,有些问题在纸上搞不清楚,一上机运行就清楚了。在学生理解项目思想、确定项目的算法后,有针对性地对项目中涉及的知识点进行讲解,对于那些学生自己能完成的内容,少讲、只做提示,甚至不讲;每次课留足够的时间让学生尽可能多地实践操作,同时加强巡查辅导,及时发现和纠正学生的错误。对于出现率高的,适时进行集中讲解。
任何教学方法只有在一定的条件下才会显示出优势或不足,任何一种教学方法都有其适用范围。要教好一门语言的实践课,关键在于激发学生的学习兴趣,让学生主动、愉快地学习,满足他们的求知欲,这样才能取得良好的教学效果,这也是我以后的教学工作的一大目标。
第二篇:《C语言程序设计》教学总结
《C语言程序设计》教学总结
C语言是计算机专业的一门专业课,它以其处理功能丰富,表达能力强,使用方便灵活,执行效率高,既具有高级语言的特点,又具有汇编语言的特点,因而成为国内外使用较广泛的语言之一。本人于2002-2003第二学期担任本课程的教学,在教学中注重面向应用、重视实践、结合成人学生的特点由于此课程是该班开的第一门语言课,因此在讲授中按照循序渐进、逐步深入的原则来安排、难点分散使学生不会感到太困难,从而树立学习的自信心。经过一学期的教学实践,学生基本掌握了C语言的基本内容,会编写简单的C语言程序,为后续课程奠定了基础。
二零零三年六月
第三篇:C语言程序设计
1.Problem A: Hello world!Description Xiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。三兄弟放学回家,父母分别跟他们打招呼。
Input 无
Output 请输出: Hello Da_min, Hello Er_min, Hello Xiao_ming!
Sample Input Sample Output Hello Da_min, Hello Er_min, Hello Xiao_ming!
HINT 请注意换行符
Append Code #include
printf(“Hello Da_min,n”);
printf(“Hello Er_min,n”);
printf(“Hello Xiao_ming!n”);} 2.Problem B: 求圆的面积和周长 Description 从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。
Input 输入一个浮点型数据,有效数字不会超过十进制的6位。
Output 输出为两行。
第一行为圆的面积,第二行为圆的周长,格式见sample。
Sample Input 3
Sample Output Area: 28.260000 Perimeter: 18.840000
HINT 了解浮点类型的输入、输出和算术运算符
Append Code 法一
#include
#include
double r;
scanf(“%d”,&r);
printf(“Area: %lfn”,pi*r*r);
printf(“Perimeter: %lfn”,2*pi*r);
}
3.Problem C:平均值 Description 求3个数的平均值。
Input 输入只有一行,为3个较小的整数。
Output 输出为这3个整数的平均值,保留3位小数。
Sample Input 1 2 3 Sample Output 2.000
HINT 注意除法运算对整型数据和浮点型数据是不一样的。
Append Code #include
4.Problem D: 求字符的值 Description 从键盘输入3个字符(不含双字节字符),分别输出每个字符的十进制值(ASCII码)、八进制值和十六进制值。
Input 输入为3个字符。
Output 输出为3行。
每一行为每个字符(对应输入顺序)的十进制、八进制和十六进制值,用空格分隔开。每个输出的值占3个字符,不足3个字符前面补0。
Sample Input 0 A
Sample Output 048 060 030 032 040 020 065 101 041
HINT 了解字符值的存储和整型的关系。
Append Code #include
5.Problem A: 最简单的程序 Description 输出一行“Hello world!”。
Input 无
Output Hello world!
Sample Input Sample Output Hello world!
HINT Append Code #include
printf(“Hello world!”);}
6.Problem B: 算术基本运算 Description 计算两整数x和y(0 Input 输入只有一行,格式见sample。 Output 输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sample Sample Input x = 11, y = 3 Sample Output x + y : 14 xy : %dn“,x-y); printf(”x * y : %dn“,x*y); printf(”x / y quotient: %d, remainder: %dn“,x/y,x%y); printf(”x ^ 2 : %dn“,x*x); printf(”y ^ 3 : %dn“,y*y*y);} 7.Problem C: 自增自减运算 Description C语言中有自增运算++、自减运算--,并且可以前置和后置。 编写一个程序:对输入的一个整数a,输出a++、a--、++a、--a的值。 Input 一个整数a,a是很小的整数。 Output 输出为5行,第一行为a的值,后面依次为--a、a--、a++、++a的值。 5行输出纵向a要对齐,“:”对齐,“:”前后各一个空格,后面的数值不用对齐。每行行尾都有回车。 Sample Input 0 Sample Output a : 0--a :-1 a--: 0 a++ : 0 ++a : 1 HINT Append Code #include : %dn“,a);printf(”--a : %dn“,--a);a=x;printf(” a--: %dn“,a--);a=x;printf(” a++ : %dn“,a++);a=x;printf(”++a : %dn“,++a);} 8.Problem F: 绝对值 Description 求整型数据和浮点型数据的绝对值。 Input 输入两个数,第一个是整数,第二个是浮点数。 Output 输出为两行,第一行为整数的绝对值,第二行为浮点数的绝对值,注意浮点数的绝对值不输出无意义的0。 Sample Input-1 1 Sample Output 1 1 HINT 求绝对值可以用标准库函数来完成,也可以自己判断。注意浮点数的输出格式。求绝对值的函数在哪个头文件?貌似很多人会搞错,包括很多编书的人! Append Code #include int n; float m; scanf(”%d%f“,&n,&m); //n=abs(n); //m=fabs(m); if(n<0) { n=-n; } if(m<0) { m=-m; } printf(”%dn“,n); printf(”%g“,m); return 0;} 9.Problem A: 奇数还是偶数? Description 输入一个整数,判读它是奇数还是偶数。 Input 输入只有一行,为一个100以内的正整数。 Output 输出为一行。 若输入为偶数则输出“even”,奇数输出“odd”。Sample Input 30 Sample Output even HINT 用整数运算可以解决,练习“?:”表达式。 Append Code #include int n; scanf(”%d“,&n); if(n>=0&&n<=100){ if(n%2==0)printf(”evenn“); else printf(”oddn“); } return 0;} 10.Problem B: 简单的打折计算 Description 商店规定:消费满n元,可以打八八折。设某件商品标价m元,输入购买的件数x,计算出需要支付的金额(单位:元),精确到分。 Input 输入只有一行,三个整数m、n和x,且0 Sample Input 95 300 4 Sample Output 334.40 HINT 了解浮点型的输出控制,注意整型和浮点型混合运算过程中的数据类型转换。 Append Code #include int m,x,n,a; float b; scanf(”%d%d%d“,&m,&n,&x); 0 x m a=m*x; if(a>n) b=0.88*a; else b=a; printf(”%.2fn“,b); } 11.Problem C: 判断闰年 Description 输入一个正整数的年份,判断是否为闰年。 Input 输入只有一行,为一个10000以内的正整数。 Output 输出为一行。 若输入为闰年偶数则输出“Yes”,否则输出“No”。 Sample Input 2010 Sample Output No HINT 了解逻辑运算符和关系运算符。 Append Code #include int x; scanf(”%d“,&x); if(x>0&&x<10000) { if(x%4==0&&x%100!=0) printf(”Yesn“); else if(x%400==0) printf(”Yesn“); else printf(”Non“); } else printf(”error“);} 12.Problem D: 水仙花数 Description 如果一个三位十进制数等于其各位数字的立方和,则称这个数为水仙花数。如:13+53+33=153。 Input 一个整数x,100<=x<=999。 Output x是水仙花数,则输出“YES”,否则为“NO”。 Sample Input 153 Sample Output YES HINT Append Code #include int a,b,c,x; scanf(”%d“,&x); a=x/100; b=x/10%10; c=x%10; if(x==a*a*a+b*b*b+c*c*c) printf(”Yes“); else printf(”No“);} 13.Problem E: 三个数比较大小 Description 从键盘上输入0~100之间的三个数,按从小到大的顺序输出。 Input 输入只有一行,为三个整数。 Output 按从小到大输出这三个数。 Sample Input 15 10 20 Sample Output 10 15 20 HINT 用if语句判断各种情况可以解决这个问题。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a>=b) { if(b>=c) printf(”%d %d %dn“,c,b,a); else if(c>=a) printf(”%d %d %dn“,b,a,c); else printf(”%d %d %dn“,b,c,a); } else { if(a>=c) printf(”%d %d %dn“,c,a,b); else if(b>=c) printf(”%d %d %dn“,a,c,b); else printf(”%d %d %dn“,a,b,c); } } 14.Problem F: 奇怪的求和之一 Description 给定3个正整数a、b和c,按照如下规则求和: 如果这个数字是偶数,则累加到和中; 如果这个数字是奇数,则将大于该数的最小偶数累加到和中。 Input 三个正整数,均在100以内。 Output 一个和。 Sample Input 2 3 5 Sample Output 12 HINT 如果不会使用分支语句,可使用条件运算符判断到底将哪个数累积到和中。 Append Code #include int a,b,c; scanf(”%d%d%d“,&a,&b,&c); if(a%2!=0)a++; if(b%2!=0)b++; if(c%2!=0)c++; printf(”%dn“,a+b+c); } 15.Problem G: 你过线了吗? Description 经过四年的学习,你决定报考我国著名的“285”高校之一的北青大学,经过认真的复习,残酷的考试,终于知晓了自己的考试成绩,也知道了北青大学的录取分数线,请你编程判断,自己过线了吗? Input 输入有2行,第一行有4个正整数,分别表示三门课程的分数线以及总分分数线。第二行有3个非负整数,分别表示你考的三门课程的成绩。 Output 如果你的三门课程成绩都不低于相应课程的分数线,且你的考试总分也不低于北青大学的总分分数线要求,则输出“congratulations”,否则输出“sorry”。 Sample Input 70 80 70 240 80 80 82 Sample Output congratulations HINT 如果你不会使用分支语句,同样可以使用条件运算符实现该程序。 Append Code #include int a,b,c,d,e,f,g,h; scanf(”%d %d %d %dn%d %d %d“,&a,&b,&c,&d,&e,&f,&g); h=e+f+g; if(e>=a&&f>=b&&g>=c&&h>=d) printf(”congratulations“); else printf(”sorry“);} 16.Problem I: A+B Problem(II): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入的第一行是一个整数N,后面有N对整数a和b,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的和,顺序与输入对应。 Sample Input 2 1 2 10 20 Sample Output 3 30 HINT N给出了测试样例数,用for循环处理方便。 Append Code #include int n,a,b,i;Scanf(“%d”,&n);For(i=0;i 17.Problem H: A+B Problem Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 Sample Output 3 30 HINT OJ系统上测试输入结束符为EOF(End Of File),其值为-1。用scanf()把文件所有内容读完后,会读到EOF,所以可以用来判断输入是否完成,测试时可以用Ctrl+Z产生EOF。本题解法参看FAQ。Append Code #include int a,b; while(scanf(”%d%d“,&a,&b)!=EOF){ printf(”%dn“,a+b); } return 0;} 18.Problem A: 判断是否是元音字母 Description 输入一个英文字母,判断是否是元音字母。元音字母是:a,e,i,o u,A,E,I,O,U Input 输入一个英文字母 Output 是元音字母,输出“yes”,否则输出“no”,行尾没有回车。 Sample Input A Sample Output yes HINT Append Code #include char ch; scanf(”%c“,&ch); if(ch>='A'&&ch<='Z') ch=ch+32; if(ch=='a') printf(”yes“); else if(ch=='e') printf(”yes“); else if(ch=='i') printf(”yes“); else if(ch=='o') printf(”yes“); else if(ch=='u') printf(”yes“); else printf(”no“); } 19.Problem B: 按顺序输出三个数 Description 对于输入的3个整数,按照从小到大的顺序输出。 Input 输入3个int类型内的整数,两两之间用一个空格隔开。 Output 按照从小到大的顺序输出上述三个数,两两之间用一个空格隔开。 Sample Input 2 1 3 Sample Output 1 2 3 HINT Append Code #include int a,b,c,temp; scanf(”%d%d%d“,&a,&b,&c); if(a { temp=a; a=b; b=temp; } if(a { temp=a; a=c; c=temp; } if(b { temp=b; b=c; c=temp; } printf(”%d %d %dn“,c,b,a);} 20.Problem E: Description 判断输入整数的奇偶性。 判断奇偶数 Input 输入为一个整数。 Output 输出只有一行,代表判断结果。如果输入的整数n是一个偶数,输出: n is an even number.否则输出: n is an odd number.见样例。 Sample Input 12 Sample Output 12 is an even number.HINT Append Code #include int a; scanf(”%d“,&a); if(a%2==0) printf(”%d is an even number.“,a); else printf(”%d is an odd number.“,a);} 21.Problem A: 判断两个整数的大小关系 Description 输入2个整数a和b,如果a>b,则输出1,否则输出0。 Input 两个整数a和b,均不超过int类型的表示范围。 Output 表示a>b的结果:如果a>b,则输出1,否则输出0。 Sample Input 3 4 Sample Output 0 HINT Append Code #include printf(”1“); else printf(”0“);return 0;} 22.Problem D: 成绩的等级 Description 把百分制的考试成绩转换成五级制的成绩: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之间的输入是非法数据,输出“Error”。 Input 输入多行,每行一个整数。 Output 输入所对应的成绩等级。 Sample Input-1 81 92 35 68 72 100 Sample Output Error Good Excellent Failing Pass Average Excellent HINT 用switch语句解决这个问题比较方便。 Append Code #include int score; while(scanf(”%d“,&score)!=EOF) { if(score<0||score>100) printf(”Errorn“); else { switch(score/10) { case 0: case 1: case 2: case 3: case 4: case 5:printf(”Failingn“);break; case 6:printf(”Passn“);break; case 7:printf(”Averagen“);break; case 8:printf(”Goodn“);break; case 9: case 10:printf(”Excellentn“);break; } } } return 0;} 23.Problem E: 输出是m的倍数或n的倍数、但不是 m和n的公倍数的数 Description 输出1~k之间是m的倍数或n的倍数、但不是m和n的公倍数的数,其中1<=m,n Input 输入三个整数,依次为k、m、n。 Output 从小到大输出符合题意的所有整数,两数之间用一个空格分开。 Sample Input 15 2 3 Sample Output 2 3 4 8 9 10 14 15 HINT 难点在于输出格式的控制:空格在数的中间,学会用循环时边界情况的特殊处理。 Append Code #include a=m;else a=n;printf(”%d“,a);for(i=a+1;i<=k;i++){ } if((i%m==0&&i%n!=0)||(i%n==0&&i%m!=0)) printf(” %d“,i);} return 0; 24.Problem B: 两整数相加减 Description 计算a+b和a-b。 Input 输入为一对整数a和b。a,b用空格分开。 Output 输出a+b和a-b的计算结果,各占一行。 Sample Input 1 2 Sample Output 3-1 HINT Append Code #include printf(”%dn“,a+b); printf(”%dn“,a-b);} 25 Problem C: 它满足条件吗? Description 需要判断给定的一个整数是否同时满足如下三个条件: 1.它是一个完全平方数。2.它是一个偶数。3.它是一个正数。 注:若一个数能表示成某个自然数的平方的形式,则称这个数为完全平方数。例如: 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400,441,484,529 Input 一个int范围内的整数。 Output 如果输入的数字满足条件,则输出yes,否则输出no。 Sample Input 100 Sample Output yes HINT 注意逻辑表达式判断三个条件的顺序。如果你不会使用分支语句,同样可以使用条件运算符实现该程序。 库函数sqrt()可以用于求一个数的平方根。 Append Code #include if(a==sqrt(a)*sqrt(a)&&a%2==0&&a>0) printf(”yes“); else printf(”no“);} 26.Problem F: 多路分支 Description 编写一个完整的程序,运行时向用户提问”你考试考了多少分?(0-100)“接受输入后判断其等级并显示出来等级: 优:90<=分数<=100 良:80<=分数<90 中:60<=分数<80 差:0<=分数<60 Input 输入任意一个整数分数值,显示等级;再输入任意一个整数分数值,显示等级;....直到测试数据较充分,可输入-1止。 Output 对任意输入的分数值,输出对应的等级,直到输入的数为-1时才退出运行.Sample Input 102 100 90 80 70 60 50 0-80-1 Sample Output grad must between 0 and 100 优 优 良 中 中 差 差 grad must between 0 and 100 grad must between 0 and 100 HINT Append Code #include int x; while(scanf(”%d“,&x)!=EOF) { if(x<0||x>100) printf(”grad must between 0 and 100n“); else if(x>=90) printf(”优n“); else if(x>=80) printf(”良n“); else if(x>=60) printf(”中n“); else if(x>=0) printf(”差n“); } return 0;} Problem D: 有多少人? Description 学校举行运动会,如果全体学生按照3人一队列队,则多了1个人;如果按照4人一队列队,则多了2个人;如果按照5人一队排队,则多了3个人。请问这个学校有多少学生? Input 一个int类型的正整数N,是学生人数的上界,即:该校学生数不超过N。 Output 所有可能的学生数,每个数占一行。 Sample Input 200 Sample Output 58 118 178 HINT Append Code #include int n,i; scanf(”%d“,&n); for(i==1;i<=n;i++){ if(i%3==1&&i%4==2&&i%5==3) printf(”%dn“,i);} return 0;} Problem C: 正负数各有几个? Description 输入若干个整数,求其中正数、负数的个数。 Input 输入分为2行:第一行是一个数字N>0,表示下面有N个整数。第2行是N个整数,都是int类型的。 Output 输出所输入的N个整数的正数个数和负数个数,并用空格分开2个输出。Sample Input 10 2 3 4 5-1-2-3-4-5 Sample Output 5 5 HINT 貌似还有一种叫做0的数。 Append Code #include int n,a,i,num1=0,num2=0; scanf(”%d“,&n);for(i=0;i { scanf(”%d“,&a); if(a>0) num1++; else if(a<0) num2++; } printf(”%d %dn“,num1,num2); return 0;} Problem A: A+B Problem(III): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。当测试样为0 0时表示输入结束,0 0不参与运算。 Output 每行输出一个a+b的值,顺序与输入对应。 Sample Input 1 2 10 20 0 0 Sample Output 3 30 HINT 练习break的使用。 Append Code #include { if(a!=0||b!=0) } printf(”%dn“,a+b); else break; return 0;} 30 Problem B: A+B Problem(IV): Input/Output Practice Description 计算a+b,0<=a,b<1000。 Input 输入有多对整数a和b组成,每对a和b占一行,a,b用空格分开。 Output 每行输出一个a+b的值,顺序与输入对应。每个格式样例之间用一个空行分隔开。 Sample Input 1 2 10 20 15 35 Sample Output 3 30 50 HINT 由于输出的和比空行多一个,所以全部计算放在一个循环里是不行的,必须要特殊处理开头或者结尾。 Append Code #include n++; if(n==1) printf(”%dn“,a+b); else printf(”n%dn“,a+b); } return 0;} Problem C: n个数的最大值和最小值 Description 找出n个数中最大的数和最小的数,并将它们的值输出出来。 Input 输入为n+1个整数,都在int类型范围内。这些数可能用若干空格或者换行符分隔开。输入的第1个数为n,表示后续有n个数输入。从输入的第2个数开始,求出直到第n+1个数中最大的数和最小的数。 Output 输出为两行,格式见sample。 Sample Input 3 0 1-1 Sample Output The maximum number is 1.The minimum number is-1.HINT 分隔符是空格还是回车都是空白符,对scanf(”%d“)来说没有区别;先读入n,然后用for循环就很容易控制读入n个数的过程。 Append Code #include int n,i,max,min; scanf(”%d“,&n); int a[n]; for(i=0;i scanf(”%d“,&a[i]); max=a[0]; min=a[0]; for(i=0;i { if(max max=a[i]; if(min>a[i]) min=a[i]; } printf(”The maximum number is %d.n“,max); printf(”The minimum number is %d.“,min); return 0;} 32.Problem D: 求100以内的素数 Description 素数是只能被1和自身整除的正整数,根据数学定义1不是素数。素数也叫质数。 Input 输入为两个整数m和n,满足0<=m<=n<=100。 Output 从大到小输出m~n之间的所有素数,一个素数一行。如果m~n之间没有素数,则不输出任何数。 输出的所有数在两行“=====”之间。 Sample Input 2 12 Sample Output ===== 11 7 5 3 2 ===== HINT 利用素数的数学规律可以很容易的解出此题,题目给出的数据范围是关键。 Append Code #include t=0; for(j=2;j<=sqrt(i);j++) if(i%j==0) t=1; if(t==0&&i>1) printf(”%dn“,i);} printf(”=====“);return 0;} 33.Problem E: 是否构成三角形? Description 给出三个整数,代表三条边的长度,判断这三条边的长度是否能构成一个三角形? Input 第一行是n(1<=n<=100),表示有n组测试数据 接下来有n行,每一行包含三个整数,表示三个边长(1<=边长<=100) Output 如果三条边能构成三角形,输出YES,否则输出NO Sample Input 3 1 2 3 2 8 7 20 20 1 Sample Output NO YES YES HINT Append Code #include {scanf(”%d%d%d“,&a,&b,&c); if(a+b>c&&a+c>b&&b+c>a) printf(”YESn“);else printf(”NOn“);} return 0;} 34.Problem C: 简单的整数排序 Description 对给出的若干整数按从小到大排序。 Input 输入的第一个数为n(n<=1000),后接n个整数。 Output 按从小到大的顺序输出这些整数,每两个整数之间用一个空格分隔开,最后一个整数后面没有空格。 Sample Input 10 3 9 1 5 2 8 5 6 7 3 Sample Output 1 2 3 3 5 5 6 7 8 9 HINT 排序前必须把所有的整数都存储下来。因为只有最多1000个数,1秒的时间足够任何排序算法运行处结果来。 Append Code #include int c,i,n,j; int a[1000]; scanf(”%d“,&n); for(i=0;i scanf(”%d“,&a[i]); for(i=1;i<=n-1;i++) { for(j=0;j { if(a[j]>a[j+1]) { c=a[j]; a[j]=a[j+1]; a[j+1]=c; } } } printf(”%d“,a[0]); for(i=1;i printf(” %d“,a[i]); return 0;} 35.Problem A: Description 购物的路程 Saya和Kudo一起去购物。假定她们逛的街是一条直线,而商铺是这条直线上的一些点。她们将车停在该直线最左端的店铺处,然后从左向右开始逛每一个店铺,然后从最右边的店铺再返回到停车处。你的任务是计算她们走了多少路。 Input 输入有多组。每一组的第一行是N(0 Output 对每组输入,输出她们走的路长。 Sample Input 4 13 89 37 6 7 30 41 14 39 42 0 Sample Output 152 70 HINT Append Code #include int n,i,max,min,a[100001]; while(scanf(”%d“,&n)&&n!=0) { scanf(”%d“,&a[0]); min=max=a[0]; for(i=1;i { scanf(”%d“,&a[i]); if(a[i]>max) max=a[i]; if(a[i] min=a[i]; } printf(”%dn“,(max-min)*2); } return 0;} 36.Problem B: 求累加和 Description 编程求min~max的累加和(含min和max),其中max>=min>0。部分程序已经给出,请填充其中的空白语句,并提交填充后的完整程序。 Input 输入为多行。第一行是一个整数N>0,表示后面有N个测试用例。后面有N行,每行包含2个整数,分别是min和max。 Output 输出为N行,每个测试用例的计算结果占据一行。每行的格式为: case i:sum=s.其中i表示测试用例的编号(从1开始),s是该测试用例对应的累加和(设不超过int的表示范围)。 Sample Input 3 1 10 1 100 1 1 Sample Output case 1:sum=55.case 2:sum=5050.case 3:sum=1.HINT Append Code #include int n,i,j,max,min,sum; scanf(”%d“,&n); for(i=0;i { sum=0; scanf(”%d%d“,&min,&max); if(max==min) printf(”case %d:sum=%d.n“,i+1,min); else { for(j=min;j<=max;j++) sum=sum+j; printf(”case %d:sum=%d.n“,i+1,sum); } } return 0;} 37.Problem G: 顺序输出字母 Description 按字母顺序输出两个字母st和ed之间的所有字母,但不包括st和ed。不输出逆序。 Input 两个字母st和ed,都是大写字母,用一个空格分开。 Output 在一行内按顺序输出st和ed之间的所有字母,但不包括st和ed。例如: 输入为A和E,则输出为BCD; 输入为A和B,则什么字母也不输出,只有一个空行; 输入为E和A,也是什么字母也不输出,只有一个空行。最后要输出一行(行尾不回车): ***END*** Sample Input A C Sample Output B ***END*** HINT Append Code #include char st,ed,a; int i; scanf(”%c%c%c“,&st,&a,&ed); { for(i=st+1;i printf(”%c“,i); printf(”n***END***“); } return 0;} 38.Problem F: 单字母变换 Description Tom和Jack是密码学爱好者,他们在聊天时经常使用一些暗语。他们使用的一种最简单的暗语是:将要说的每句话里面的英文字母变成这个字母之后的某个字母。现在要求你写一个程序,将一个字母变成它之后的某个字母。 Input 输入有2个:一个大写字母c和一个正整数d(0 Output 输出字母c之后的第d个字母。大小写与c一致。如果c之后的某个字母已经超出'Z',则再从字母'A'开始计数。 如:c='A',d=3,则输出应为:D。若:c='Y',d=3,则输出应为:B。 Sample Input A 3 Sample Output D HINT Append Code #include char c; int d; scanf(”%c%d“,&c,&d); if(c+d<='Z') printf(”%c“,c+d); else printf(”%c“,c+d-26); return 0;} 39.Problem B: 登录密码验证 Description 编写一个程序,模拟用户登录系统的密码验证过程。系统提供给用户的密码长度最长为20个字符,若密码输入错误可以再次输入。但为了保证用户密码安全,若连续输入密码错误超过5次就会锁定账号一段时间。 Input 输入为若干个串,至EOF结束。输入的第一个串是用户的正确密码,后面的串为模拟用户登录时的输入的密码。 Output 每次输入错误的密码,输出一个“Wrong!”,若输入的密码为正确的,输出一个“Welcome!”,并结束密码测试。若前5次输入的密码都是错误的,则后面的输入中不管是否有正确的密码都输出“Out of limited!”。 Sample Input abcdefg 123456 kkkkkkkk abcdefg Sample Output Wrong!Wrong!Welcome! HINT 输入可以用scanf(”%s“)处理,密码比较用字符串的比较可以完成。 Append Code #include char a[20],b[20]; int i,j=1; scanf(”%s“,a); while(scanf(”%s“,b)!=EOF) { if(j<=5) { if((strcmp(a,b)==0)) { printf(”Welcome!n“); break; } else printf(”Wrong!n“); j++; } else printf(”Out of limited!n"); } } 40.Problem C: 兔子的繁殖问题 Description 假设一对兔子每月能生一对小兔(一雌一雄),每对小兔出生后的下一个月是没有繁殖能力的,至出生后的第三个月开始又可以每月生一队小兔,问从一对刚出生的小兔开始,经过若干个月后一共有多少兔子(假设在此过程中兔子没有死亡)? 这个问题是意大利数学家菲波那契(Fibonacci)在他1202年出版的《算盘全书》中提出来的,从第一对刚出生的小兔开始每月的兔子数被乘坐菲波那契序列。 Input 输入的第一个数为n,接下来有n个数字。每个数字为一个月份m(m<=45)。 Output 输出为n行,每行为第m个月后的兔子总数。 《C 语言程序设计》主要在计算机软件、计算机网络、计算机应用、通信技术、智能电子、电子信息工程、多媒体以及核工程与核技术等专业中开设,是电子信息类、机械类等工科专业的重要专业基础课。 本校从2001至今,每年都开设《C语言程序设计》课程,由于,我校最开始时的特殊情况,主要把重点放在C语言中的各类重点、难点的语法、语义上,使得学生经过比较复杂和痛苦的过程后,对C语言在使用上很难做到自己编写程序。而且很多学生产生了畏惧心理。 2004年,学院成立计算机科学与技术系,为了更好学习和掌握C语言,计算机科学与技术专业和计算机维护专业(计算机应用技术前身)除了开设《C语言程序设计》课程外,在后续一学期还开设了《C语言程序设计课程设计》,使得计算机专业学生编程思想和能力得到了极大提高。 2005年,为了让我院工科学生更好的掌握C语言编程以及通过四川省计算机二级考试,在《C语言程序设计》课程后设置《C语言程序设计课程设计》,极大地提高了学生的动手机会和能力,过级率显著提高! 2007年,依托我校建设精品课程的契机,我们将C语言中的各个知识点进行重新规整,提出适用于三本院校学生的语言设计学习的方法。我们提出,先了解C语言,再学习C语言,再用C语言的思想。即在开始时让学生初步知道C语言,然后引入比较简单的运算符以及基本输入、输出和简单的顺序结构程序设计。通过这样的方式,我们发现,学生在C语言的学习就不会从开始的时候陷入大量难懂的语法、语义和数据结构中。有了以上铺垫再层层进入,最终进入复杂的各类数据结构以及指针等学习。通过以上的内容规整后,教学效果有明显提高。 《C语言程序设计》教学基本知识点 第一章 C语言基本知识 1.C源程序的框架 尽管各个C源程序的功能千变万化,但框架是不变的,主要有:编译预处理、主函数()、函数n()等,主函数的位置不一定在最前面,可以在程序的中部或后面,主函数的名字固定为main。 2.C语言源程序的书写规则: (1)C源程序是由一个主函数和若干个其它函数组成的。(2)函数名后必须有小括号,函数体放在大括号内。(3)C程序必须用小写字母书写。(4)每句的末尾加分号。(5)可以一行多句。(6)可以一句多行。 (7)可以在程序的任何位置加注释。3.语句种类 语句是程序的基本成分,程序的执行就是通过一条条语句的执行而得以实现的,根据表现形式及功能的不同,C语言的基本语句可以分为五大类。(1)流程控制语句 流程控制语句的功能是控制程序的走向,程序的流程有三种基本结构:顺序结构、分支结构和循环结构,任何复杂的程序都可以由这三种基本结构复合而成。其中后两种结构要用特定的流程控制语句实现。(2)表达式语句 表达式语句的形式是:表达式;,即表达式后跟一分号“;”,分号是语句结束符,是一个语句必不可少的成分。表达式和表达式语句的区别在于表达式代表的是一个数值,而表达式语句则代表一种动作。最常见的表达式语句是赋值语句。(3)函数调用语句 函数调用语句实际上也是一种表达式语句,形式为:在一次函数调用的小括号后面加上一个分号。(4)空语句 空语句的形式就是一个分号,它不代表任何动作,常常作为一个意义转折点使用。(5)复合语句 复合语句从形式上看是多个语句的组合,但在语法意义上它只相当于一个语句,在任何单一语句存在的地方都可以是复合语句。注意复合语句中最后一个语句末尾的分号不能少。复合语句右大括号后面没有分号。4.运算符 用来表示数据各种操作的符号称为运算符。运算符实际上代表了一种类型数据的运算规则。不同的运算符具有不同的运算规则,其操作的数据类型必须符合该运算符的要求,运算结果的数据类型也是固定的。 根据参加操作的数据个数多少,可以将C语言的运算符分为单目运算符,双目运算符和三目运算符(三目运算符只有条件运算符一个)。 根据运算对象和运算结果的数据类型可分为算术运算符、关系运算符、逻辑运算符等。5.表达式 表达式是由常量、变量、函数,通过运算符连接起来而形成的一个算式。一个常量,一个变量或一个函数都可以看成是一个表达式。表达式的种类有: 算术表达式、关系表达式、逻辑表达式、赋值表达式、字位表达式、强制类型转换表达式、逗号表达式(顺序表达式)、条件表达式、指针表达式。6.数据的输入/输出 C语言本身没有输人/输出语句,数据的输入/输出是通过调用库函数来实现的。 第二章 数据类型知识点 划分数据类型的意义是编译系统对每个不同类型的数据在内存中分配的字节数不同,不同类型的数据可以按规定参加不同类型的运算。1.C语言的数据类型 数据类型有:整型、字符型、实型单精度型、双精度型、构造类型数组类型、结构体类型、共用体类型、枚举类型、指针类型、空类型,其中整型、实型、字符型是C语言中的基本类型。 2.各种类型数据的定义方法 定义形式:数据类型 变量名1,变量名2,„„变量名n; 3.常量与变量 (1)常量——在程序执行期间其值不变的量。它不能被赋值。(2)变量——在程序运行期间其值可以改变的量。4.各种类型数据的混合运算 各类数据运算前会自动转换成同一类型。规律如右图示:从右向左的箭头表示必定的转换,如float型数据运算前化成double型,以提高运算精度,结果也为double型,short或char型数据运算前化成int型,结果也为int型;从下向上的箭头表示转换方向是向级别高的靠拢。 5.强制类型变换 当我们需要对数据进行类型变换,而机器又不能自动完成时,就要用强制类型变换,形式为:(数据类型符)(被转换对象)。 第三章 选择知识点 C语言中实现选择结构的控制语句有两种:条件分支语句if和开关分支语句switch。1.if语句的三种形式:(1)if(表达式)语句;(2)if(表达式)语句1;else语句2;(3)if(表达式1)语句1;else if(表达式2)语句2;else if(表达式3)语句3;„ else if(表达式n)语句n;2.开关分支语句switch(1)形式 switch(表达式){ case e1:语句1;break;case e2:语句2;break;case e3:语句3;break;„„ case en:语句n;break;default :语句n+1;}(2)功能 当表达式的值等于e1时,执行语句1; 当表达式的值等于e2时,执行语句2; „„ 当表达式的值等于en时,执行语句n; 当表达式的值与常量e1、e2„„en谁都不等时,就执行default后的语句 第四章 循环知识点 循环就是在程序执行过程中,反复多次的执行同一段程序。C语言中有三种循环语句。1.while循环语句 形式为:while(表达式){ 循环体 }; 执行过程是:先计算表达式的值,当表达式的值非0时就执行循环体,之后再判断表达式的值,且重复以上过程;当表达式的值为0时就结束循环。2.do--while循环语句 形式为:do { 循环体 } while(表达式); 执行过程是:先执行循环体一次,再判断表达式的值,当表达式的值非0时就再执行循环体,之后再判断表达式的值,且重复以上过程;当表达式的值为0时就结束循环。3.for循环语句 形式为:for(表达式1;表达式2;表达式3){ 循环体 } 4.三种循环语句的比较 三种循环语句可以完成同一件事,可任选其一。 使用while和do--while循环时,要提前给循环变量赋初值。而for循环是在表达式1中赋初值的。 while循环和for循环都是先判断条件后执行循环体,有可能一次也不执行循环体,do--while循环是先执行循环体,后判断条件,即循环体至少也得执行一次。for循环不限于计数循环,其循环条件可以是逻辑表达式和字符表达式等。5.循环嵌套 三种循环控制语句可以互相嵌套,即在一个循环体内部又可以出现另一循环,这种嵌套在理论上来说可以是无限的。注意必须是一个循环完整的套住另一个循环。6.break语句 break语句只能出现在三种循环语句和switch多分支语句中,其作用是用来中断这四种语句的执行。当程序执行到break语句时,会跳出break语句所在的循环或switch分支,而直接执行紧跟在它们后面的语句。7.continue语句 continue语句只能出现在三种循环语句中,当程序执行到continue语句时,其作用是提前结束本次循环,自动跳过循环体中后半部剩余的语句的执行,而直接回到循环条件判断。根据判断的结果决定是否继续执行下次循环。8.goto 语句 goto语句是一种非结构化语句,其作用是使程序的执行无条件的转移到某一处。使用格式为: goto 标号;利用goto语句与if条件语句配合,也可以实现条件循环。C语句允许在任何语句前添加标号,作为跳转目标,标号的构成是标识符后面加一个“:”。 第五章 数组知识点 数组就是同类型的一批数据的集合,用一个变量名存放,区分各元素的办法是用下标。1.一维数组 类型说明符数组名[数组长度]; (1)数组命名要符合标识符的命名规则。 (2)数组名后的括号必须是方括号,不能是圆括号。 (3)数组长度必须是正整数,可以是个表达式,但不能有变量,C语言不支持动态数组。(4)数组长度表示数组中元素的个数 (5)数组元素的下标从0开始数,所以最大下标是数组的长度减1。2.多维数组(以二维为例)类型说明符数组名[第一维长度][第二维长度];(1)数组命名要符合标识符的命名规则。 (2)数组名后的括号必须是两个方括号,定义时不能写成inta[3,4]。(3)数组长度必须是整型常量表达式。 (4)第一维长度表示数组行数,第二维长度表示数组列数。(5)每个数组元素都有两个下标,第一维表示该元素所在的行,第二维表示该元素所在的列,每一维的下标都从0开始数。二维数组的初始化:C语言规定只有静态数组和外部数组才允许在定义时赋初值,赋初值形式如下: static类型说明符数组名[第一维长度][第二维长度]={初值表}; 二维数组的引用:二维数组不能整体引用,要引用数组的单个元素,形式为:数组名[下标][下标]和普通变量的使用无任何区别。3.字符数组 C语言中没有字符串变量,字符串是靠字符数组实现的,所谓字符数组就是元素的数据类型为字符型的数组。 (1)字符数组的定义形式:char数组名[数组长度]; 因为C语言中的整型数据和字符型数据是相通的,所以也可以这样定义:int数组名[数组长度]; (2)字符数组的初始化:给字符数组的初始化有两种方式,一种是用字符常量,另一种是用字符串。形式如下: staticchar数组名[数组长度]={字符常量表}; staticchar数组名[数组长度]={字符串常量}; 4.数组与函数 数组经常作为函数的参数,数组做函数的参数有两种形式,一是数组元素做函数的参数,一是数组名做函数的参数,当用数组名做函数的实参时传送的是首地址。5.常用的字符串处理函数 C语言提供了一些处理字符串的标准函数,用以完成一些常见的操作。对以下几个函数要掌握其功能和调用形式。 (1)gets(字符数组名)此函数功能是从键盘输入一串字符,回车后送到字符数组中,注意定义数组时数组长度要足够大。 (2)puts(字符数组名)此函数功能是将字符数组的内容输出到屏幕上。 (3)strcat(字符数组名1,字符数组名2)此函数功能是将字符数组1中的’ ’去掉后将字符数组2的内容连接到字符数组1的末尾。 (4)strcpy(字符数组名1,字符数组名2)函数功能是将字符数组2的内容(包括’ ’)拷贝到字符数组1中,字符数组2处也可以是字符串常量。strcpy函数可以实现拷子串。(5)strcmp(字符数组名1,字符数组名2)函数功能是两个字符串(ASCII码)比大小。(6)strlen(字符数组名)此函数功能是求字符串的长度,注意不包括’ ’。(7)strlwr(字符数组名)此函数功能是将字符串中的所有大写字母都变成小写。(8)strupr(字符数组名)此函数功能是将字符串中的所有小写字母都变成大写。 第六章 函数知识点 每个C源程序都是由函数组成的,一个主函数和若干个其它函数,C语言程序设计的基础工作就是函数的具体编写,C语言中的函数就相当于其它高级语言中的子程序。1.函数的概念 函数就是一个数据加工厂,从函数外部接收数据,在函数内部加工处理,然后得到一个结果返回给外部的调用者。所以函数就是对语言功能的扩充,对函数的调用就是对功能的调用。 2.标准函数 各种高级语言都定义了一些标准函数,C语言中的标准函数称为库函数,是将一些基本的、常用的功能编成了函数,供大家使用方便。使用库函数时必须把它的头文件用#include命令包含进来,每个库函数的功能及对应的头文件都会在手册中给出。3.自定义函数 C 语言也允许用户自己编写函数以实现C库函数中没有提供的功能,称作自定义函数。4.定义函数 C语言规定每个函数都要独立定义,函数定义不能嵌套。函数定义的形式:数据类型函数名(形参表)形参说明语句序列 { 说明语句序列 可执行语句序列 } 5.函数调用 函数调用的形式是: 函数名(实参表)。当实参表中有多个参数时,要用逗号隔开,若被调函数无参数,调用时小括号也不能省。函数调用过程是:将实参的值传给形参,在函数体内进行加工处理,然后由return语句将函数值返回调用处。5.全局变量和局部变量 局部变量:在函数内部定义的变量称为局部变量,只在本函数中有效。全局变量:在函数外部定义的变量称为全局变量,它的作用范围是从定义开始到本文件结束。6.动态存储与静态存储 内存中的用户数据区分为动态存储区和静态存储区,动态存储区是指程序运行期间给变量临时分配存储单元,变量用完后立即释放单元的区域,动态存储区放的是函数的形参、自动变量、函数调用期间的现场保护数据和返回地址。 静态存储区是指程序运行期间给变量分配固定的存储单元,放的是全局变量和局部静态变量。 一个变量除了它的数据类型以外还有存储类型,定义一个变量时应该说明这两种类型。 第七章 预处理知识点 对高级语言编译连接就是把源程序转换成机器语言,C语言在进行编译之前还要预先处理三件事:宏定义命令、文件包含命令和条件编译命令,统称为预处理命令,其特点是: 1.所有的预处理命令都放在程序的头部,以#开头,且#号后面不留空格。2.预处理命令不是C的语句,行尾不加分号。 3.预处理命令是在编译预处理阶段完成的,所以它们没有任何计算、操作等执行功能。4.预处理命令有所变动后,必须对程序重新进行编译和连接。1.宏定义 宏定义命令的作用是给一些常用的对象重新命名,在程序中可以用宏名来引用这些对象,预处理时宏名会被代表的内容替换,此过程称为宏展开或宏替换。宏定义有两种形式: 2.文件包含 使用文件包含命令可以将另—个C源程序的全部内容包含进来,其形式为: #include <文件名>或#include “文件名” 通常可以把经常用到的,带公用性的一些函数或符号等集合在„起形成一个源文件,然后用此命令将这个源文件包含进来,这样可以避免在每个新程序中都要重新键入这些内容。3.条件编译 顾名思义满足条件时进行编译,为了解决程序移植问题,C语言提供了条件编译命令,它能使源程序在不同的编译环境下生成不同的目标代码文件。条件编译命令有3种形式。 第八章 指针知识点 1.什么是指针和指针变量? 指针就是内存地址,因为通过“地址”可以找到变量,所以内存“地址“形象的称为指针。 指针变量就是存地址的变量。在C语言中用一个变量存另一个变量的地址,那么就称这个变量为指针变量,指针变量的值就是地址。通常指针变量被简称为指针。 指针变量是有类型的,即指针值增1表示指向下一个数据,如整型数据在内存中占两个字节,它的指针变量增1是增两个字节。如实型数据在内存中占4个字节,它的指针变量增1是增4个字节。 2.怎样定义指针变量? 定义形式为:数据类型*指针变量名1,*指针变量名2„„; 3.指针的有关运算 指针为内存地址是整数,可以进行一些算术运算、关系运算、赋值运算、特殊运算等,但要注意运算代表的实际意义。4.指向数组的指针变量 (1)指向数组元素的指针变量定义形式为:inta[10];int*p=a;(2)指向一维数组的指针变量 定义形式为:inta[3][4];int(*p)[4];p=a;(3)指向字符串的指针变量 定义形式为: char*p=”字符序列“; C语言中的字符串是以隐含形式的字符数组存放的,定义了指针变量p并不是将整个字符串都存放在p中了,而p中存放的是字符串的首地址。5.指向函数的指针变量 一个函数在编译时被分配一个入口地址,这个地址就是函数的指针,可以用一个指针变量指向它。指向函数的指针变量定义形式为: 数据类型(*指针变量名); 6.指针变量做函数的参数 (1)指针作函数的参数可以传送地址,如数组的首地址,函数的入口地址等。(2)指针作函数的参数也可以用地址方式传送数据。7.返回值是指针的函数 即函数的返回值是内存的地址,利用这种方法可以将一个以上的数据返回给函数的调用者。定义形式如下: 数据类型*函数名(形参表)8.指针数组 定义形式为:数据类型*数组名[数组长度]; 数组中的每个元素都是指针类型的数据,这种数组被称为指针数组。9.指向指针的指针 定义形式为:数据类型**指针变量名; 指向指针数据的指针变量称为指向指针的指针。10.main函数的形参 main函数可以带两个形参,如: main(argc,argv)intargc; char *argv[]; { „„ } 11.指向结构体的指针变量 结构体变量的指针就是该变量所占据的内存段的首地址。指向结构体的指针变量定义形式为:struct结构体类型名*指针变量名; 12.指向共用体的指针变量 共用体变量的指针就是该变量所占据的内存段的首地址。指向共用体的指针变量定义形式为:union共用体类型名*指针变量名; 替换了的字符时(这里为正中间的字符”4"),原来的字符己不复存在。 第九章 结构体与共用体知识点 结构体类型是C语言的一种构造数据类型,它是多个相关的不同类型数据的集合,相当于其它高级语言中的记录。1.结构体类型定义 结构体类型的形式为: struct结构体类型名 { 数据类型成员名1;...数据类型成员名n; } 2.结构体变量的定义 结构体变量有三种定义形式: (1)先定义结构体类型,后定义结构体变量。(2)定义结构体类型的同时定义结构体变量。 (3)不定义结构体类型名,直接定义结构体变量。3.结构体变量的引用 (1)结构体变量的初始化:许多C版本规定对外部或静态存储类型的结构体变量可以进行初始化,而对局部的结构体变量则不可以,新标准C无此限制,允许在定义时对自动变量初始化。 (2)结构体成员的引用:由于C语言一般不允许对结构体变量的整体引用,所以对结构体的引用只能是对分量的引用,结构体变量中的任一分量可以表示为:结构体变量名·成员名 4.结构体与数组 C语言中数组的成员可以是结构体变量,结构体变量的成员也可以是数组。结构体数组有三种定义形式: (1)先定义结构体类型,后定义结构体数组。(2)定义结构体类型的同时定义结构体数组。 (3)不定义结构体类型名,直接定义结构体变量。5.结构体与指针 一方面结构体变量中的成员可以是指针变量,另一方面也可以定义指向结构体的指针变量,指向结构体的指针变量的值是某一结构体变量在内存中的首地址。结构体指针的定义形式:struct结构体类型名*结构体指针变量名。由结构体指针引用结构体成员的方法 6.用指针处理链表 结构体的成员可以是指针类型,并且这个指针类型就是本结构体类型的,这样可以构造出一种动态数据结构—成为链表。所谓动态数据就是指在编译时不能确定数据量的多少,而是在程序执行时才确定的数据,动态数据可以比较方便的进行数据插人或删除等操作。7.结构体与函数 结构体变量的成员可以作函数的参数、指向结构体变量的指针也可以作函数的参数。虽然结构体变量名也可以作为函数的参数,将整个结构体变量进行传递,但一般不这样做,因为如果结构体的成员很多,或者有些成员是数组,则程序运行期间,将全部成员一个一个的传递,既浪费时间,又浪费空间,开销太大。8.结构体与共用体 结构体变量中的成员可以是共用体,共用体变量中的成员可以是结构体。共用体 为了节省存储空间,C语言允许将几种不同类型的数据存放在同一段内存单元,它们共用一个起始地址,称做共用体。1.共用体类型定义 union共用体类型名 { 数据类型成员名1;...数据类型成员名n; } 2.共用体变量定义 (1)先定义类型,后定义变量。(2)定义类型的同时定义变量。 (3)不定义类型名,直接定义变量。3.共用体变量的引用 (1)共用体变量不能整体引用,只能引用其成员,形式为:共用体变量名·成员名(2)共用体变量的成员不能初始化,因为它只能放一个数据。(3)共用体变量存放的数据是最后放入的数据。(4)共用体变量的长度是最大的成员的长度。 (5)可以引用共用体变量的地址、各个成员的地址,它们都是同一个地址。(6)共用体变量不能当函数的参数或函数的返回值,但可以用指向共用体变量的指针作函数的参数。 (7)共用体变量的成员可以是数组,数组的成员也可以是共用体变量。 第十章 位运算知识点 位运算就是按二进制位进行操作的运算,运算的对象只能是整型或字符型,不能是实型。不同长度的变量进行位运算,系统会自动右对齐,而左端的不齐部分,对于无符号数左端补满0,对于有符号数则:正数左端补满0,负数左端补满1。 第十一章 文件知识点 操作系统是以文件为单位对数据进行管理的,任何一种计算机高级语言都要有和磁盘文件打交道的能力,否则该语言的功能充其量是算一算、显示显示而已。在C语言中没有单独的文件操作语句,所有对文件的操作都是通过库函数来完成的,所以本章的重点是学会使用有关文件操作的库函数。1.文件的基本概念 2.文件类型指针 3.文件的操作第四篇:C 语言程序设计
第五篇:c语言程序设计知识点总结