C程序设计项目教程习题答案.docx
《C程序设计项目教程习题答案.docx》由会员分享,可在线阅读,更多相关《C程序设计项目教程习题答案.docx(31页珍藏版)》请在冰点文库上搜索。
C程序设计项目教程习题答案
项目一
项目考核
一、选择题
1—6:
ACCCDC
二、简答题
1.机器语言、汇编语言、高级语言各有什么特点?
①机器语言
机器语言是以二进制代码(0和1)表示机器指令的一种语言,用机器语言编写的程序能被计算机直接执行。
但使用机器语言编写程序非常繁琐,程序代码很难读懂且不通用。
②汇编语言
汇编语言用易懂的符号代替二进制代码,使得编程技术前进了一大步。
计算机并不能直接执行,需要借助汇编编译器将它翻译成二进制机器代码。
③高级语言
高级语言屏蔽了机器的细节,更接近于自然语言和数学语言,给编程带来了极大的方便,如FORTRAN、BASIC、C、C++、Java、C#等。
2.简述执行C语言程序的基本过程。
C语言程序都采用编译方式运行,一般分为编辑、编译、连接和运行过程。
(.exe)
①编写源代码
使用C语言编写实现特定功能的程序代码,源代码必须遵循C语言的规范。
②编译
编译阶段是将我们编写的源代码翻译为计算机能够理解的二进制目标代码。
③连接
连接过程便是将目标文件与函数合并成完整的可执行文件,即生成.exe文件,这样程序就可以在计算机上直接运行了。
④运行
即执行连接成功后得到的可执行程序。
3.简述C程序的基本结构。
①C语言程序由函数构成
②程序中包含对库函数的引用
③程序有良好的编码格式
④编写程序注释
⑤友好的人机交互提示
4.简述调试C程序的基本步骤。
第一步设置断点
单击工具栏按钮
即可添加断点,此时该行前端将出现一个断点标志
。
第二步开始调试程序
打开“组建”下拉菜单,执行“开始调试”→“GO”命令(或直接按【F5】键),程序会进入调试模式,并且会在断点处暂停。
第三步单步运行
不断按【F10】键,程序会一步一步地向前执行。
项目实训
略
项目二
项目考核
一、选择题
1—12:
DAAABBDCABAC
二、简答题
1.在程序中定义数据类型的目的是什么?
C语言提供了哪些基本数据类型?
答:
为了在程序中存储不同类型的数据,并节省空间。
C语言提供了以下数据类型:
函数类型
2.常量和变量有何区别?
字符常量和字符串常量有何区别?
答:
常量是指在程序执行过程中值保持不变的量,变量是指在程序运行过程中值可以改变的量,每个变量都必须在声明时明确定义其数据类型,并且需要用标识符标识。
字符串常量与字符常量有所不同。
字符型常量在内存中只占一个字节;字符串是按照串中字符的排列顺序存放的,每一个字符占一个字节,并在末尾添加“\0”作为字符串结尾标志或结束标志。
3.在C语言中如何表示不同进制的整数?
答:
①十进制整型常量:
由正、负号和数字0~9组成,但数字部分不能以0开头,如12、-7、0等。
②八进制整型常量:
由正、负号和数字0~7组成,数字部分以0开头,如-0408、07761等。
③十六进制整型常量:
由正、负号,数字0~9和字母A~F(或a~f)组成,数字部分以0X或0x开头,A~F(或a~f)分别表示数值10~15,如0XFFFF、-0x2D等。
4.下列标识符中哪些是合法的?
并指出系统自定义的标识符
2aa#t3_hitint
答:
合法标识符:
t3_hitint(为系统自定义标识符)
5.写出下面程序的输出结果
#include
voidmain()
{
inti,j,m,n;
i=5;
j=10;
m=++i;
n=j++;
printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n);
}
结果为
i=6,j=11,m=6,n=10
项目实训
#include"stdio.h"
voidmain()
{
intnum,i;
charname[10];//字符串用数组方式存储,下同
intage;
intbase_salary;
floatratio,salary,yj,sum_age,sum_salary;
sum_age=sum_salary=0;
printf("**********************************\n");
printf("输入与输出职工工资信息\n");
printf("**********************************\n");
for(i=0;i<3;i++)
{
//输入并存储职工工资信息
printf("\n\n");
printf("请输入员工编号:
\n");
scanf("%d",&num);
printf("请输入姓名:
\n");
scanf("%s",&name);
printf("请输入年龄:
\n");
scanf("%d",&age);
fflush(stdin);//清空缓存
printf("请输入基本工资:
\n");
scanf("%d",&base_salary);
printf("请输入级别系数:
\n");
scanf("%f",&ratio);
printf("请输入销售额:
\n");
scanf("%f",&yj);
//计算每个人工资总额
salary=base_salary+yj*0.01*ratio;
//输出职工工资信息
printf("\n\n下面输出职工工资信息\n");
printf("员工编号:
%d\n",num);
printf("姓名:
%s\n",name);
printf("年龄:
%d\n",age);
printf("工资总额为:
%f\n",salary);
sum_age=age+sum_age;
sum_salary=salary+sum_salary;
}
printf("\n\n");
printf("平均年龄为:
%f\n",sum_age/3);
printf("平均工资为:
%f\n",sum_salary/3);
}
项目三
项目考核
一、选择题
1-2AA
二、简答题
1.将任务一【例3-2】的算法用流程图表示出来。
2.计算
的值,设计算法并尝试写出程序进行调试。
自然语言描述如下:
S1:
sigh=1
S2:
sum=1
S3:
deno=2
S4:
sigh=(-1)×sigh
S5:
term=sigh×(1/deno)
S6:
sum=sum+term
S7:
deno=deno+1
S8:
若deno≤100,返回S4;否则,结束。
流程图描述如下:
结束
参考程序代码如下:
#include"stdio.h"
voidmain()
{
intsigh,deno;
longdoublesum,term;
sigh=1;
deno=2;
term=sum=0;
for(;deno<=100;deno++)
{
sigh=(-1)*sigh;
term=sigh*(1/deno);
sum=sum+term;
}
printf("表达式的值为:
%.20lf",sum);
}
N
Y
项目实训
#include
intmain()
{
intsushu(intx);
intn;
printf("请输入一个大于1的整数:
\n");
scanf("%d",&n);
sushu(n);
return0;
}
intsushu(intx)
{
inti;
for(i=2;iif(x%i==0)
break;
if(i==x)
printf("是素数\n");
else
printf("不是素数\n");
return0;
}
程序运行结果
项目四
项目考核
一、选择题
1-5DBCCC
二、简答题
1.简述逻辑运算符与条件运算符的使用方法。
逻辑运算符的使用方法
表4-2逻辑运算符及其用法
逻辑运算符
名称
说明
示例
结果
!
逻辑非
一元运算符,真变假,假变真
!
6<5
1
&&
逻辑与
两操作数同真结果为真,否则为假。
但当左操作数为假时,其结果则为假,不再计算右操作数的值
Abc=abc&&8>4
0
||
逻辑或
两操作数同假结果为假,否则为真。
但当左操作数为真,其结果则为真,不再计算右操作数的值
ef=ef||ac=bd
1
条件运算符的使用方法
条件运算符“?
:
”也称三元运算符,它根据布尔型表达式的值返回两个值中的一个,其格式如下:
条件?
第一个表达式:
第二个表达式;
如果条件为true,则计算第一表达式并以它的计算结果为整个条件表达式的值;如果为false,则计算第二表达式并以它的计算结果为整个条件表达式的值。
2.简述C语言中switch语句的特点。
①switch语句中的表达式通常为整型或字符型,配套的常量类型也应该是字符型或整型。
此外,如果常量类型是字符型,一定要用单引号括起来(如'A'),而不能使用双引号("A")。
②每个case后面的常量表达式必须各不相同,否则会出现矛盾,即一个值有多种选择。
③各个case语句和default语句出现的顺序对执行结果没有影响。
④每个分支的语句可以是单条语句,也可以是多条语句,多条语句不用加花括号。
⑤通常情况下,每个分支语句后都要加一个break语句,表示跳出switch语句。
程序在执行完该分支的语句后,如果有break语句,则结束switch语句,否则,继续执行下面的语句,直到遇到break语句或整个switch语句结束。
项目实训
实训一
#include
voidmain()
{
floatweight,price;
printf("请输入您行李的重量!
");
scanf("%f",&weight);
if(weight<0)
{
printf("您输入的数据有误!
");
}
elseif(weight<=20)
{
printf("您可以免费托运行李!
");
}
elseif(weight<=30)
{
price=(weight-20)*30;
printf("您的托运费用为%f元!
",price);
}
elseif(weight<=40)
{
price=(30-20)*30+(weight-30)*40;
printf("您的托运费用为%f元!
",price);
}
elseif(weight<=50)
{
price=(30-20)*30+(40-30)*40+(weight-40)*50;
printf("您的托运费用为%f元!
",price);
}
else
{
printf("您托运的行李超出了最高上限,不允许托运!
");
}
}
实训二
#include
voidmain()
{
floatsales,bonus;
printf("请输入您的销售额!
");
scanf("%f",&sales);
bonus=sales>=15000?
sales*0.1:
sales>=10000?
sales*0.08:
sales>=8000?
sales*0.05:
sales>=5000?
sales*0.03:
0;
if(sales<0)
printf("您输入的金额有误!
","奖金");
else
printf("您获得的奖金为:
%f元!
",bonus);
}
项目五
项目考核
一、选择题
1-5ABBAA
二、简答题
1.简述for语句的使用方法。
for语句中变量初始化部分只在开始时执行一次,然后判断条件表达式,若为true,则执行代码块循环体,然后执行控制变量更新表达式,再回头来判断条件表达式是否成立,以决定下一次循环;若条件表达式为false,则结束整个循环。
2.简述break语句和continue语句的区别。
break语句用于终止当前循环的执行,直接执行当前循环语句的下一语句。
当循环有多层时,break语句只能跳出本层循环,外层循环仍会继续。
continue语句只能用于循环语句内部,用于结束本次循环,即跳过本次循环体中余下的尚未执行的语句,再一次进行循环条件判断,以便执行下一次循环。
项目实训
实训一
#include
voidmain()
{
charc;
intn=0;
printf("请输入一行字符:
");
do
{
scanf("%c",&c);
if(c>='A'&&c<='Z'||c>='a'&&c<='z')
{
n++;
}
}while(c!
='\n');
printf("该行英文字母的个数为:
%d\n",n);
}
实训二
#include
voidmain()
{
intx=1;
while(x++<=100)
{
if(x%3==0)
{
printf("%d",x);
}
}
scanf("%d");
}
项目六
项目考核
一、选择题
1-10CCACCBCBDD
二、简答题
1.简述函数进行嵌套调用时函数的执行顺序。
当函数进行嵌套调用时,程序首先从主函数开始执行,到达调用函数语句时流程转到第一个被调用函数;第一个被调用函数执行到调用函数的语句时转入第二个被调用函数,依此类推,直到最后一个被调用函数;最后一个被调用函数执行到return语句时,返回调用该函数的函数中,执行调用函数语句下面的语句,依此类推,直到最后返回到主函数中。
2.简述不同变量的作用域。
①局部变量
局部变量只在该函数范围内有效。
也就是说,只有在该函数内才能使用这些变量。
②全局变量
在函数外部定义的变量称为全局变量,其作用范围是从定义变量的位置开始到本源文件结束。
项目实训
实训
#include
intCommonFactors(inta,intb);
main()
{
intsub,x,y;
printf("请输入用于计算公约数的两个整数值(中间通过空格分隔):
\n");
scanf("%d%d",&x,&y);
while((sub=CommonFactors(x,y))>0)
{
staticintcounter=1;
printf("Commonfactor%dis%d\n",counter++,sub);
}
}
/*
函数功能:
指明计算哪两个数的公约数
函数入口参数:
两个整型数
函数返回值:
公约数
*/
intCommonFactors(inta,intb)
{
staticintnum1=-1;
staticintnum2=-1;
staticintcurFactor;
if(a<0||b<0)
return-1;
if(num1!
=a||num2!
=b)/*使用了新的参数*/
{
num1=a;
num2=b;
curFactor=a>b?
b:
a;/*curFactor置为两个数中较小的那个*/
}
while(curFactor>0)
{
if(a%curFactor==0&&b%curFactor==0)
{
returncurFactor--;/*如果不减1,则下次还会测试这个数*/
}
curFactor--;
}
return-1;
}
项目七
项目考核
一、选择题
1-10DDCCDBACAD
二、简答题
1.简述二维数组的存储形式。
尽管二维数组由若干行、列构成,而实质上,二维数组最终也是在硬件存储器的一维线性空间上实现的。
在C语言中,二维数组是按行排列的,如图7-6所示。
图7-6数组a在内存中的组织形式
2.简述使用数组元素和数组名作为函数参数时的区别。
用数组元素作实参时,只要数组类型和函数的形参变量的类型一致即可,并不要求函数的形参也必须是下标变量,即对数组元素的处理是按普通变量对待的。
用数组名作函数参数时,则要求形参和相对应的实参必须是类型相同的数组,都必须有明确的数组说明。
当形参和实参二者不一致时,就会发生错误。
项目实训
实训源码
#include
#include"string.h"
charnames[10];
intscore[10][7];
intmax[10],min[10];
doubleaverage[10];
intno[10]={0,1,2,3,4,5,6,7,8,9};
voidmain()
{
charnames[10][10];/*定义二维字符数组存放选手名字*/
inti;
for(i=0;i<10;i++)
{
printf("pleaseinputthenameoftheNo.%dsinger\n",i+1);
/*提示用户输入编号为i+1的选手的名字*/
gets(names[i]);
/*将用户输入的字符串作为该选手的名字*/
}
intscore[10][7],j;
for(i=0;i<10;i++)
{
printf("\npleaseinputthescoreoftheNo.%dsinger\n",i+1);
/*提示用户输入编号为i+1的选手的成绩*/
for(j=0;j<7;j++)
scanf("%d",&score[i][j]);
}
for(i=0;i<10;i++)
{
max[i]=score[i][0];
for(j=1;j<7;j++)
if(score[i][j]>max[i])
max[i]=score[i][j];
printf("thehighestscoreoftheNo.%dsingeris:
%d\n",i+1,max[i]);
}
for(i=0;i<10;i++)
{
min[i]=score[i][0];
for(j=1;j<7;j++)
if(score[i][j]min[i]=score[i][j];
printf("thelowestscoreoftheNo.%dsingeris:
%d\n",i+1,min[i]);
}
intsum,temp;/*清零*/
for(i=0;i<10;i++)
{
sum=0;
for(j=0;j<7;j++)
sum+=score[i][j];/*累加*/
sum=sum-max[i]-min[i];/*去掉最高和最低分*/
average[i]=(double)sum/5;/*计算平均分*/
printf("theaveragescoreoftheNo.%dsingeris:
%lf\n\n",i+1,average[i]);
}
for(i=1;i<=6;i++)
{
for(j=0;j<7-i;j++)
{
/*比较的average[no[j]],而不是no[j]本身*/
if(average[no[j]]{
temp=no[j];no[j]=no[j+1];no[j+1]=temp;/*交换排名位置*/
}
}
}
for(i=0;i<10;i++)
printf("%d:
%s(number:
%d)get%lf\n",i,names[no[i]],no[i]+1,average[no[i]]);
}
项目八
项目考核
一、选择题
1-5DDABA
二、简答题
以下程序的执行结果:
(1)
(2)
(3)
项目实训
实训一
#include
#include
main()
{
charstr[80],*pStart,*pEnd;
intlen;
printf("Inputstring:
");
gets(str);
len=strlen(str);
pStart=str;
pEnd=str+len-1;
while((*pStart==*pEnd)&&(pStart{
pStart++;
pEnd--;
}
if(pStart{
printf("No!
\n");
}
else
{
printf("Yes!
\n");
}
}
实训二
#include
main()
{
char*ballColor[]={"RED","YELLOW","BLUE","WHITE","BLACK"};
inti,j,k,m=0;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
for(k=j+1;k<5;k++)
{
m++;
printf("%d:
%s,%s,%s\n",m,
ballColor[i],ballColor[j],ballColor[k]);
}
}
}
}
项目九
项目考核
一、选择题
1-4BCDD
二、简答题
1.简述共用体与结构体数据类型的不同。
共用体与结构体的定义形式相似,但它们的含义不同。
结构体变量所占内存长度是各成员所占内存长度之和,每个成员分别占有自己的内存单元;而共用体变量所占的内存长度等于最长的成员的长度。
2.简述单链表的插入与删除结点的步骤。
插入结点
在单链表中,插入结点同样有三种情况,如图9-8所示。
即插入到链表的中间、插入到链表头结点前、接到链表的尾结点后。
图9-8链表结点的插入
①插入到中间结点p3和p2之间时,只要将其前一个结点p3的指针指向要插入的接点p1,