y):
z;
mid0=x+y+z-max0-min0;
【习题4】
编程实现,输入一个整数,判断它是否为偶数,并显示相应的信息。
提示:
x代表输入的整数,if(x%2==0)printf("\neven");elseprintf("\nodd");
编程实现,输入一个平面上的点,判断它是否落在单位圆上,并显示相应的信息。
提示:
x,y代表平面坐标,if(x*x+y*y==1)printf("\nYes");elseprintf("\nNo");
编程实现,输入一个成绩等级(A-E),显示相应的百分制成绩段。
A:
90-100
B:
80-89
C:
70-79
D:
60-69
E:
<60
提示:
chargrade;
if(grade=='A')printf("\n90-100");
elseif(grade=='B')printf("\n80-89");
....
写出下面程序的运行结果:
#include<>
main()
{
inta=-1,b=1,c=5;
switch(a>0){
case1:
switch(b-2<0){
case1:
printf("&");break;
case2:
printf("*");break;
}
case0:
switch(c==5){
case0:
printf("!
");break;
case1:
printf("#");break;
default:
printf("%%");
}
default:
printf("@");
}
}
运行结果:
@
编程实现,使用循环结构打印以下图案。
*
***
*****
*******
*****
***
*
提示:
输出时,本图案要按向上三角形和向下三角形进行输出。
每行输出中包括空格输出,‘*’号输出。
输出空格和‘*’号个数要与行循环控制变量关联起来。
【习题5】
填空题:
若有定义inta[3][5];则排列在数组中的第9个元素是(a[1][3])。
strlen("Howareyou\n")的值是(12)。
5.3C语言中字符串结束的标志是('\0')。
写出一个名为s的单精度实型一维数组,长度是6,所有元素初值均为0,其数组定义语句是(floats[6]={0};)。
strcmp("how","How")的值是(32或>0)。
选择题:
若有ints[4]={1,2,3,4};,则s[s[0]+2*s[2]-s[3]]的值是(D)
.2C
对数组的描述正确的是(B)。
A.数组一旦定义其大小是固定的,但数组元素的类型可以不同。
B.数组一旦定义其大小是固定的,但数组元素的类型必须相同。
C.数组一旦定义其大小是可变的,但数组元素的类型可以不同。
D.数组一旦定义其大小是可变的,但数组元素的类型必须相同。
对字符串"Boy"进行完整赋值的操作是(B)。
A.chars[3]={'B','o','y'};B.chars[]="Boy";
C.chars[3]={"Boy"};s[3];s="Boy";
在c语言中引用数组元素时,其数组下标的数据类型允许是(C)。
A.整型常量B.整型表达式
C.整型常量或整型表达式D.任何类型的表达式
对以下说明语句的正确理解是(B)。
inta[10]={6,7,8,9,10};
A.将5个初值依次赋给a[1]至a[5]
B.将5个初值依次赋给a[0]至a[4]
C.将5个初值依次赋给a[6]至a[10]
D.因为数组长度与初值的个数不相同,所以此语句不正确
三、看程序写结果
main()
{inta[3][3]={{1,0,2},{2,2},{0,2}},c[3][3],i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
c[i][j]=a[a[i][j]][a[j][i]];
printf("%5d",c[i][j]);
}
}
printf("\n");
}
运行结果为:
220002201
当运行以下程序时,从键盘输入:
Ah2MAA3ha,请写出输出结果。
main()
{chars[80],c='a';
inti=0;
scanf("%s",s);
while(s[i++]!
='\0')
if(s[i]==c)s[i]=s[i]-32;
elseif(s[i]==c-32)s[i]=s[i]+32;
puts(s);
}
运行结果为:
AH2Ma
四、编程题
用数组方法定义一个矩阵,求其转置矩阵。
提示:
已知a[3][2],转置后的结果存放在b[2][3];则b[j][i]=a[i][j];
从键盘输入9个不同的整数,组成三行三列的二元数组,找出每一列中的最大元素,并输出其行、列下标。
提示:
已知a[3][3],max,row,col分别用来存放一列的最大值,行下标和列下标。
利用一个二维数组,打印出以下杨辉三角形,要求打印出10行。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
∶
∶
提示:
定义一个10行10列的二维数组,并且通过两重循环对第1列所有元素赋值1,主对角线也赋值。
根据a[i][j]=a[i-1][j]+a[i-1][j-1]求出其它元素的值。
把30个学生的学号和两门课程的成绩输入到一个二维数组中,求出的每个学生的两门课程的总成绩也放于此数组中,请按学生总分的高低打印出成绩单(包括学号、两门课程成绩和总分)。
提示:
定义一个30行4列的数组。
为了先快速测试算法是否正确可以定义一个3行4列的数组,并且通过赋初始值,减少调试程序时反复输入数据的麻烦,算法调试成功后在加上输入数据部分。
实现从高到低打印出成绩可以通过排序(降序);也可以通过另外定义1个一维数组作为索引,再通过索引打印成绩。
从键盘上输入一串字符,将其逆向显示。
提示:
首先计算字符串的长度,在从右边逐一显示字符,直到下标等于0为止。
【习题6】
填空题
6.1C语言程序执行的开始处是main函数。
6.2C程序中的一个函数由两部分组成,即声明部分和执行部分。
为了保证被调用函数不返回任何值,其函数定义的类型应为void。
若一个局部变量的存储类型是static,则该变量的值在程序执行完成时被释放。
预处理命令#include的作用是文件包含。
定义一个宏,功能是判断两个数是否相等,相等为1,不等为0。
#defineEQU(a,b)(a)==(b)1:
0
变量的存储类别有自动型、静态型、寄存器型、和外部类型共4种,它们分别用auto、static、register、extern标识。
选择题
下述函数定义形式正确的是(C)。
A.intf(intx;inty)B.intf(intx,y)
C.intf(intx,inty)D.intf(x,y:
int)
关于函数参数,说法正确的是(A)。
A.实参与其对应的形参各自占用独立的内存单元
B.实参与其对应的形参共同占用一个内存单元
C.只有当实参和形参同名时才占用同一个内存单元
D.形参是虚拟的,不占用内存单元
用数组名作为函数的实参时,传递给形参的是(A)。
A.数组的首地址B.数组的第1个元素
C.数组中的全部元素D.数组的元素个数
复合语句中定义的变量的作用范围是(D)。
A.整个源文件B.整个函数
C.整个程序D.所定义的复合语句
一个函数的返回值由(D)确定。
A.return语句中的表达式B.调用函数的类型
C.系统默认的类型D.被调用函数的类型
在一个C源文件中,若要定义一个只允许本源文件所有函数使用的全局变量,其他文件中不允许使用,则该变量需要使用的存储类别是(D)。
A.autoB.registerC.externD.static
判断题
若定义的函数没有参数,则函数名后的圆括号可以省略。
(′)
函数的函数体可以是空语句()。
只有main函数才能调用其他函数。
()
语句中表达式的类型必须与函数定义的类型一致。
(′)
函数的实参和形参可以是相同的名字。
()
函数调用中,形参与实参的类型和个数必须保持一致。
()
外部类型的变量只能定义一次,但可在不同地方声明多次。
()
外部类型的变量作用范围大,编程中应多用外部变量。
(′)
预处理命令行必须以#开头,且最后要用分号结尾。
(′)
宏命令的处理占用编译时间,而不占用运行时间。
()
看程序写结果
intfun(intn)
{intf=1;
f=f*n*2;
return(f);
}
main()
{inti,j;
for(i=1;i<=5;i++)
printf("%d\t",fun(i));
}
程序运行结果:
246810
intx1=30,x2=40;
main()
{intx3=10,x4=20;
sub(x3,x4);
sub(x2,x1);
printf("x1=%d,x2=%d,x3=%d,x4=%d",x1,x2,x3,x4);
}
sub(intx,inty)
{intx1=x;
x=y;
y=x1;
}
程序运行结果:
x1=30,x2=40,x3=10,x4=20
#defineA4
#defineB(x)A*x/2
main()
{floatc,a=;
c=B(a);
printf("c=%5.1f",c);
}
程序运行结果:
c=
编程题
写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。
两个整数由键盘输入。
提示:
最大公约数可以采用“辗转相除法”,最小公倍数将两数乘积除于最大公约数。
“辗转相除法”:
设两个数分别用m,n表示且m>n,临时变量t,t=m%n;m=n;n=t;直到n等于0。
有3′3的矩阵A和3′2的矩阵B,编制一个函数,求C=AX′B。
提示:
参照习题,A,B,C三个数组作为函数参数。
编写一函数,使输入的一个字符串按反序存放,在主函数中输入输出字符串。
提示:
一维字符数组用来存放字符串,并且将它传递到函数,在函数中通过元素值交换来完成反序存放。
编制一个函数,由参数传入一个字符串,统计此字串中字母、数字、和其他字符的个数,在主函数中输入字符串并显示统计结果。
提示:
参照例题。
【习题7】
语句inta,*p=&a;的含义是什么
答:
定义整型变量a,和整型指针变量p,并且p指向变量a。
写出下列数组元素的指针法表示。
(1)num[3]
(2)data[4][2]
答:
(1)*(num+3)
(2)*(*(data+4)+2)
写出下列数组元素的下标法表示。
(1)*(*(a+1)+2)
(2)(*(a+3))[4](3)*(a[2]+5)
答:
(1)a[1][2]
(2)a[3][4](3)a[2][5]
分析程序,写出程序输出结果。
(1)main()
{inta[5]={1,2,3,4,5};
int*p=&a[1];
printf("%d",p[2]);
}
输出结果:
4
(2)main()
{chara[]="IloveChina!
";
char*p=a;
p=p+2;
printf("%s",p);
}
输出结果:
loveChina!
(3)main()
{inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int(*pa)[4]=a;
pa++;
printf("%d",*(*(pa+1)+2));
}
输出结果:
11
(4)main()
{char*str[]={"zhao","qian","sun","li"};
inti;
for(i=0;i<4;i++)
printf("%c",str[i][0]);
}
输出结果:
zqsl
(5)voidsub(intx,inty,int*z)
{*z=y-x;}
main()
{
inta,b,c;
sub(10,5,&a);
sub(7,a,&b);
sub(a,b,&c);
printf("%4d,%4d,%4d\n",a,b,c);
}
输出结果:
-5,-12,-7
(6)#include<>
fun(char*s)
{char*p=s;
while(*p)p++;
return(p-s);
}
main()
{char*str="abcd";
inti;
i=fun(str);
printf("%d",i);
}
输出结果:
4
定义语句int*f();和int(*f)();的含义分别是什么
答:
int*f();表示函数返回一个整型指针;int(*f)();表示f是函数指针,指向整型函数。
在二维数组中存放有4个学生,5门课程的成绩,用指针编程实现:
(1)求出每门课程的平均成绩。
(2)求每个学生的总成绩和平均成绩。
(3)在屏幕上列出各课成绩在85分以上的学生名单。
(4)在屏幕上列出补考通知单。
提示:
(1)
(2)(3)略,(4)根据成绩小于60分,由于有5门课程的成绩,所以需要使用elseif结构。
输入一个字符串,内有数字和非数字字符,例如:
a345dsaf412x371+89tah74
编程将其中连续的数字作为一个证书,一次存放到一个数组d中,例如:
345放在d[0],412放在d[1],......。
统计共有多少个证书,并输出这些整数。
提示:
从字符串中提取"345":
t=ch-'0';t=t*10+(ch-'0');t=t*10+(ch-'0');
t='3'-'0'=3;t=3*10+('4'-'0')=34;t=34*10+('5'-'0')=345
编写把十六进制数字字符串变换成整数的函数:
inthtoi(char*s)。
提示:
同
编写把十进制整数变换成二进制数字字符串的函数:
char*itob(intn)。
提示:
同
用字符指针实现字符串拷贝功能,不能使用库函数。
提示:
定义两个字符数组a,b,复制操作b[i]=a[i];
用字符指针实现字符串连接功能,不能使用库函数。
提示:
定义两个字符数组a,b,先将下标定位到a的末尾'\0',在将b的元素赋值给a的对应元素,注意:
别忘了添加字符串结束标志'\0'。
用指向指针的指针的方法对5个字符串排序并输出。
提示:
一个指针数组和一个指向指针的指针变量。
【习题8】
定义复数结构体,并写出复数的加、减、乘、除、的计算函数。
提示:
复数包括两个部分:
实部和虚部。
定义一个结构体变量(包括年、月、日)。
计算该日在本年中是第几天。
注意闰年问题。
提示:
计算该日是本年中的第几天,是从本年1月1日起。
有5个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入5个学生数据,要求在屏幕上显示出3门课程的平均成绩,以及最高分数的学生的数据(包括学号、姓名、3门课程成绩、平均分)。
提示:
定义结构体数组。
最高分数是指每个学生3门课程的平均分最高。
编写求链表长度的函数。
提示:
从链表指针头往表尾移动计算结点的个数。
已有两个链表a、b,每个链表的结点包括学号、成绩。
要求把两个链表合并,按学号升序排列。
提示:
可以定义一个新的链表,先从链表a,再从链表b中取出结点,依次按学号升序插入到新的链表中。
利用节中的structcard结构编写一个程序实现5个人员数据输入和在屏幕上显示的功能:
如果job项为't',则在position项为教师的职称(助教、讲师、副教授、教授);如果job项为's',则class项为学生的班级号,如501。
提示:
在结构体中嵌入共用体position,根据job成员确定position的具体值。
口袋中有红、黄、兰3中颜色的球若干个。
每次从口袋中取出1个球,根据颜色的不同,输入相应的颜色英文字符串。
要求用枚举变量实现。
提示:
参照例。