C语言A软答案.docx
《C语言A软答案.docx》由会员分享,可在线阅读,更多相关《C语言A软答案.docx(11页珍藏版)》请在冰点文库上搜索。
C语言A软答案
2006级C语言程序设计A卷答案
一、基础知识题(20分,每题5分)
1.什么是数据缓冲区?
对于输入流来说,数据缓冲区是如何工作的?
开辟一块存储区(称为“数据缓冲区”),作为文件和程序之间的中介,作为数据的缓冲。
可以缓和内存和外存之间的数据提供和使用之间速度上的差别。
在程序与实际文件之间的传输通道上设置了一个缓冲区。
文件中的数据被以成块方式复制到缓冲区。
当程序中需要读入数据时:
1)如果缓冲区有数据,它就直接由缓冲区读取,而不必到外存读数据。
2)如果缓冲区里数据已经用完,系统会自动执行一个内部操作,一次从文件里取得一批数据,将缓冲区填满,程序又可以按照正常方式读入数据。
2.C语言的预处理有哪几种?
各有什么作用?
C中的预处理命令有三种:
宏定义、文件包含和条件编译。
一个宏定义的作用是为宏名字定义一个替代,该替代由整个替代正文段构成。
所谓“文件包含”处理是指一个源程序文件可以将另外一个源程序文件的全部内容包含进来。
即将另外的文件包含到本文件之中。
对其中一部分内容只在满足一定条件下才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。
3.对于数据类型和存储类别,你是如何理解的?
在C语言中每一个变量和函数有两个属性:
数据类型和数据存储类别。
数据类型决定着数据的存储空间和数据的存储方式。
存储类别是指数据在内存中存储的方法和存储的位置。
4.写出switch分支结构的语法结构,并写出其执行过程。
switch(表达式){
case整型常量表达式:
语句序列
case整型常量表达式:
语句序列
...
default:
语句序列
}
它的执行过程:
首先求出switch后面“表达式”的值,
然后用这个值与写在各case标号中的“整型常量表达式”的值依次做比较。
如果遇到相等的值,程序就从这里执行下去;
如果找不到,而这个开关语句有default部分,就从“default:
”之后继续执行;
如果开关语句没有default部分,那么整个语句结束。
二、读程序写结果(30分,每题5分)
1.
structs{intn;int*m;}*p;
intd[5]={10,20,30,40,50};
structsarr[]={{100,&d[0]},{200,&d[1]},{300,&d[2]},
{400,&d[3]},{500,&d[4]}};
intmain()
{
p=arr;
printf(“%d\n”,++p->n);
printf(“%d\n”,(++p)->n);
printf(“%d\n”,++(*p->m));
return0;
}
101
200
21
2.
intmain()
{
staticintx[]={0,5,6,10,12,15,18,20};
inta,s=0,*p=x;
for(;p{s+=*p;
printf(“S=%d\n”,s);
}
p=x;
for(s=1,a=7;a>=0;a-=2)
{s*=*(p+a);
printf(“S=%d\n”,s);
}
return0;
}
s=0
s=6
s=18
s=36
s=20
s=300
s=3000
s=15000
3.
#include
#include
voidfun(char*w,intm)
{
chars,*p1,*p2;
p1=w;
p2=w+m-1;
while(p1{
s=*p1++;
*p1=*p2--;
*p2=s;
}
}
intmain()
{
chara[]=”ALGORITHM”;
fun(a,strlen(a));
puts(a);
return0;
}
AMAMMAMAM
4.
#include
voidfun(intx)
{
if(x>=8)fun(x/8);
putchar(’0’+x%8);
}
intmain()
{
fun(231);
return0;
}
347
5.
#definePRINT(int)printf(“int=%d\n”,int);
intmain()
{
intx=1,y=1,z=1;
x+=y+=z;
PRINT(xy:
x)
PRINT(z+=xx++:
y++)
PRINT(x)
PRINT(y)
PRINT(z)
return0;
}
int=3
int=3
int=3
int=3
int=3
6.
#include"stdio.h"
voidmain()
{inti,j;
for(i=1;i<=5;i++)
{for(j=1;j<=30-i;j++)
putchar('');
printf("*");
for(j=1;j<=2*i-3;j++)
putchar('');
if(i!
=1)
printf("*");
printf("\n");
}
for(i=4;i>0;i--)
{for(j=1;j<=30-i;j++)
putchar('');
printf("*");
for(j=1;j<=2*i-3;j++)
putchar('');
if(i!
=1)
printf("*");
printf("\n");
}
}
三、应用及程序编程题(50分,每题10分)
1.从键盘输入20个整数,将它们从小到大排序后输出,并输出每个元素输入时的序号。
#include
intmain()
{
intt,i,j;
intdata[20][2];
for(i=0;i<20;i++)
{
scanf(“%d”,&data[i][0]);
data[i][1]=i;
}
for(i=0;i<14;i++)
for(j=0;j<14-i;j++)
if(data[j]>data[j+1])
{
t=data[j][0];data[j][0]=data[j+1][0];data[j+1][0]=t;
t=data[j][1];data[j][1]=data[j+1][1];data[j+1][1]=t;
}
for(i=0;i<20;i++)
printff(“%5d,%5d\n”,&data[i][0],data[i][1]);
return0;
}
2.如果一个正整数等于其各个数字的立方和,则该数称为阿姆斯特朗数。
如:
407=43+03+73就是一个阿姆斯特朗数。
编程求100~999以内的所有阿姆斯特朗数。
#include”stdio.h”
intmain()
{
inti,a,b,c;
for(i=100;i<1000;i++)
{
a=i/100;
b=i/10%10;
c=i%10;
if(i==a*a*a+b*b*b+c*c*c)
printf(”%5d”,i);
}
return0;
}
3.写函数,求指针head所指向的线性链表各结点数据的和。
线性链表节点的定义为:
structNode{
intdata;
structNode*next;
};
函数原型为:
intsumlink(structNode*head);
intsumlink(structNode*head)
{
structNode*p;
intsum=0;
p=head->next;
while(p!
=NULL)
{
sum=sum+p->data;
p=p->next;
}
returnsum;
}
4.找出下列图形的规律,使用循环编写程序打印如下图形。
371115
591317
7111519
9131721
11151923
#include
intmain()
{
inti,j,k=1;
for(i=3;i<=11;i=i+2)
{
for(j=0;jprintf("%5c",’’);
k++;
for(j=i;j<=i+3*4;j=j+4)
printf("%8d",j);
printf("\n");
}
return0;
}
5.有一个字符序列的数据文件。
编写程序,统计文件中字母字符、数字字符和其他字符的数目。
文件名为:
data.dat
#include"stdio.h"
intmain()
{
FILE*fp;
charch;
intcount[3]={0},i=0;
if((fp=fopen("data.dat","r"))==NULL)
{
printf("\nCan'topenthe.\n","data.dat");
exit(0);
}
while(!
feof(fp))
{
fcanf(fp,”%c”,&ch);
if(((ch>=’A’)&&(ch<=’Z’))||((ch>=’a’)&&(ch<=’z’)))
count[0]++;
elseif((’0’<=ch)&&(ch<=’9’))
count[1]++;
else
count[2]++;
}
fclose(fp1);
printf(“\n”);
printf(“%10s%10s%10s\n”,”LETTERS”,”DIGITS”,”OTHERS”);
for(i=0;i<3;i++)
printf("%10d",count[i]);
return0;
}
(学习的目的是增长知识,提高能力,相信一分耕耘一分收获,努力就一定可以获得应有的回报)