第一章 数据类型与表达式
一.知识点
1.C语言的特点:①语言简洁、紧凑,使用方便、灵活; ②运算符丰富;
③数据结构丰富; ④具有结构化控制语句;
⑤语法限制不太严格,程序设计自由度大;
⑥可以进行位操作,能实现汇编语言的大部分功能,能直接对硬件进行操作;
⑦生成的目标代码质量高,程序执行效率高; ⑧程序的移植性好。
2.C程序的组成:
⑴C程序是由函数构成的;
⑵一个函数包括函数的首部(即函数的第一行)和函数体(即花括号部分);
⑶函数体一般包括声明部分和执行部分;
⑷一个C程序总是从main函数开始执行,从main函数结束;
⑸C程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上;
⑹每个语句和数据定义的最后必须有一个分号;
⑺C语言本身没有输入输出语句,是通过函数实现输入输出的;
⑻可以用/*……*/对C程序的任何部分作注释。
3.C语言程序的运行:源程序文件的扩展名为.c,目标程序文件的扩展名为.obj,可执行程序文件的扩展名为.exe。
4.C的数据类型:基本、构造、指针和空类型,char、int、short、long、unsigned、float、double、enum、struct、union、typedef。
5.常量与变量的概念,注意符号常量的定义与使用;
6.整型、实型、字符型常量的表示,注意整型常量的十进制、八进制、十六进制的书写。
7.变量的定义,C的标识符包括关键字、预定义标识符、用户定义标识符;用户定义标识符的可用字符为字母、数字、下划线,第一个字符为字母或下划线。
8.常见数据类型的取值范围,int为-32768~+32767,unsigned int为0~65535。
9.转义字符:\n、\t、\b、\r、\f、\\、\’、\”、\ddd、\xhh
10.不同数值型数据的混合运算,低级类型转换为高级类型运算
11.C的运算符:注意结合方向和运算的优先级
12.算术运算符:+、-、*、/、%、++、--,注意自加、减运算符分前缀和后缀两种方式。其中前缀方式为先自加、减,后引用;后缀方式为先引用,后自加、减;运算符%要求运算量为整数,运算结果也为整数。注意除运算时,若运算量为整型时,其运算结果也是整型的规则。
13.赋值类运算符:=、+=、-=、*=、/=、%=,注意含义和数据类型的转换。
14.逗号运算符的使用,注意逗号运算符的运算规则。
二.练习
㈠.填空题:
1.在TURBO C环境中用RUN命令运行一个C程序时,所运行的程序的后缀是 .exe 。
2.C语言源程序文件的后缀是 .c ,经过编译后,生成文件的后缀是 .obj ,经过连接后,生成文件的后缀是 .exe 。
3.结构化程序由 顺序、 选择(分支) 、 循环 三种基本结构组成。
4.若k为整型变量且赋值11。请写出运算k++后表达式的值 11 和变量的值 12 。
5.若x为double型变量,运算x=3.2,++x后表达式的值 4.2 和变量的值 4.2 。
6.函数体由符号 { 开始,用符号 }结束。函数体的前面是 定义 部分,其后是 执行 部分。
7.C语言中的标识符可分为 关键字、 用户标识符 和预定义标识符三类。
8.在C语言程序中,用关键字 int 定义基本整型变量,用关键字 float定义单精度实型变量,用关键字 double 定义双精度实型变量。
9.把a1、a2定义成单精度实型变量,并赋初值1的定义语句是 float a1=1.0,a2=1.0;。
10.C程序中定义的变量,代表内存中的一个 存储空间。
11.表达式3.5+1/2的计算结果是 3.5。
12.写出数学表达式三个等价的C语言表达式 a*b/(c*d)、a /(c*d)*b、b/(c*d)*a。
13.通常一个字节包含 8 个二进制位。
14.当计算机用两个字节存放一个整数时,能存放的最大(十进制)整数是216-1(65535)、最小(十进制)整数是 -215(-32768) 。
15.在C语言中整数可用 十 进制数、 八 进制数和 十六 进制数三种数制表示。
16.C语言中,int型数据占 2 个字节,long型数据占 4 个字节,unsigned int型数据占 2 个字节,short型数据占 2 个字节, float型数据占 4 个字节,double型数据占 8 个字节,char型数据占 1 个字节。
㈡.选择题:
1.组成C语言程序的是( )(C)。
A.子程序 B.过程 C.函数 D.主程序和子程序
2.以下叙述中正确的是( )(C)。
A.在C程序中无论是整数还是实数,只要在允许的范围内都能准确无误的表示。
B.C程序由主函数组成。
C.C程序由函数组成。
D.C程序由函数和过程组成。
3.以下选项中正确的整型常量是( )(B)。
A.12. B.-20 C.1,000 D.4 5 6
4.以下选项中正确的实型常量是( )(D)。
A.0 B.3. 1415 C.0.329╳102 D..871
5.以下选项中不合法的用户标识符是( )(C)。
A._123 B.printf C.A$ D.Dim
6.C语言中运算对象必须是整型的运算符是( )(A)。
A.% B./ C.! D.*
7.可在C程序中用作用户标识符的一组标识符是( )(B)。
A.void B.as_b3 C.For D.2c
define _123 -abc DO
WORD If case SIG
8.若变量已正确定义并赋值,符合C语言语法的表达式是( )(B)。
A.a=a+7; B.a=7+b+c,a++ C.int(12.3%4) D.a=a+7=c+b
9.不合法的八进制数是( )(B)。
A.0 B.028 C.077 D.01
10.不合法的十六进制数是( )(A)(零X)。
A.oxff B.0Xabc C.0x11 D.0x19
㈢.程序设计题:
1.编写一个C程序,输入a、b、c三个数,输出其中最大者。
#include<stdio.h>
void main()
{int a,b,c,max;
printf(“input 3 num:\n”);
scanf(“%d%d%d”,&a,&b,&c);
max=a;
if(b>max)max=b;
if(c>max)max=c;
printf(“%d”,max);
}
第二章 算法与顺序结构
一.知识点
1.算法:为解决一个问题而采取的方法和步骤。
2.算法的分类:数值算法、非数值算法。
3.算法的特点:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性。
4.算法描述方法:自然语言、流程图、改进流程图、N—S流程图、伪代码、计算机语言。
5.C语句的类型:控制语句、函数调用语句、表达式语句、空语句、复合语句。
6.输入输出的概念:输入输出是相对主机而言,C语言是由函数来实现输入输出的。
7.字符数据的输入/输出:getchar()、putchar()
8.格式输入/输出:scanf()、printf()
9.printf的格式符:d、i,o,x、X,u,c,s,f,e、E,g、G;l,m,n,-。
10.scanf的格式符:d、i,o,x、X,u,c,s,f,e、E,g、G;l,m,*;&。注意输入数据时数据流的分隔符,系统默认的分隔符为空格、tab键和回车。
11.顺序结构的设计思想:声明变量、输入数据、处理、输出结果。
二.练习
㈠.填空题:
1.以下程序段执行后的输出结果是:⑴ -200 2500 ⑵ i=-200,j=2500⑶ 。
int i=-200,j=2500;
printf(“⑴ %d %d”,i,j);
printf(“⑵ i=%d,j=%d\n”,i,j);
printf(“⑶ i=%d\n j=%d\n”,i,j);
2.复合语句在语法上被认为是 一条语句。空语句的形式是 ; 。
3.C语句的最后用 ;结束。
4.以下程序段的输出结果是 x= 127,x= 177,x= 7f,x= 127 。
int x=0177;printf(“x=%6d,x=%6o,x=%6x,x=%6u\n”,x,,x,x,x);
5.以下程序段的输出结果是 a=513.789215,a= 513.79,a=513.78921500,a= 531.78921500。
double a=513.789215;
printf(“a=%8.6f,a=%8.2f,a=%14.8f,a=%14.8lf\n”,a,a,a,a);
6.以下程序段的输出结果是 8,3 。
a=3+5,a*4;x=11/3;printf(“%d,%%d\n”,a,x);
7.以下程序输入三个整数值给a、b、c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a、b、c的值。请填空:
#include <stdio.h>
main()
{ int a,b,c, m ;
printf(“Enter a,b,c:”);
scanf(“%d,%d,%d”, &a,&b,&c);
m=a ;a=b;b=c; c=m ;
printf(“a=%d,b=%d,c=%d\n”,a,b,c);}
8.以下程序不借助任何变量把a、b中的值进行交换。请填空:
#include <stdio.h>
main()
{ int a,b;
printf(“Input a,b:”);
scanf(“%d,%d”, &a,&b);
a+= b ;b=a- b ;a=a- b ;
printf(“a=%d,b=%d\n”,a,b);}
㈡.选择题:
1.若a、b、c、d都是int型变量且初始值为0,下列不正确的赋值语句是( )(C)。
A.a=b=c=100; B.d++; C.c+b; D.d=(c=22)-(b++);
2.以下选项中不是C语句的是( )(C)。
A.{int i;i++;printf(“%d\n”,i);} B.; C.a=5,c=10 D.{ ;}
3.以下合法的C语言赋值语句是( )(D)。
A.a=b=58 B.k=int(a+b); C.a=58,b=58 D.--i;
4.以下程序的输出结果是( )(C)。
A.0 B.1 C.3 D.不确定的值
main()
{ int x=10,y=3; printf(“%d\n”,y=x/y);}
5.若变量已正确说明为int类型,要给a、b、c输入数据,正确的输入语句是( )D。
A.read(a,b,c); B.scanf(“%d%d%d”,a,b,c);
C.scanf(“%D%D%D”,&a,&b,&c); D.scanf(“%d%d%d”,&a,&b,&c);
6.若变量已正确定义,要将a和b中的数进行交换,下面不正确的语句组是( )C。
A.a=a+b,b=a-b,a=a-b; B.t=a,a=b,b=t;
C.a=t;t=b;b=a; D.t=b;b=a;a=t;
7.若变量已正确定义,以下程序段的输出结果是( )D。
A.输出格式说明与输出项不匹配,输出无定值
B.5.1700 C.5.16800 D.5.16900
x=5.16894;printf(“%f\n”,(int)(x*1000+0.5)/(float)1000);
8.执行以下程序段后,c3中的值是( )A。
A.0 B.1/2 C.0.5 D.1
int c1=1,c2=2,c3;c3=c1/c2;
9.执行以下程序段后,其输出结果是( )B。
A.0,0,-10 B.0,0,3 C.-10,3,-10 D.3,3,-10
int a=0,b=0,c=0; c=(a-=a-5),(a=b,b+3);
printf(“%d,%d,%d\n”,a,b,c);
10.以下程序的输出结果是( )D。
A.a=%2,b=%5 B.a=2,b=5 C.a=%%d,b=%%d D.a=%d,b=%d
main()
{ int a=2,b=5; printf(“a=%%d,b=%%d\n”,a,b);}
11.若int型占两个字节,以下程序段的输出是( )D。
A.-1,-1 B.-1,32767 C.-1,32768 D.-1,65535
int a=-1;printf(“%d,%u\n”,a,a);
12.以下程序段的输出结果是( )C。
A.|3.1415| B.| 3.0| C.| 3| D.| 3.|
float a=3.1415;printf(“|%6.0f|\n”,a);
13.以下程序段的输出结果是( )B。
A.9 8 B.8 9 C.6 6 D.以上三个都不对
#include <math.h>
main()
{ double a=-3.0,b=2;
printf(“%3.0f %3.0f\n”,pow(b,fabs(a)),pow(fabs(a),b));}
14.若a为整型变量,则以下语句( )B。
A.赋值不合法 B.输出值为-2 C.输出为不确定值 D.输出值为2
a=-2L;printf(“%d\n”,a);
15.若有定义char s=‘\092’;则该语句( )B。
A.使s的值包含1个字符 B.定义不合法,s的值不确定
C.使s的值包含4个字符 D.使s的值包含3个字符
16.若k、g均为int型变量,则下列语句的输出为( )D。
A.15 B.16 C.15 D.16
6f 70 71 6f
k=017;g=111;printf(“%d\n”,++k);printf(“%x\n”,g++);
17.已知字母a的ASCII十进制代码为97,执行下列语句后的输出为( )C。
A.b,c B.a--运算不合法,故有语法错误
C.98,c D.格式描述和输出项不匹配,输出无定值
char a=‘a’;a--;printf(“%d,%c\n”,a+‘2’-‘0’,a+‘3’-‘0’);
18.下列程序的输出为( )A。
A.27.000000 B.27.500000 C.28.000000 D.28.500000
#include <stdio.h>
main()
{ int m=7,n=4; float a=38.4,b=6.4,x;
x=m/2+n*a/b+1/2;printf(“%f\n”,x); }
19.下列程序的输出结果是( )C。
A.18 B.9 C.-18 D.-9
main() { int a=9;a+=a-=a+a;printf(“%d\n”,a); }
20.下列程序的输出结果是( )A。
A.0 B.5 C.1 D.不确定值
main() { int a=7,b=5;printf(“%d\n”,b=b/a);}
21.下列程序的输出结果是( )C。
A.12 B.11 C.10 D.9
main() { int a=011;printf(“%d\n”,++a);}
㈢.程序设计题:
用N—S图表示下列问题:
1.有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换。
编写程序
2.依次将10个数输入,要求将其中最大的数打印出来。
#include <stdio.h>
main()
{
int i,a,max;
scanf("%d",&max);
for (i=1;i<=9;i++)
{
scanf("%d",&a);
if (a>max) max=a;
}
printf("%d",max);
}
3.有3个数a、b、c,要求按从大到小的顺序把它们打印出来。
main()
{
float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;} /*实现a和b的互换*/
if(a>c)
{t=a;a=c;c=t;} /*实现a和c的互唤*/
if(b>c)
{t=b;b=c;c=t;] /*实现b和c的互换*/
printf("%5.2f,%5.2f,%5.2f\n",a,b,c);
}
4.求1+2+3+……+100。
#include <stdio.h>
int main()
{
int i,sum=0;
i=1;
while(i<=100)
{
sum=sum+i;
i=i+1;
}
printf(“%d”,sum);
}
5.判断一个数n能否同时被3和5除。
#include <stdio.H>
main(void)
{
int n;
scanf("%d",&n);
if(n%3 == 0 && n%5 == 0)
printf("%d能否同时被3和5整除\n",n);
else
printf("%d不能否同时被3和5整除\n",n);
return 0;
}
6.将100~200之间的素数打印出来。
#include <stdio.h>
int isPrime(int n)
{
int i;
for(i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int i;
for(i=100;i<=200;i++)
{
if(isPrime(i))
printf("%d\n",i);
}
}
7.求两个整数m和n的最大公约数和最小公倍数。
main()
{
int a,b,num1,num2,temp;
printf("please input two numbers:\n");
scanf("%d,%d",&num1,&num2);
if(num1 { temp=num1;
num1=num2;
num2=temp;
}
a=num1;b=num2;
while(b!=0)/*利用辗除法,直到b为0为止*/
{
temp=a%b;
a=b;
b=temp;
}
printf("gongyueshu:%d\n",a);
printf("gongbeishu:%d\n",num1*num2/a);
}
8.求方程ax2+bx+c=0的根
#include <stdio.h>
#include <math.h> //用到平方根函数
void main()
{
float a,b,c,x1,x2,p,q,m;
scanf("%f%f%f",&a,&b,&c);
if ((a==0.0)&&(b==0.0)&&(c!=0.0))
printf(“no value!");
else if ((a==0.0)&&(b==0.0)&&(c==0.0))
printf("any value!");
else if ((a==0.0)&&(b!=0.0))
printf("x1=x2=%f",-c/b);
else
{m=b*b-4.0*a*c;
if(m>=0)
{ x1=(-b+sqrt(m))/(2.0*a);
x2=(-b-sqrt(m))/(2.0*a);
printf("x1=%f\n",x1);
printf("x2=%f\n",x2);
}
else
{ p=-b/(2.0*a);
q=sqrt(-m)/(2.0*a);
printf("x1=%f+%fi\n",p,q);
printf("x2=%f-%fi\n",p,q);
}
}}
9.编写程序,输入两个整数1500和350,求出它们的商和余数并进行输出。
#include <stdlib.h>
#inclued <stdio.h>
void main()
{int a;
int b;
int c,d;
a=1500,b=350;
c=a/b;//商数
d=a%b;//余数
pritf("商数为: %d\n",c);
printf("余数为:%d\n",d);
return 0;
}
10.编写程序,读入三个双精度数,求它们的平均值并保留此平均值小数点后一位数,对小数点后第二位数进行四舍五入,最后输出结果。
#include<stdio.h>
main()
{ double a, b, c, d;
printf("输入三个双精度数\n");
scanf("%lf%lf%lf", &a, &b, &c);
d = ( a + b + c) / 3;
printf("%.1f\n", d);
}
11.求三角形的面积:a,b,c是边长,p是半边长,s是面积,则s=[p(p - a)(p - b)(p - c)] 1/2
#include<stdio.h>
#include<math.h>
main()
{float a,b,c,p,s;
printf("input 3 num:");
scanf("%f%f%f",&a,&b,&c);
p=(a+b+c)/2;
s=p*(p-a)(p-b)(p-c);
s=pow(s,0.5);
printf("s=%f",s);
}
12.输入一个华氏温度,要求输出摄氏温度。公式为:c=5(f-32)/9。
#include<stdio.h>
main()
{ double tem_c, tem_f;
puts("=====华氏温度至摄氏温度转换程序=====");
printf("请输入华氏温度:");
scanf("%lf", &tem_f);
tem_c = (tem_f - 12) * 5.0 / 9.0;
printf("%f对应的摄氏温度为%.2f", tem_f, tem_c);
renturn 0;
}
第三章 选择结构程序设计
一.知识点
1.关系运算符、逻辑运算符、逻辑值的表示与含义;注意&&、||的运算规则。
2.三种if语句
3.选择结构的嵌套,注意if与else的配对;
4.条件运算符:?:
5.switch语句,注意其执行过程;
6.选择结构程序设计思想。
二.练习
㈠.填空题:
1.C语言中用 非0 表示逻辑值“真”,用 0 表示逻辑值“假”。
2.C语言中的关系运算符按优先级别是 、 、 、 、 、 。
答案:>、<、>=、<=、==、!=
3.C语言中的逻辑运算符按优先级别是 、 、 。
答案:!、&&、||
4.C语言中的关系运算符和逻辑运算符的优先级别是 、 、 、 、 、
、 、 、 。
!、>、<、>=、<=、==、!=、&&、||
5.C语言中逻辑运算符的 ! 优先级高于算术运算符。
6.将下列数学式改写成C语言的关系表达式或逻辑表达式:
a=b或a<c a=b||a<c |x|>4 x>4||x<-4
7.下列程序的输出结果 1 。
main()
{ int a=100;
if(a>100) printf(“%d\n”,a>100); else printf(“%d\n”,a<=100);}
8.若已知a=10、b=15、c=1、d=2、e=0,请分别给出下列表达式的运算结果:
⑴ a*b && c 1 ⑵ a+b>10 || a+b<0 1 ⑶ e 0 ⑷ c==b>e 1
⑸ !a<e 0 ⑹ a++ && e++ && c++ 0 ⑺ !e && e==b==++c 1
⑻ (0<a) && (a<2) 0 ⑼ 1.234 && 5.982 1
⑽ (b==10) && (a==10) 0 ⑾ !0 || d && a==c+d 1
⑿ (a+c==b)==(b+d==a) || (c=b+a)>(d=c+b) 1
9.当a=1、b=2、c=3时,执行以下if语句后,a= 3 、b= 1 、c= 1 。
if(a>c);b=a;a=c;c=b;
10.当a=1、b=2、c=3时,执行以下if语句后,a= 3 、b= 2 、c= 2 。
if(a>c)b=a;a=c;c=b;
11.当a=1、b=2、c=3时,执行以下if语句后,a= 1 、b= 2 、c= 2 。
if(a>c)b=a,a=c;c=b;
12.将以下两条if语句合并为一条if语句: 。
if(a>b) scanf(“%d”,&x);else scanf(“%d”,&y);
if(a<=b) i++;else j++;
答案:if(a>b) {scanf(“%d”,&x);j++;}
else {scanf(“%d”,&y);i++;}
13.将以下嵌套的if语句改写成不嵌套的if语句: 。
if(w<0) k=0;else if(w<=100) k=1; else k=0;
答案:if(w>=0&&w<=100)k=1; else k=0;
14.以下程序判断输入的一个整数是否能被3或7整除,若能整除,输出“YES”,若不能整除,输出“NO”。请填空:
#include <stdio.h>
main()
{ int k;
printf(“Enter a int number:”);scanf(“%d”,&k);
if( k%3==0||k%7==0 )printf(“YES\n”);else printf(“NO\n”);}
15.在switch语句中,当执行到break语句时,使流程 跳出开关语句 。
㈡.选择题:
1.若给定条件表达式(M)?(a++):(a--),则和表达式M等价的表达式为( )C。
A.M==0 B.M==1 C.M!=0 D.M!=1
2.为表示关系x≥y≥z,应使用的C语言表达式是( )A。
A.(x>=y) && (y>=z) B.(x>=y)AND(y>=z) C.(x>=y>=z) D.(x>=y)&(y>=z)
3.以下程序的输出结果是( )D。
A.0 B.1 C.2 D.3
main()
{ int a=2,b=-1,c=2;
if(a<b)
if(b<0) c=0;
else c+=1;
printf(“%d\n”,c); }
4.以下程序的输出结果是( )A。
A.1 B.2 C.3 D.4
main()
{ int w=4,x=3,y=2,z=1;printf(“%d\n”,(w<x ? w : z<y ? z : x));}
5.若执行以下程序时,从键盘上输入3和4,则输出结果是( )B。
A.14 B.16 C.18 D.20
main()
{ int a,b,s;scanf(“%d %d”,&a,&b); s=a;
if(a<b)s=b;
s*=s;printf(“%d\n”,s); }
6.在C语言中,if语句后的一对圆括号中,用以决定分支的流程的表达式( )。D
A.只能用逻辑表达式 B.只能用关系表达式
C.只能用逻辑表达式或关系表达式 D.可用任意表达式
7.下列程序段运行后,x的值是( )D。
A.14 B.4 C.15 D.3
ok1=1;ok2=2;ok3=3;x=15;
if(!ok1) x--;else if(ok2) if(ok3)x=3;else x=4;
8.在C语言中,switch语句后一对圆括号中exp的类型( )。A
A.可以是任何类型 B.只能为int型
C.可以是整型或字符型 D.只能是整型或实型
9.以下各组运算符中,优先级最高的分别为(⑴B ⑵C ⑶C ⑷D)。
⑴A.?: B.++ C.&& D.+=
⑵A.*= B.>= C.(类型) D.,
⑶A.|| B.% C.! D.==
⑷A.= B.!= C.*(乘) D.( )
10.若a为整型变量,b为字符型变量,则以下正确的switch语句是( )A。
A.switch((int)x/10) B.switch(b)
{ case 1:a++;break; { case ‘\042’;x=a/b;break;
case 2:b++;break; case ‘6’;x=a*b;break;
case 3:c++;break; case ‘\010’;x=a+c;break;
} }
C.switch((int)x/10); D.switch(a/100+10)
{ case 0:a++;break; { case2 :x=a/b;break;
default:b++;break; case6 :x=a*b;break;
case 3+1:c++;break; case8 :x=a+c;break;
case 3:d++;break; case10 :x=a-c;break;
} }
㈢.程序设计题:
1.从键盘输入一个字母,若是大写字母,要求改用小写字母输出。
#include<stdio.h>
void main()
{char var;
var=getchar();
if(var>=65&&var<=90)
var=32+var;
putchar(var);
}
2.求ax2+bx+c=0的根。a、b、c由键盘输入,设b2-4ac>=0.
#include<stdio.h>
#include<math.h>
void main()
{float a,b,c,p,x1,x2;
printf("input 3 numbers:\n");
scanf("%f%f%f",&a,&b,&c);
if(b*b-4*a*c>=0)
{
p=pow(b*b-4*a*c,0.5);
x1=(-b+p)/2;
x2=(-b-p)/2;
printf("x1=%f,x2=%f",x1,x2);
}
else
{
p=pow(-b*b+4*a*c,0.5);
printf("x1=%f+%fi,x2=%f-%fi",-b/2,p/2,-b/2,p/2);
}
}
第四章 循环结构程序设计
一.知识点
1.循环的概念,C实现循环的方法;
2.goto语句,注意标号的书写;
3.while语句,注意条件表达式的设计;
4.do……while语句,注意条件表达式的设计,及while之后的分号;
5.for语句,注意for中三个表达式的一般含义;
6.循环的嵌套;
7.break与continue语句,注意二者之间的区别;
8.循环结构程序设计思想
二.练习
㈠.填空题:
1.以下程序段的输出结果 。y=7,x=21
x=y=0;while(x<20)y++,x+=3;
printf(“y=%d,x=%d\n”,y,x);
2.当执行以下程序段后,i的值是 、j的值是 、k的值是 。5、4、6
int a,b,c,d,i,j,k;a=10;b=c=d=5;i=j=k=0;
for( ;a>b;++b)i++;
while(a>++c) j++;
do k++;while(a>d++);
3.以下程序段的输出结果 。死循环没有输出结果
int k,m,n;n=10;m=1;k=1;
while(k<=n) m*=2; printf(“%d\n”,m);
4.以下程序的输出结果 -1 。
main()
{ int x=2;while(x--);printf(“%d\n”,x);}
5.以下程序段的输出结果 11 。
int i=0,sum=1;do{ sum+=i++;}while(i<5);printf(“%d\n”,sum);
6.有以下程序段:
s=1.0;for(k=1;k<=n;k++)s=s+1.0/(k*(k+1));printf(“%f\n”,s);
要使下面的程序段的功能与上面程序段的功能相同,请填空:
s=0.0;k=0; d=1.0;
do{ s=s+d; k++ ;d=1.0/(k*(k+1));}while( k<=n);
printf(“%f\n”,s);
7.以下程序的功能是:从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。请填空:
main()
{ float x,amax,amin;
scanf(“%f”,&x);amax=x;amin=x;
while( x>=0 )
{ if(x>amax)amax=x;
if( x<amin )amin=x;
scanf(“%f”,&x);}
printf(“\namax=%f\namin=%f\n”,amax,amin); }
8.以下程序段的输出结果 。a=12,y=12↙a=16,y=28↙a=16,y=44↙a=16,y=60
a=10;y=0;
do { a+=2;y+=a;
printf(“a=%d,y=%d\n”,a,y);
if(y>50)break;}while(a=14);
9.下列程序段中,for循环的循环次数为 。10 9 8 7 6
a=2;b=10;for(i=b;i<=a;i--,a++) printf(“%3d”,i);
10.以下程序段的输出结果 。8 *6 *4 *2 *0↙ 8 *6 *4 *2 *0
for(i=0;i<3;i++,i++)
{ for(j=10;j>0;j--)
{ if((j+i)%2){ j--;printf(“*%d ”,j);continue;}
--j;--j;printf(“%d ”,j);}
printf(“\n”);}
㈡.选择题:
1.以下程序段的输出结果是( )D。
A.9 B.1 C.11 D.10
int k,j,s;
for(k=2;k<6;k++,k++){ s=1;for(j=k;j<6;j++) s+=j;}
2.以下程序段的输出结果是( )。C
A.12 B.15 C.20 D.25
int i,j,m=0;
for(i=1;i<=15;i+=4)
for(j=3;j〈=19;j+=4〉m++;
printf(“%d\n”,m);
3.以下程序段的输出结果是( )。B
A.10 B.9 C.10 D.9
9 8 9 8
8 7 8 7
7 6
int n=10;while(n>7){ n--;printf(“%d\n”,n);}
4.以下程序段的输出结果是( )。C
A.1 B.3 0 C.1 -2 D.死循环
int x=3;do { printf(“%3d”,x-=2);}while(!(--x));
5.以下程序的输出结果是( )。C
A.15 B.14 C.不确定 D.0
main()
{ int i,sum;for(i=1;i<6;i++)sum+=sum;printf(“%d\n”,sum);}
6.以下程序的输出结果是( )。B
A.741 B.852 C.963 D.875421
main(){ int y=10;
for( ;y>0;y--)if(y%3==0){ printf(“%d”,--y);continue;} }
7.若x是int型变量,以下程序段的输出结果是( )。D
A.**3 B.##3 C.##3 D.**3##4
##4 **4 **4##5 **5
**5 ##5
for(x=3;x<6;x++)printf((x%2)?(“**%d”) :(“##%d\n”),x);
8.以下程序的输出结果是( )。A
A.*#*#*#$ B.#*#*#*$ C.*#*#$ D.#*#*$
main()
{ int i;
for(i=1;i<=5;i++)
{ if(i%2)printf(“*”);else continue;
printf(“#”);}
printf(“$\n”); }
9.以下叙述正确的是( )。D
A.do_while语句构成的循环不能用其它语句构成的循环来代替。
B.do_while语句构成的循环只能用break语句退出。
C.用do_while语句构成循环时,只有在while后的表达式为非零时结束循环。
D.用do_while语句构成循环时,只有在while后的表达式为零时结束循环。
10.以下程序的输出结果是( )。D
A.39 81 B.42 84 C.26 68 D.28 70
main()
{ int x,i;
for(i=1;i<=100;i++)
{ x=i;if(++x%2==0)if(++x%3==0)if(++x%7==0)printf(“%d ”,x);}
printf(“\n”); }
11.对下面程序段描述正确的是( )。C
A.while循环执行了10次 B.循环是无限循环
C.循环体语句一次也不执行 D.循环体语句只执行一次
int x=10;while(x=0)x=x-1;
12.以下关于for循环的正确描述是( )。D
A.for循环只能用于循环次数已确定的情况
B.for循环是先执行循环体语句,后判断表达式
C.在for循环中,不能用break语句跳出循环体
D.for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来
13.下列程序段中是死循环的是( )。C
A.int n=1;while(!n)n++; B.int n=1;do { n--;}while(n);
C.int n=1;do { n++;}while(n); D.for(n=5;n<1;);
14.以下能正确计算1╳2╳3╳…╳10的程序段是( )。C
A.do { k=1;n=1;n=n*k;k++;}while(k<=10);
B.do { k=1;n=0;n=n*k;k++;}while(k<=10);
C.k=1;n=1;do { n=n*k;k++;}while(k<=10);
D.k=1;n=0;do { n=n*k;k++;}while(k<=10);
㈢.程序设计题:
1.编写程序,求1-3+5-7+…-99+101的值。
#include "math.h"
#include "stdio.h"
void main()
{
int i;
double sum=0.0;
for(i=0;i<=50;i++)
{
sum=sum+pow(-1,i)*(i*2+1);
}
printf("1-3+5-7+……-99+101=%0.0f",sum);
}
或者
#include "math.h"
#include "stdio.h"
void main()
{
int i,k=1;
long sum=0;
for(i=1;i<=51;i++)
{
sum+=k*(i*2-1);
k=-k;
}
printf("1-3+5-7+……-99+101=%ld",sum);
}
2.求1+2+3+…+100的值。
#include <stdio.h>
int main()
{
int i,sum=0;
i=1;
while(i<=100)
{
sum=sum+i;
i=i+1;
}
printf(“%d”,sum);
}
3.把100~200之间的不能被3整除的数输出。
#include<stdio.h>
void main()
{
int n;
for(n=100;n<=200;n++);
{
if(n%3!=0)
printf("%d ",n);
}
printf("\n");
}
4.求Fibonacci数列前20个数。
#include<stdio.h>
void main()
{int a[20],i;
a[0]=1;a[1]=1;
for(i=2;i<=19;i++)
a[i]=a[i-1]+a[i-2];
printf("\n");
for(i=0;i<20;i++)
printf("%d,",a[i]);
}
5.打印1000以内的所有素数。
#include"stdio.h"
void main()
{int a[1001],i,j;
a[0]=a[1]=0;
for(i=2;i<=1000;i++)
a[i]=i;
for(i=2;i<1001;i++)
{ if(a[i]!=0)
for(j=i+1;j<1001;j++)
{ if(j%i!=0);
else a[j]=0;
}
}
printf("\n");
for(i=0;i<1001;i++)
{
if(a[i]!=0)
printf("%d,",a[i]);
}
}
第五章 数组及其应用
一.知识点
1.数组的概念与定义
2.数组的初始化
3.数组元素的引用
4.字符数组的定义、使用、字符串处理函数
5.数组数据的一般处理方式
二.练习
㈠.填空题:
1.若有定义:double w[10];则w数组元素下标的上限是 9 ,下限是 0 。
2.以下程序的输出结果是 12 。
main()
{ int arr[10],i,k=0;
for(i=0;i<10;i++) arr[i]=i;
for(i=0;i<4;i++) k+=arr[i]+i;
printf(“%d\n”,z); }
3.以下程序的输出结果是 300,0,2 。
main()
{ int i,j,row,col,m;
int arr[3][3]={ {100,200,300},{28,72,-30},{-850,2,6}};
m=arr[0][0];
for(i=0;i<3;i++)
for(j=0;j<3;j++) if(arr[i][j]<m){ m=arr[i][j];row=i;col=j;}
printf(“%d,%d,%d\n”,m,row,col); }
4.在C语言中,二维数组元素在内存中的存放顺序是 按行存放。
5.若二维数组a有m列,则计算任一元素a[i][j]在数组中相对位置的公式为i*m+j+1。
6.若有定义:int a[3][4]={ {1,2},{0},{4,6,8,10}};则初始化后,a[1][2]得到的初值是 0 ,a[2][1]得到的初值是 6 。
7.若有说明char s[20];如果想从键盘上把字符串“This is a book.”输入到数组s中,应当调用的函数是 strcpy ;函数调用语句的形式是strcpy(s, “This is a book.”) 。
8.若有char str1[20]={“a good”},str[ ]={“ student”};能把str2中的字符串接到str1中的字符串后面的函数调用语句是 strcat(str1,str) 。
9.以下findmax函数返回数组s中最大元素的下标,数组中元素的个数由t传入,请填空。
findmax(int s[ ],int t)
{ int k,p;
for(p=0,k=p;p<t;p++)
if(s[p]>s[k]) p=k ;
return p ; }
10.以下程序统计从终端输入的字符中每个大写字母的个数,num[0]中统计字母A的个数,其它依次类推。用#号结束输入,请填空。
#include “stdio.h”
#include “ctype.h”
main()
{ int num[26]={0},i; char c;
while(c=getchar()!=‘#’)
if(isupper(c)) num[c-‘A’]+=1;
for(i=0;i<26;i++)
if(num[i]) printf(“%c: %d\n”,i+‘A’,num[i]);
}
㈡.选择题:
1.以下程序的输出结果是( )。A
A.不确定的值 B.3 C.2 D.1
main()
{ int n[2]={0},i,j,k=2;
for(i=0;i<k;i++)
for(j=0;j<k;j++)n[j]=n[i]+1;
printf(“%d\n”,n[k]);}
2.以下对一维数组a的正确说明是( )。D
A.char a(10); B.int a[ ];
C.int k=5,a[k]; D.char a[ ]={‘a’,‘b’,‘c’};
3.若有说明语句:int a[2][4];则对a数组元素的正确引用是( )。A
A.a[0]3] B.a[0][4] C.a[2][2] D.a[2][2+1]
4.以下能对二维数组y进行正确初始化的语句是( )。B
A.int y[2][ ]={ { 1,0,1 },{ 5,2,3 }};
B.int y[ ][3]={ {1,2,3},{4,5,6}};
C.int y[2][4]={1,2,3},{4,5},{6};
D.int y[ ][3]={ {1,0,1,0},{ },{1,1}};
5.若有说明语句:int y[ ][4]={0,0};则下面不正确的叙述是( )。D
A.数组y的每个元素都可以得到初值0;
B.二维数组y的行数为1; C.该说明等价于int y[ ][4]={0};
D.只有元素y[0][0]和y[0][1]可得到初值0,其余元素均得不到初值0;
6.若有说明语句:int a[ ][3]={1,2,3,4,5,6,7,8};则a数组的行数为( )。A
A.3 B.2 C.无确定值 D.1
7.若二维数组y有m列,则在y[i][j]前的元素个数为( )。B
A.j*m+i B.i*m+j C.i*m+j-1 D.i*m+j+1
8.若有以下语句,则正确的描述是( )。B
char x[ ]=“12345”;char y[ ]={‘1’,‘2’,‘3’,‘4’,‘5’};
A.x数组与y数组的长度相同 B.x数组长度大于y数组长度
C.x数组长度小于y数组长度 D.x数组等价于y数组
9.下面程序段的运行结果是( )。B
A.‘a’‘b’ B.ab C.ab c D.abc
char c[5]={‘a’,‘b’,‘\0’,‘c’,‘\0’};printf(“%s”,x);
10.有两个字符数组a、b,则以下能正确为a、b进行赋值的语句是( )。D
A.gets(a,b); B.scanf(“%s%s”,&a,&b);
C.getchar(a);getchar(b); D.gets(a);gets(b);
11.有字符数组s1[80]和s2[80],则以下能正确对s1、s2进行输出的语句是( )。B D
A.puts(s1,s2); B.printf(“%s,%s\n”,s1,s2);
C.putchar(s1,s2); D.puts(s1),puts(s2);
12.下面描述正确的是( )。D
A.两个字符串所包含的字符个数相同时,才能比较字符串;
B.字符个数多的字符串比字符个数少的字符串大
C.字符串“STOP ”与“STOP”相等 D.字符串“That”小于字符串“The”
13.以下对字符数组的描述中错误的是( )。C
A.字符数组中可以存放字符串 B.字符数组中的字符串可以整体输入、输出
C.可以在赋值语句中通过赋值运算符“=”对字符数组整体赋值
D.不可以用关系运算符对字符数组中的字符串进行比较
14.语句printf(“%d\n”,strlen(“school”));的输出结果是( )。B
A.7 B.6 C.存在语法错误 D.不定值
15.有语句char s1[10],s2[10]={“books”};则能将s2的值正确赋给s1的语句是( )。B
A.s1={“books”}; B.strcpy(s1,s2); C.s1=s2; D.strcpy(s2,s1);
㈢.程序设计题:
1.编写程序打印九九乘法表。
#include<stdio.h>
void main()
{int a[9][9],i,j;
for(i=0;i<9;i++)
for(j=0;j<=i;j++)
a[i][j]=(i+1)*(j+1) ;
for(i=0;i<9;i++)
{ for(j=0;j<=i;j++)
printf("%d*%d=%d",j+1,i+1,a[j][i]);
printf("\n");
}
}
2.用随机函数产生20个100以内的整数,用选择法对它们排序。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void main()
{int a[20],i,j,min,mid,f;
srand((unsigned)time(0));
for(i=0;i<20;i++)
a[i]=rand()%100;
for(i=0;i<19;i++)
{min=a[i];f=i;
for(j=i+1;j<20;j++)
{if(min>a[j])
{min=a[j];f=j;
}
else ;
}
if(f==i)continue;
else {mid=a[i];a[i]=a[f];a[f]=mid;}
}
printf("\n");
for(i=0;i<20;i++)
printf("%d,",a[i]);
}
3.用随机函数产生50个200以内的整数,用冒泡法对它们排序。
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void main()
{int a[50],i,j,mid;
srand((unsigned)time(0));
for(i=0;i<50;i++)
a[i]=rand()%200;
for(i=0;i<50;i++)
{
for(j=0;j<49;j++)
{ if(a[j]<a[j+1])
{mid=a[j];a[j]=a[j+1];a[j+1]=mid;}
}
}
printf("\n");
for(i=0;i<50;i++)
printf("%d,",a[i]);
}
4.打印杨辉三角形的前10行。
#include<stdio.h>
void main()
{int a[10][10],i,j,k;
for(i=0;i<10;i++)
{a[i][0]=1;a[i][i]=1;}
for(i=2;i<10;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
printf("\n");
for(i=0;i<10;i++)
{printf("\n");
for(j=0;j<=i;j++)
printf("%d,",a[i][j]);
}
}
5.有一篇文章,共有3行文字,每行有80个字符。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
#include<stdio.h>
void main()
{int A[26],a[26],N[10],M=0,Q=0,i;
char c;
int line=0;
int l=0;
for(i=0;i<26;i++)
{A[i]=0;
a[i]=0;
if(i<10)
N[i]=0;
}
while((c=getchar())!=EOF)
{if(line>=2)break;
else if(l>80){line++;continue;}
else l++;
{if(c>=65&&c<=90)A[c-65]+=1;
else if(c>=97&&c<=122)a[c-97]+=1;
else if(c>=48&&c<=57)N[c-48]+=1;
else if(c==32)M++;
else if(c=='\n')line++;
else Q++;
}
}
printf("\n");
for(i=0;i<26;i++)
printf("%d,",A[i]);
printf("\n");
for(i=0;i<26;i++)
printf("%d,",a[i]);
printf("\n");
for(i=0;i<10;i++)
printf("%d,",N[i]);
printf("\n");
printf("%d",M);
printf("\n");
printf("%d",Q);
}
6.从键盘输入数组a[10]中的十个数,并输出其中的最大值及其下标
#include<stdio.h>
main()
{int i,flag;
float a[10],max;
printf("input 10 num:");
for(i=0;i<10;i++)
scanf("%f",&a[i]);
flag=0;
max=a[0];
for(i=1;i<10;i++)
if(max<a[i])
{flag=i;max=a[i];}
printf("%d,%f",flag,a[flag]);
}
7.输入一行数字字符,请用数组元素作为计数器来统计每个字符的个数。用下标为0的元素统计字符“1”的个数,下标为1的元素统计字符“2”的个数,依次类推。
#include<stdio.h>
void main()
{int N[10],i;
char c;
for(i=0;i<10;i++)
{
N[i]=0;
}
while((c=getchar())!=EOF)
{ if(c>=49&&c<=57)N[c-49]+=1;
else if(c==48)N[9]+=1;
else ;
}
printf("\n");
for(i=0;i<10;i++)
printf("%d,",N[i]);
}
第六章 函数与模块化程序设计
一.知识点
1.函数定义的一般形式:函数类型 函数名(形参类型 形参名,……) { 函数体 }
2.函数的参数:注意形参与实参在类型、个数上的一一对应关系。
3.函数值:函数的返回值,也就是函数类型,若函数无返回值,则为void;
4.函数的调用:注意调用的形式;
5.函数原型与对被调函数的声明,注意整型函数可以不用声明;
6.函数的嵌套调用:
7.函数的递归调用,要求能用递归编写求n!、1+2+……+n等问题的程序。
8.数组作为函数参数,注意其含义及使用的情况;
9.变量的存储类型,注意static类型的初值、值的变化,外部变量的使用等;
10.内部函数和外部函数:注意其区别。
二.练习
㈠.填空题:
1.以下程序的输出结果是 12 。
unsigned fun6(unsigned num)
{ unsigned k=1;
do
{ k*=num%10;num/=10;}while(num);
return k;}
main()
{ unsigned n=26;
printf(“%d\n”,fun6(n)); }
2.以下程序的输出结果是 9.000000 。
double sub(double x,double y,double z)
{ y-=1.0;z=z+x;return z;}
main()
{ double a=2.5,b=9.0;
printf(“%f\n”,sub(b-a,a,a));}
3.以下程序的输出结果是 4 。
fun1(int a,int b)
{ int c;
a+=a;b+=b;c=fun2(a,b);
return c*c;}
fun2(int a,int b)
{ int c;
c=a*b%3;return c;}
main()
{ int x=11,y=19;
printf(“%d\n”,fun1(x,y));}
4.下面pi函数的功能是,根据以下公式返回满足精度ε要求的π的值。请填空。
double pi(double eps)
{ double s=0.0,t=1.0;int n;
for(n=1;t>eps;n++)
{ s+=t;t=n*t/(2*n+1);
return (2.0* s );}
5.以下函数是求x的y次方。请填空。
double fun(double x,int y)
{ int i;double z=1;
for(i=1;i <=y;i++) z= z*x ;return z;}
6.以下程序的功能是计算s=1!+2!+……+n!请填空。
long f(int n)
{ int i;long s;
s= 1 ;for(i=1;i<=n;i++) s= s*n ;
return s;}
main()
{ long s;int k,n;
scanf(“%d”,&n);s= 0 ;
for(k=0;k<=n;k++) s=s+ f(k) ;
printf(“%d\n”,s);}
7.在定义一个函数时如果不加类型说明,则它隐含的类型为 int 。
8.下列程序的运行结果是a= 4 ,b= 6
f( )
{ int a=3; static b=4; a=a+1; b=b+1;
printf(“a=%d,b=%d\n”,a,b);}
main( )
{ f( ); f( );}
9.下列程序的运行结果是 7;6;7↙2;7;5
main( )
{int i=2,x=5,j=7;
fun(j,6 );
printf(“i=%d;j=%d;x=%d\n”,i,j,x);}
fun( int i, int j)
{ int x=7; printf(“i=%d;j=%d;x=%d\n”,i,j,x);}
10.下列程序的运行结果是 # x=2 y=3 z=0↙* x=4 y=9 z=5↙@ x=2 y=3 z=0
main( )
{ int x=2; y=3; z=0;
printf(“# x=%d y=%d z=%d\n”, x, y, z);
add(x, y, z);
printf(“@ x=%d y=%d z=%d\n”, x, y, z);}
add( int x, int y, int z)
{ z=x+y; x=x*x;; y=y*y;
printf(“* x=%d y=%d z=%d\n”, x, y, z);}
㈡.选择题:
1.以下说法中正确的是( )。C
A.C语言程序总是从第一个定义的函数开始执行
B.在C语言程序中,要调用的函数必须在main函数中定义
C.C语言程序总是从main函数开始执行
D.C语言程序中的main函数必须放在程序的开始部分
2.以下函数的类型是( )。C
A.与参数x的类型相同 B.void类型 C.int类型 D.无法确定
fff(float x)
{ printf(“%d\n”,x*x);}
3.以下函数调用语句中,含有的实参个数是( )。B
A.1 B.2 C.4 D.5
func((exp1,exp2),(exp3,exp4,exp5));
4.以下程序的输出结果是( )。C
A.11 B.20 C.21 D.31
func(int a,int b)
{ int c;c=a+b;return c;}
main()
{ int x=6,y=7,z=8,r;
r=func((x--,y++,x+y),z--);
printf(“%d\n”,r);}
5.以下程序的输出结果是( )。A
A.-1 B.0 C.1 D.2
main()
{ int i=2,p;
p=f(i,i+1);
printf(“%d\n”,p);}
int f(int a,int b)
{ int c;c=a;
if(a>b) c=1;else if(a==b) c=0;else c=-1;
return (c);}
6.以下程序输出的结果是( )。C
A.0 B.1 C.6 D.无定值
fun(int a,int b,int c)
{ c=a*b;}
main()
{ int c;
fun(2,3,c);printf(“%d\n”,c);}
7.以下程序输出的结果是( )。A
A.5.500000 B.3.000000 C.4.000000 D.8.25
double f(int n)
{ int i;double s;
s=1.0;for(i=1;i<=n;i++) s+=1.0/i;return s;}
main()
{ int i,m=3;float a=0.0;
for(i=0;i<m;i++) a+=f(i);
printf(“%f\n”,a);}
- 以下不正确的概念是( ) B
A.函数不能嵌套定义,但可以嵌套调用
B.main函数由用户定义,并可以被调用
C.程序的整个运行最后在main函数中结束
D.在C语言中以源文件而不是以函数为单位进行编译
9.以下概念正确的是( ) B
A.形参是虚设的,所以它始终不占用存储单位
B.实参与它所对应的形参占用不同的存储单元
C.实参与它所对应的形参占用一个存储单元
D.实参与它所对应的形参同名时可占用一个存储单元
10.以下不正确的说法是B
A.在C语言中允许函数递归调用
B.函数值类型与返回值类型出现矛盾时,以函数值类型为准
C.形参可以是常量、变量或表达式
D.C语言规定,实参变量对形参变量的数据传递是“值传递”
11.以下正确的函数首部是C
A.float swap(int x,y)
B.int max(int a,int b)
C.char scmp(char c1,char c2);
D.double sum(float x;float y)
12.在函数中未指定存储类别的变量,其隐含存储类别为( )B
A.静态 B.自动 C.外部 D.存储器
13.在一个文件中定义的全局变量的作用域为( )D
A.本程序的全部范围
B.离定义该变量的位置最近的函数
C.函数内全部范围
D.从定义该变量的位置开始到本文件结束
14.以下函数的返回值类型是( )B
fun(int x)
{printf(“%d\n”,x);}
A.void类型 B.int类型 C.没有 D.不确定的
15.在一个函数中的复合语句中定义了一个变量,则该变量的有效范围是( )A
A.在该复合语句内
B.在该函数中
C.本程序范围内
D.非法变量
16.若用数组名作为函数调用的实参,传递给形参的是( )A
A.数组的首地址 B.数组第一个元素的值
C.数组中全部元素的值 D.数组元素的个数
㈢.程序设计题:
1.用递归法求n!。
#include<stdio.h>
void main()
{ int n;
float func(int);
scanf("%d",&n);
printf("\n%.0f",func(n));
}
float func(int n)
{if(n<0)
printf("error!");
if(n==0||n==1)
return(1.0);
else return(n*func(n-1));
}
2.用递归法求1+2+……+n。
#include<stdio.h>
void main()
{int n;
int func(int);
printf("input a num:");
scanf("%d",&n);
printf("\n%d",func(n));
}
int func(int n)
{if(n<=0)
printf("error!");
if(n==1)return(1);
else return(n+func(n-1));
}
第七章 编译预处理
一.知识点
1.宏定义:注意带参宏定义
2.文件包含:注意两种书写方式的区别
二.练习
㈡.选择题:
1.以下程序的输出结果是( )。B
A.15 B.100 C.10 D.150
#define MIN(x,y) (x)<(y)?(x):(y)
main()
{ int i,j,k;i=10;j=15;k=10*MIN(i,j);
printf(“%d\n”,k);}
2.以下程序中的for循环执行的次数是( )。C
A.5 B.6 C.8 D.9
#define N 2
#define M N+1
#define NUM (M+1)*M/2
main()
{ int i;for(i=1;i<=NUM;i++);
printf(“%d\n”,i);}
3.以下程序的输出结果是( )。B
A.11 B.12 C.13 D.15
#include “stdio.h”
#define FUDGF(y) 2.84+y
#define PR(a) printf(“%d”,(int)(a))
#define PRINT1(a) PR(a);putchar(‘\n’)
main()
{ int x=2;PRINT1(FUDGF(5)*x); }
4.以下叙述正确的是( )。D
A.用#include包含的头文件的后缀不可以是“.a”
B.若一些源程序中包含某个头文件;当该头文件有错时,只需对该头文件进行修改,包含此头文件所有源程序不必重新进行编译
C.宏命令可以看做是一行C语句
D.C编译中的预处理是在编译之前进行的。
5.以下有关宏替换的叙述不正确的是( )。D
A.宏替换不占用运行时间 B.宏名无类型
C.宏替换只是字符替换 D.宏名必须用大写字母表示
第八章 指针
一.知识点
1.指针的概念
2.指针变量
3.指针与数组
4.指针与字符串
二.练习
㈠.填空题:
1.若有定义:char ch;
⑴使指针p可以指向变量ch的定义语句是 。char *p=&ch;
⑵使指针p指向变量ch的赋值语句是 。p=&ch;
⑶通过指针p给变量ch读入字符的scanf函数调用语句是 。scanf(“%c”,p);
⑷通过指针p给变量ch赋字符的语句是 。*p=’a’;
⑸通过指针p输出ch中字符的语句是 。putchar(*p);或printf(“%c”,*p)
2.若有如图8.1所示五个连续的int类型的存储单元并赋值,且p和s的基类型皆为int,p已指向存储单元a[1]。
⑴通过指针p,给s赋值,使其指向最后一个存储单元a[4]的语句是 。s=p+3;
⑵用以移动指针s,使之指向中间的存储单元a[2]的表达式是 。s-=2 或s--,s--
⑶已知k=2,指针s已指向中间的存储单元a[2],表达式*(s+k)的值是 。50
⑷指针s已指向存储单元a[2],不移动指针s,通过s引用存储单元a[3]的表达式是
。*(s+1)
⑸指针s指向存储单元a[2],p指向存储单元a[0],表达式s-p的值是 。2
⑹若p指向存储单元a[0],则以下语句的输出结果是 。10 20 30 40 50
for(i=0;i<5;i++) printf(“%d ”,*(p+i));printf(“\n”);
㈡.选择题:
1.若有定义:int x,*pb;则以下正确的赋值表达式是( )。A
A.pb=&x B.pb=x C.*pb=&x D.*pb=*x
2.以下程序的输出结果是( )。B
A.因变量无定义输出不定值 B.0 C.-1 D.1
#include “stdio.h”
main()
{ printf(“%d\n”,NULL);}
3.已知指针p的指向如图8.1所示,则表达式*++p的值是( )。B
A.20 B.30 C.21 D.31
4.已知指针p的指向如图8.1所示,则表达式++*p的值是( )。C
A.20 B.30 C.21 D.31
5.以下程序的输出结果是( )。D
A.23 B.24 C.25 D.26
void prtv(int *x)
{ printf(“%d\n”,++*x); }
main()
{ int a=25;prtv(&a);}
6.指针变量a所指的字符串长度为( )D
A.26 B.27 C.28 D.23
char *a=”\nMy Name is Zhang Li.\”\n”;
7.在C语言中,变量的指针是指该变量的( )C
A.值 B.名 C. 地址 D.一个标志
8.下面程序段的运行结果是( )D
A.cde B.无确定的输出结果
C.字符’c’的ASCII码值 D.存放字符’c’的存储单元的地址
char *s=”abcde”; s+=2; printf(“%d”,s);
9.若有定义:int *p[4];则标识符p( )B
A.是一个指向整型变量的指针 B.是一个指针数组名
C.是一个指针,它指向一个含有四个整型元素的一维数组
D.说明不合法
10.有一个二维数组a[3][4],2行3列元素的正确表示方法为( )D
A.&a[2][3] B.a[2]+3 C.*(a+2)+3 D.*(a[2]+3)
11.若有以下说明语句
char *language[ ]={“FORTRAN”,”BASIC”,”PASCAL”,”JAVA”,”C”};
则表达式:*language[1] >*language[3] 比较的是()B
A.字符B和字符J B.字符串BASIC和字符串JAVA
C.字符串FORTRAN和字符串PASCAL D.字符F和字符P
12.指向一个包含4个整型元素的一维数组的指针变量的定义形式为( )A
A.int (*p)[4]; B.int *p[4]; C.int (p[4]); D.int (p)[ ]
13.以下程序的运行结果是( )A
fun( int *p1,int *p2)
{ if(*p1>*p2) printf(“%d\n”,*p1);
else printf(“%d\n”,*p2);}
main( )
{ int a=3,b=7; fun(&a,&b);}
A.7 B.3 C.10 D.4
第九章 结构体与共用体
一.知识点
1.结构体的概念与定义
2.结构体变量的定义
3.结构体变量的引用
4.结构体数组
5.共用体的概念与定义
6.枚举类型
7.用户自定义类型
二.练习
㈠.填空题:
1.为了建立如图所示的存储结构(即每个结点含两个域,data是数据域,next是指向结点的指针域),请填空。
struct link
{ char data;
struct link *next ;}node;
2.访问结构体数组元素a[k]的成员b,写作 。a[k].b
3.以下程序的运行结果是 Zhang 。
struct s
{ int num;
char name[20];
int age;
};
main( )
{ struct s stud[3]={ {101,”Li”,18},{102,”Wang”,19},{103,”Zhang”,21}};
fun(stud+2);
}
fun(struct s *p)
{ printf(“%s\n”,(*p).name);}
4.以下程序的运行结果是__2,3___。
main( )
{ struct EXAMPLE
{struct
{int x;
int y;
}in;
int a;
int b;
}e;
e.a=1;e.b=2;
e.in.x=e.a*e.b;
e.in.y=e.a+e.b;
printf(“%d,%d”,e.in.x,e.in.y);
㈡.选择题:
1.根据以下定义,能输出字母M的语句是( )D。
A.printf(“%c\n”,class[3].name); B.printf(“%c\n”,class[3].name[1]);
C.printf(“%c\n”,class[2].name[1]); D.printf(“%c\n”,class[2].name[0]);
struct person{ char name[9];int age;};
struct person class[10]={ “John”,17,“Paul”,19,“Mary”,18,“Adam”,16};
2.以下程序的输出结果是( )D。
A.32 B.16 C.8 D.24
typedef union{ long x[2];int y[4];char z[8];}MYTYPE;
MYTYPE them;
main(){ printf(“%d\n”,sizeof(them));}
3.设有定义语句
enum weekday{sun,mon,tue,wed,thu,fri,sat} workday;
则以下语句中编译能通过的语句为___________. B
A.sun=0; B.workday=thu; C.workday=3; D.workday=1/7;
4.以下对结构体类型变量的定义中,不正确的是( )。C
A. typedef struct aa B.#define AA struct aa
{ int n; AA { int n;
float m; float m;
}AA; }td1;
AA td1;
C) struct D) struct
{ int n; { int n;
float m; float m;
}aa; }td1;
stuct aa td1;
5.当定义一个结构体变量时,系统分配给它的内存是( )B
A.结构体最后一个成员所需内存量的大小。
B.各成员所需内存量的总和。
C.成员中占内存量最大者所需的容量。
D.结构体中第一个成员所需内存量。
6.在16位IBM-PC机上使用C语言,如果有以下说明语句,则变量ss所占内存的字节数为( )C
struct s
{ int m; char c; double d; }ss;
A.8 B.1 C.11 D.2
7.下面程序的运行结果是( )D
main( )
{ struct cmplx
{ int x;
int y;
}cnum[2]={1,3,2,7}; prinyf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x);}
A.0 B.1 C.3 D.6
第十章 位运算
一.知识点
1.位运算符与位运算赋值运算符
二.练习
㈠.填空题:
1.设变量a的二进制数是00101101,若想通过运算a^b使a的高4位取反,低4位不变,则b的二进制数应是 。11110000
2.a为任意整数,能将变量a清零的表达式是 。a&0
3.a为任意整数,能将变量a中的各二进制位均置成1的表达式是 。a|1
4.能将两字节变量x的高8位置全1,低字节保持不变的表达式是 。x|ff00
5.运用位运算,能将八进制数012500除以4,然后赋给变量a的表达式是 。a=012500>>2
6.运用位运算,能将变量ch中的大写字母转换成小写字母的表达式是 。ch+=1<<5
7.3 && 5的值是——,3& 5的值是——,3||5的值是——,3|5的值是——。 1、1、1、7
8.表达式~2&3<<2|3的值是——。15
9.表达式5^3|2<<1的值是——。6
10.表达式025&012的值是——。0
11.在位运算中,操作数每向右移动一位相当于操作数—除—以—2—。
12、在位运算中,操作数每向左移动一位相当于操作数—乘—以—2—。
㈡.选择题:
1.以下程序的输出结果是( )。D
A.100 B.160 C.120 D.64
main(){ char x=040;printf(“%d\n”,x=x<<1);}
2.以下程序段中c的二进制值是( )。B
A.00011011 B.00010100 C.00011100 D.00011000
3.以下程序的输出结果是( )。B
A.0 B.1 C.2 D.3
main(){ int x=35;char z=‘A’;printf(“%d\n”,(x&15)&&(z<‘a’));}
4.以下程序的输出结果是( )。A
A.0 B.1 C.2 D.3
main()
{ int a=5,b=6,c=7,d=8,m=2,n=2;
printf(“%d\n”,(m=a>b)&(n=c>d));}
5.执行以下语句后a和b的值分别为( ) C
int a=1,b=2;a=a^b;b=b^a;a=a^b;
A.a=1,b=2 B.a=2,b=2 C.a=2,b=1 D.a=1,b=1
6.以下程序段的执行结果是( ) A
char a=56;a=a&056;printf(“%d,%o\n”,a,a);
A.40,50 B.1,1 C.56,60 D.50,56
第十一章 文件
一.知识点
1.文件类型指针:FILE
2.文件的打开与关闭:fopen()、fclose()
3.文件的读写:fputc()、fgetc()、fread()、fwrite()、fprintf()、fscanf()
4.文件的定位:rewind()、fseek()、ftell()
5.出错检测:ferror()、clearerr()
二.练习
㈠.填空题:
1.在C程序中文件可以用两种方式存取,它们是 和 。顺序 和 随机
2.在C程序中数据可以用两种代码形式存放,它们是 和 。ASCII码 和 二进制码
3.在C语言中,文件的存取是以 为单位的,这种文件被称作 文件。字节、流式
4.在C语言中,文件的打开使用 ,文件的关闭使用 。fopen()、fclose()
5.在C语言中,文件类型为 。文本文件或二进制文件
㈡.选择题:
1.若执行fopen函数时发生错误,则函数的返回值是( )。D
A.随机值 B.1 C.NULL D.EOF
2.若用fopen函数打开一个新的二进制文件,要求文件既能读也能写,则应选用的文件方式字符串是( )。A
A.“wb+” B.“r+” C.“rb+” D.“ab+”
3.当正常执行了文件关闭操作时,fclose函数的返回值是( )。C
A.-1 B.随机值 C.0 D.1
4.在C语言中,对文件的存取是以( )为单位的。C
A)记录 B)函数 C)字节 D)模块
5.定义fp为文件型指针变量,使用fopen函数打开一个既能读也能写的新的二进制文件,以下正确的调用形式是( )C
A. fp=fopen(“filel”,”ab+”)
B. fp=fopen(“filel”,”r+”)
C. fp=fopen(“filel”,”wb+”)
D.fp=fopen(“filel”,”ab”)
6.fgetc函数的作用是从指定文件读入一个字符,该文件的打开方式必须是( )C
A.只写 B.追加 C.读或读写 D.答案B和C都正确
7.若调用fputc函数输出字符成功,则其返回值是( )D
A.EOF B.1 C.0 D.输出的字符
8.fread和fwrite函数常用来要求一次读入/输出( )数据D
A.一个整数 B.一个实数 C.一个字节 D.一组
9.函数调用语句:fseek(fp,-20L,2);的含义是( )C
A.将文件位置指针移到距离文件头20个字节处
B.将文件位置指针从当前位置向后移动20个字节
C.将文件位置指针从文件末尾处向后退20个字节
D.将文件位置指针移到离当前位置20个字节处
10.函数rewind的作用是( )B
A.位置指针自动移到下一个字符位置
B.位置指针重新返回文件的开头
C.位置指针自动移到文件尾
D.位置指针移到指定的位置
11.当fclose函数正确执行后,函数的返回值是( )A
A.0 B.-1 C.1 D.非零值
转载:https://blog.csdn.net/qq_27248989/article/details/111053306