湖南省计算机水平考试强化培训班二级C语言.docx
- 文档编号:7046507
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:33
- 大小:149.07KB
湖南省计算机水平考试强化培训班二级C语言.docx
《湖南省计算机水平考试强化培训班二级C语言.docx》由会员分享,可在线阅读,更多相关《湖南省计算机水平考试强化培训班二级C语言.docx(33页珍藏版)》请在冰豆网上搜索。
湖南省计算机水平考试强化培训班二级C语言
湖南省计算机水平考试强化培训班二级C语言
讲授内容:
1.选择结构(if、if~else、switch语句)
2.循环结构(while、do~while、for、break和continue语句)
3.函数的定义与调用
4.数组
5.特殊问题
6.改错和填空、程序设计常见问题分析和举例
选择结构
1.格式
格式1:
if(表达式)语句;
格式2:
if(表达式)语句1;
else语句2;
2.功能
3.注意
(1)表达式可以是常量、变量、算术表达式、关系表达式、逻辑表达式,但表达式中的变量应该是已赋值,只判断表达式的值是否为非零。
。
几种特殊情况:
if(5)
if(a)if(a!
=0)
if(a+b)if(a+b!
=0)
if(a>b&&b>c)错误的是:
if(a>b>c),也不能是:
if(a>b,b>c)
if(a=b)相当于:
a=b;if(a!
=0)
if(a==b)
if(ch>=’A’&&ch<=’Z’)
if(ch>=’a’&&ch<=’z’)
if(ch>=’A’&&ch<=’Z’||ch>=’a’&&ch<=’z’)
if(x%i=0)是错误的表达式,正确的是:
if(x%i==0)
(2)满足表达式执行多个语句时一定要用大括号括起来。
如:
if(a>b){t=a;a=b;b=t;}
(3)if语句嵌套搞不清楚时,尽量使用单if语句。
如:
if(a>0)
if(b>10)c=c+1;
可改成:
if(a>0&&b>10)c=c+1;
4.switch语句
格式:
switch(表达式)
{
case常量1:
语句序列1;[break;]
case常量2:
语句序列2;[break;]
…
case常量n:
语句序列n;[break;]
default:
语句序列n+1;
}
注意:
(1)表达式运算的结果是整数;
(2)有无break语句的执行不同。
循环结构
1.while语句
格式:
while(表达式)
{循环体}
2.do~while语句
格式:
do
{
循环体;
}while(表达式);
3.for语句
格式:
for(表达式1;表达式2;表达式3)
{循环体;}
对于上述三种循环结构要了解下面几个问题:
(1)表达式是循环控制条件,与if语句中的表达式一样。
(2)三种循环语句的执行过程。
#include"stdio.h"
voidmain()
{inta,b;
for(a=1;a<=9;a++)
{printf("a=%d:
",a);
for(b=1;b<=a;b++)
printf("%8d",a*b);
printf("\n");
}
}
下面的程序是求表达式的值:
s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+......+(1*2*3*......*n)/(3*5*7*......(2*n+1))
请修改程序中的错误,并运行修改后的程序。
当n=30时,程序的运行结果(按四舍五入保留10位小数)。
程序:
#include
#include
#include
doublefun(intn)
{doubles,t;inti;
s=1.0;t=1.0;
for(i=1;i<=n;i++)
{/*下行有错*/
t=t*n/(2*n+1);
/*下行有错*/
s=t;
}
returns;
}
main()
{printf("\n%12.10lf",fun(30));
}
4.break和continue语句
函数
1.函数定义的格式
一般格式:
函数类型函数名(形参及形参类型)
{函数体}
注意:
(1)函数类型的定义:
如果只有一个返回值,根据返回值的数据类型来定义。
无返回值或2个或2个以上,函数类型定义为void.
floatfun(intn)
{floats;
returns;}
voidmain()
{
printf(“%10.2f\n”,fun(20);
}
(2)形参及形参类型:
每个形参要分别定义其数据类型;实参将值单向传递给形参。
如:
voidfun(intx,inty)
{x=x+1;
y=y+1;}
voidmain()
{
inta=10,b=20;
fun(a,b);
printf(“a=%d,b=%d\n”,a,b);}
(3)函数体中的return语句只能返回一个值。
2.函数调用格式:
函数名(实参列表)
实参与形参应一一对应,数据类型与个数也应一一对应。
TC参数传递方向从右向左。
3.函数调用方式:
递归调用
数组
1.数组的定义
格式:
一维数组:
数据类型数组名[常量]
二维数组:
数据类型数组名[常量1][常量2]
注意:
(1)数组元素下标从0开始到长度减1
inta[5];
数组元素有:
a[0]a[1]a[2]a[3]a[4]
下标从0变化到4,可以使用一个循环变量来控制,如:
for(i=0;i<=4;i++),i的变化恰好是下标值的变化。
inta[3][4];
数组元素有:
a[0][0]a[0][1]a[0][2]a[0][3]
a[1][0]a[1][1]a[1][2]a[1][3]
a[2][0]a[2][1]a[2][2]a[2][3]
同样以上一样,可以用一个双层循环来控制二维数组下标的变化:
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
2.数组的引用
两种方式:
引用数组元素名(直接方式)和引用数组名。
(1)引用数组元素名时,可把数组元素名看作是单个的变量来使用。
如:
scanf(“%d”,&a[0]);
a[0]=10;
(2)引用数组名时,数组名只能作函数参数,且传递整个数组。
在被调函数中对形参数组操作,形参数组的值能返回到实参数组。
如:
voidfun(intb[],intn)
{intk;
for(k=0;k b[k]=b[k]+1;} voidmain() {inta[5]={0,1,2,3,4},k; fun(a,5); for(k=0;k<5;k++) printf(“%8d”,a[k]);} 特殊问题 1.数据的输入与输出 scanf(“格式控制字符串”,输入地址列表); 该函数出错的四个问题: (1)格式字符选择不对;常见的是所有的数据都采用d%. 数据类型 格式字符 int %d longint %ld unsignedint %u unsignedint %lu float %f double %lf char %c 字符串 %s (2)输入地址列表出错,无地址运算符,只有变量名。 scanf(“%f”,x);正确的是: scanf(“%f”,&x); (3)格式控制字符串中的字符在数据输入时必须原样输入。 scanf(“x=%f,a=%d\n”,&x,&a); 正确的输入是: x=12,a=345\n (4)数据输入格式不对。 格式串中有其它字符时,必须按上述(3)进行。 对于数值型数据的输入,如果没有其它字符分隔,有两种办法: 用空格分隔多个数据,或每输入一个数据换行。 特别是数组的输入,常用空格分隔。 输出函数printf(“格式控制字符串”,输出项列表); 数据类型 格式字符 int %d longint %ld unsignedint %u unsignedint %lu float %f double %lf或%f char %c 字符串 %s 说明: (1)在输出语句的普通字符是原样输出; (2)%md中是m是规定输出项的宽度; (3)%m.nf中m是域宽,n是保留小数位数,系统会自动进行四舍五入。 2.程序中分号引起的错误 程序中原则上每一行有一个分号,每一个分号对应C语言的一个语句,而导致算法出错的是多加了分号,少了分号系统编译的时就会出错。 常见错误: 正确 错误 if(表达式)语句; if(表达式);语句; if(表达式)语句1; else语句2; if(表达式);语句1; else语句2; while(表达式) {...} while(表达式); {...} for(表达式1;表达式2;表达式3) {...} for(表达式1;表达式2;表达式3); {...} 注: for语句中分号分隔三个表达式,分号不能省 复合语句: {t=a;a=b;b=t;} 复合语句: {t=a;a=b;b=t}; 函数定义: 函数类型函数名(形参及类型) {...} 函数定义: 函数类型函数名(形参及类型); {...} 结构体定义: structstu {intx; floaty; }; 结构体定义: structstu {intx; floaty; } 3.运算符使用出错 在程序设计中,使用运算符时常出现以下错误: 运算符 错误 * 表达式时不能缺省,特别是 平方和立方 / 与转义字符\混淆; 两个整数相除,结果为整数 实数不能进行求余运算 类型强化转换运算符 正确: (float)(a+b)(float)a/b 错误: float(a+b)float(a/b) 与&&和||运算符出错 如: a>b,b>c与a>b&&b>c &&、|| 连接两个条件,常用逗号连接 == a==ba=b 4.赋初值问题 定义了变量或数组,当第一次使用变量或数组元素时,如果变量或数组元素参与计算或需要输出其值时,则必须赋初始值。 特别是变量或数组元素第一次使用出现在赋值号的右边时,则一定要有初始值。 一般情况下: 求和变量赋初值为0,求积变量赋初始值为1。 三种方式赋初始值: (1)变量初始化: 定义变量时赋初始值。 inta=1; floaty=1.23; (2)采用赋值语句赋值 inta;floaty; a=1;y=1.23; (3)采用格式化数据输入函数scanf() inta;floaty; scanf(“%d%f”,&a,&y); 5.函数 函数定义格式: 函数返回值数据类型说明函数名(形参及类型) { 变量说明部分; 语句执行部分; } 说明: (1)当被定义函数有一个返回值,函数数据类型应根据返回的值的数据类型定义,且函数体中有return语句。 其它函数的数据类型定义为void。 定式如下: (****代表同一种数据类型) ****fun(形参及类型) { ****x; ……… returnx; } voidmain() {****s; …. s=fun(…);….} 如: floatadd(floatx,floaty) {floatz; z=z+y; returnz;} voidmain() {floatop1,op2,sum; scanf(“%f%f”,&op1,&op2); sum=add(op1,op2); printf(“%f\n”,sum);} (2)参数传递 传递方式: 实参将值单向一一对应传递给形参。 TC中参数方向是从右向左。 如: voidfun(intx,int*y) {…} voidmain() {inta=10,b; …… fun(,);….. } 6.判断取整的问题 例判断整数n是否是一个整数的平方 可利用下述算法: intk; k=sqrt(k); if(k*k==n) 7.程序中出现的函数: sqrt(x)fabs(x)fmod(x,y)x%y 改错题 单击”考生文件夹”,进入下面界面 首先看清题目,有几个错误提示行,则必须改正几个错误。 每一个错误在提示行的下一行。 运行程序,填上正确的答案。 前后不要加空格,数据输出不要在汉字输入状态 举例: 1.输入函数变量前没有取地下址运算符 下面的程序中,函数fun的功能是: 根据形参m,计算下面公式的值。 T=1+1/(2*3)+1/(3*4)+......+1/(m*(m+1)) 请改正程序中的错误,并运行改正后的程序。 当从键盘输入56时,给出程序运行的正确结果。 程序: #include #include doublefun(intm) {doublet=1.0; inti=2; for(i=2;i<=m;i++) /*下行有错*/ t=1.0/(i*(i+1)); returnt;} main() {intm; printf("\n请输入一个整数: "); /*下行有错*/ scanf("%d",m); printf("%lf\n",fun(m));} 2.变量数据类型定义为整数,进行除法运算时,要转化为实数运算。 下列程序的功能是: 求出以下分数序列的前30项之和,2/1,3/2,5/3,8/5,13/8,21/13,……请改正程序中的错误,并运行修改后程序,给出程序结果(按四舍五入保留6位小数)。 程序: #include #include main() {longa,b,c,k; doubles; s=0.0;a=2;b=1; for(k=1;k<=30;k++) { /*下行有错*/ s=s+a/b; c=a;a=a+b;b=c;} printf("%lf\n",s); } 3.变量赋初值错误。 (一般的情况: 求和变量初值为0,求积初始值为1)。 以下程序求[1,1000]之间能被5和7整除的数之和。 请改正程序中的错误,并运行修改后的程序,给出正确程序运行结果,填入相应窗口。 #include #include #include main() { inti,sum; /*下行有错*/ sum=1; for(i=1;i<=1000;i++) {/*下行有错*/ if((fmod(i,5)==0)||(fmod(i,7)==0)) sum=sum+i; } printf("%d\n",sum); } 4.运算出错。 常见的错时: %用/,==用! =,||用&&,可反过来用。 以下程序求[1,1000]之间能被5和7整除的数之和。 请改正程序中的错误,并运行修改后的程序,给出正确程序运行结果,填入相应窗口。 #include #include #include main() { inti,sum; /*下行有错*/ sum=1; for(i=1;i<=1000;i++) {/*下行有错*/ if((fmod(i,5)==0)||(fmod(i,7)==0)) sum=sum+i; } printf("%d\n",sum); } 5.边缘条件出错误,应该是<=或>=时,只有<或>. 以下程序求[1,500]之间能被3或5整除的数之和。 请改正程序中的错误,并运行修改后的程序,给出正确程序运行结果. #include #include #include main() { inti; intsum; sum=0; /*下行有错*/ for(i=1;i<500;i++) {if((fmod(i,3)==0)||(fmod(i,5)==0)) sum+=i; } printf("%d\n",sum); } 7.算法出错 下面的程序是求500以内的所有的素数之和。 请修改程序中的错误,使它能得出正确的结果,并给出正确结果。 程序: #include #include #include intprime(intn) {intyes,i; if(n<=1){return1;} yes=1; for(i=2;i<=sqrt(n);i++) if(n%i==0){yes=0;break;} /*下行有错*/ return1; } main() {intsum=0,i; for(i=2;i<=500;i++) if(prime(i))sum+=i; printf("%d\n",sum);} 7.“+”与“++”用法出错。 以下程序求[1,500]之间能被5和7整除的数之和。 请改正程序中的错误,并运行修改后的程序,给出正确程序运行结果,填入相应窗口。 #include #include #include main() { inti,sum; sum=0; for(i=4;i<=500;i++) {if((fmod(i,5)==0)&&(fmod(i,7)==0)) /*下行有错*/ sum=++i; } printf("%d\n",sum); } 8.表达式出错(“*”导致的错误) 下面的程序中,函数fun的功能是: 根据形参m,计算下面公式的值。 T=1+1/(2*3)+1/(3*4)+……+1/(m*(m+1)) 当从键盘输入70时,给出程序运行的正确结果。 #include #include doublefun(intm) {doublet=1.0; inti=2; for(i=2;i<=m;i++) /*下行程序有错*/ t+=1.0/i*(i+1); /*下行程序有错*/ return; } main() {intm; printf("\n请输入一个整数: "); scanf("%d",&m); printf("%lf\n",fun(m));} 9.结果是求个数,不是求累加和。 下面程序是求[20,1000]之间同时满足除4余3或除5余4条件的数的个数。 请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。 程序: #include #include #include main() { intcount; inti; count=0; for(i=20;i<=1000;i++) { if(fmod(i,4)==3||fmod(i,5)==4) /*下行有错*/ count+=i; } printf("%ld\n",count); } 10.For语句的三个表达式出错。 下面的程序是求表达式的值: s=1+1/3+(1*2)/(3*5)+(1*2*3)/(3*5*7)+......+(1*2*3*....*n)/(3*5*7*.....(2*n+1)) 当n=20时,程序的运行结果(按四舍五入保留10位小数)。 程序: #include #include doublefun(intn) {doubles,t;inti; /*下行有错*/ s=0.0; t=1.0; /*下行有错*/ for(i=1;i<=n;i--) {t=t*i/(2*i+1); s+=t; } returns;} main() {printf("\n%12.10lf",fun(20)); } 11.函数数据类型定义或变量数据类型定义出错 下面的程序是计算如下公式的A30值。 A1=1,A2=1/(1+A1),A3=1/(1+A2),A4=1/(1+A3),...... 请改正程序中的错误,并给出程序运行的正确结果(按四舍五入保留10位小数) 程序: #include #include doublefun(intn) {/*下行有错*/ intA=1;inti; for(i=2;i<=n;i++) A=1/(1+A); /*下行有错*/ return; } main() { printf("%12.10lf\n",fun(30)); } 12.奇偶数问题 下面程序是求[20,160]之间的所有偶数的平方和。 请修改程序中的错误,使它能得出正确的结果,并给出正确结果,填入相应窗口。 程序: #include #include #include main() { longsum; inti; sum=0; /*下行有错*/ for(i=20;i<160;i++) { /*下行有错*/ if(fmod(i,2)! =0) sum+=i*i; } printf("%d\n",sum);} 填空题 (1)阅读题目,搞清题意; (2)阅读程序,理解算法,特别是程序中每个变量的作用. (3)根据程序运行,计算和估算,发现程序中缺什么,需要补充什么? 如: 已知24有8个因子,而24正好被8整除。 求[50,250]之间有多少个整数能被其因子的个数整除,将下列程序补充完整,把程序运行的正确结果填入相应窗口。 程序: #include #include #include main() { inta,b,c,n,count=0; for(a=50;a<=250;a++) { ________ for(c=1;c<=a;c++) if(_______) b+=1; if(a%b==0) { count++; } } printf("%d",count);} 1.补充变量定义和赋初值 如: 以下程序求[1,700]之间能被3或7整除的数之和。 请将程序补充完整,把程序运行的正确结果填入相应窗口。 #include #include #include main() {
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 湖南省 计算机水平 考试 强化 培训班 二级 语言