以下是小编收集整理的c语言答案(共含9篇),仅供参考,希望对大家有所帮助。同时,但愿您也能像本文投稿人“阿阿陈”一样,积极向本站投稿分享好文章。
11. 指向常量的指针和常指针的区别
答案:指向常量的指针所指向的内容不能被修改但能够指向其它的量,而常指针是指向的内容可以被修改但指针不能再指向其它地方。
12. if (a=b)
printf(“a==b”)
else
printf(“a!=b”);
输出结果为:
A.a==b B.a!=b C.不一定 D.不能运行
答案:不一定,这要根据b的内容来决定。通常再编程时不要使用此类的赋值语句。
13.在内联函数中使用static变量,比如
inline test
{ static couter = 0;
counter++;
}
会有什么问题?
答案:会造成多次定义该变量,因此再内联函数中禁止定义静态变量
14. F是一个结构类型,有如下定义:
F f1,f2;
问:f1=f2;语句是否成立?
答案:该语句成立,不过有的编译器不支持。实际上编译器也是用内存拷贝函数来实现的。
15.全局变量、局部变量、模块变量在内存空间中如何存放?(数据区or栈空间?)
答案:全局变量在全局空间分配,局部变量在栈空间分配,模块变量在全局空间分配。
16.struct A{
......
......
union {
int x;
.....
};
}
struct A a;
问:a.x这样的表示法是否成立?
答案:成立
如果结构定义改为如下定义
.struct A{
......
int x;
union {
int x;
.....
};
}
那a.x表示法是否成立?
答案:不成立,编译时会报x变量重定义
17. #define REDEF(name,arg1,arg...)
_##name (arg1,##arg)
问:以下两个语句宏展开的结果
REDEF(test_fn1,int a,int b);
REDEF(test_fn2,int a);
答案:
_test_fn1(int a ,int b)
_test_fn2(int a);
注意:在VC中不支持,gcc才支持该参数宏函数。
18. fnxxxx_max(char str[])
{
putchar str[0];
str++; //(1)
printf(“%s”,str);
}
main()
{
char str[20]={“ABCDEFG”};
fnxxxx_max(str);
str++; //(2)
printf(“%s”,str);
}
问:语句(1)和语句(2)是否成立?
答案:语句(1)成立,语句(2)不成立
19.#define SRR 0x001;
#define SRT 0x002;
#define SRI 0x0900;
EVENT = SRR|SRT|SRI
问:上面的语句有什么问题?EVENT的值会是多少?
答案:宏展开后变为:
EVENT = 0x001; 0x002;0x0900;
因此EVENT的值为0x001,所以在编程时一定要小心,一定不要在常量宏定义的后面加上分号。
《C语言试题及答案》简介开始:C语言部分一、选择题(每小题2分,共10分)(下在各小题,分别有一个或多个正确答案,请将所有正确答案的编号,填写在该小题题干后的括号内。错选或漏选均不得分)。1、若定义:inta[2][3]{0,2,4,6,8,10};以下描述正确的有(A,C,D,E)A、*(a+1)为元素6的地址这里a+1a[1]的地址;*(a+1)的。。此内容文章属于《考试资料》栏目,以上内容为《C语言试题及答案-6-6 19:22:09》简单介绍,正文正式开始
C语言部分
一、选择题(每小题2分,共10分)
(下在各小题,分别有一个或多个正确答案,请将所有正确答案的编号,填写在该小题题干后的括号内。错选或漏选均不得分)。
1、若定义:int a[2][3]{0,2,4,6,8,10};以下描述正确的有( A,C,D,E )
A、*(a+1)为元素6的地址
这里a+1=a[1]的地址;*(a+1)的值是6,故A正确。
B、*(a[1]+1)的值为2
为8,故B不正确
C、**(a+1)+2的值为8
这里a+1是一个指针,指向的是a[1]. *(a+1)为a[1],a[1]指向的是a[1][0]. **(a+1)为6,加2得8,故C正确;
D、a[0]与a相同
因二者都是指针,指针的地址都是指向数组中的第一个元素的地址,故D正确。
E、a[1][2]的值为10
它是指第二行的第三个元素,为10,正确
2、对函数的正确使用方法描述( A,C,D )。
A、用数组做函数参数时,必须在主调函数和被调函数中分别定义数组
B、实参数组元素和形参数组元素类型可以不一致
C、形参数组长度可以不指定 D、形参数组长度可以大于实参数组长度
E、数组名做参数属于值传递
3、对静态变量的正确描述( A,B,D,E )
A、静态局部变量在静态存储区内分配单元( )
B、静态外部变量可以赋初值,也可以不赋初值
C、静态外部变量的作用与外部变量相同
D、静态局部变量在函数调用结束时,仍保存其值,不会随着消失。
E、静态局部变量只赋一次初值
4、下列描述正确的是( A ,C)。
A、由main 函数及其参数argc和* argv[]可以实现命令行方式
B、使用fclose关闭文件时,先释放文件指针,再写缓冲区数据到文件中
//先写缓冲区数据到文件中,再释放文件指针
C、字符数组并不要求它的最后一个字符是‘’
//是的,以字符指针指向的字符串才要求,因为只有这样,才能知道字符串的长度,而在字符数组中,不用,一样可以知道到哪里是字符数组的结尾。
D、‘A’和“A”都是字符串常量
E、若char*S=“ a17bc”;则指针变量S指向的字符串所占的字节数是7
5、在缓冲文件系统中用于读写的函数有( A,B,D )
A、putchar () B、fread() C、rewind () D、purw() E、fseek()
二、程序阅读,并给出运行结果(共10分,每题5分)。
(1)main()
{ unsigned a,b,x
int n;
a=0x763 输出结果:
n=6;
b=a<<(12n);
x=(a>>n2)^b; //+,,的优先级比<<,>>高。
printf(“ b=%x, x=%x”,b,x);
}
在用2个字节表示整数的系统中
结果为
d8c0
d8b6
在用4个字节表示整数的系统中
结果为
1d8c0
1d8b6
故以上两种结果都正确。
(2) #include 〈stdin.h〉
struct m {int x;
int *y;
} *p;
int a [4]={12,33,40,100};
struct m b [4]={10,&a[2],9,&a[3],8,&a[0],7,&a[1]}'
main()
{
p=b; 输出结果:
printf(“%d ”,++p>x); //>的优先级高于++,因此等于是++(p>x),为11
printf(“%d ”,(++p)>x); //p后移一个元素,其x值为9;
printf(“%d ”,++(*p>y));
//>的优先级高于*, 此时p已指向b[1],故*(p>y)为a[3]为100.自加后为101;
}
故输出结果为:
11
9
101
三、程序设计(共10分)
设在文件a.txt和文件b.txt中分别存有两个字符串,设计一个程序将这两个字符串按依序交叉的方式合并为一个字符串(例如“aaaaa”与“bbb”的合并结果为“abababaa”,而“bbb”与“aaaaa”的合作结果为“ bababaa”,)并将结果存入文件a.txt中。
【答案】
写程序时,可以分别读取a.txt文件和b.txt文件,注意(1),无论a文件先读完还是b文件先读完,程序都能作出适应性的判断。注意(2)把a和b合并的结果,写到一个临时文件c中,最后把c的文件覆盖到a文件中,达到题意的要求。
#include
main()
{
FILE *fp,*fq,*fr;
char ch;
if((fp=fopen(“a.txt”,“r+”))==NULL)
{ printf(“cannot open file a.txt”);
exit(0);
}
if((fq=fopen(“b.txt”,“r”))==NULL)
{ printf(“cannot open file b.txt”);
exit(0);
}
fr=fopen(“c.txt”,“w+”);
while(!feof(fp))
{
ch=fgetc(fp);
fputc(ch,fr);
if(!feof(fq))
{
ch=fgetc(fq);
fputc(ch,fr);
}
}
while(!feof(fq))
{
ch=fgetc(fq);
fputc(ch,fr);
}
rewind(fp); rewind(fr);
while(!feof(fr))
{
ch=fgetc(fr);
fputc(ch,fp);
}
fclose(fp); fclose(fq); fclose(fr);
}
1.2 四川大学攻读硕士学位研究生入学考试试题 及 答案
1.2.1第20DDC语言程序设计 题目
一、单项选择题(在每小题的四个备选答案中,选出一个正确的答案,并将其号码写在答题纸上。请注意注明题号。每小题1分,共计6分)
1、‘ ’表示什么?
①字符串常数 ②标识符 ③变量 ④字符常量
答案:④
2、对宏定义不正确的描述是哪一个?
①在进行宏定义时,可以引用已经定义的宏名,可以层层置换
//可以引用已经定义了的宏名,可以层层置换
②宏名的有效范围包括本文件的任何位置
//宏名的有效范围定义命令之后到本源文件结束,可以用#define终止宏定义的作用域
③宠定义不是语句,不必在行末加分号
//是预处理定义语句
④对程序中双引号括起来的字符串,即使与宏名相同,也不进行置换
3、若定义static char s[20]=”computer”;则执行语句x = strlen(s);之后,x的值为多少?
①20 ②9 ③8 ④19
//strlen函数计算char*型字符串的长度的时候,并不包含末尾的;
4、以下哪一个表达式取值是正确的?
①6>5结果为6 ②6&&5结果为7
③6||5结果为7 ④6<5结果为0
5、如定义
enum weekday {one, two, thr, fou, fiv};
enum weekday working;
以下哪个是不正确的枚举变量的使用?
①working = thr; ②working =2;
③working = (enum weekday)2;
④working = (enum weekday) (53);
//不能对其赋值
6、下列说法中正确的是哪一个?
①sizeof (char) 是结果为整型的表达式
②sizeof (char) 是一个不合法的表示形式
③sizeof (char) 是一种函数调用
④sizeof (char) 是结果为实型的表达式
二、阅读程序,并回答问题(共12分)
1、下列程序的输出是什么?(3分)
# include
void main ()
x
char * aplha [6] = x“ABC”,“DEF”,“GHI”,“JKL”,“MNO”,“PQR”y;
char **p;
int i;
p = aplha;
for (i = 0; i<4; i++)
printf (“%s”, p[i]);
printf (“ ”);
y
//输出结果
ABCDEFGHIJKL
刚好是字符串数组里面的前四个元素的内容连接起来
2、下列程序为什么无法将用户输入的三个整数按从小到大排序输出?应该如何修改?(6分)
# include
void swap (int x, int y)
x
int t = x;
x = y;
y = t;
y
void main ()
x
int a, b, c;
scanf (“%d, %d, %d”, &a, &b, &c);
if (a>b) swap (a, b);
if (a>c) swap (a, c);
if (b>c) swap (b, c);
printf (“%d, %d, %d”, a, b, c);
y
//函数swap采用值传递,虽然将形参x和y交换了,但是并不影响到实参。将值传递改成指针传递就可以了。
C函数参数采用值传递方式,虽然swap函数将形式参数x和y的值进行了调换,但是影响不到相应的实在参数。所以在主函数中,通过调用sawp函数调换a和b(或a或c,或b和c)的值是根本达不到目的的。
修改:
(1)(2分)
void swap (int *x, int*y)
x
int t = *x;
*x = *y;
*y = t;
y
(2)(2分)主函数
if(a>b) swap(&a,&b);
if(a>c) swap(&a,&c);
if(b>c) swap(&b,&c);
3、假设系统为基本整型量分配2个字节,为字符型量分配1个字节。下列程序完成的功能是什么?(3分)
# include
union
x
int n;
char ch [2];
yu;
void main ()
x
int m;
scanf (“%d”,&m);
u.n = m;
printf (“ %u, %u”,u.ch[0], u.ch[1]);
y
//该程序的功能,取用户输入的整数值的高字节和低字节,并按照任意整数的低字节和高字节分别输出。
三、程序设计题(12分)
假设一个文本文件中保存着100个整数,请将这100个整数按从小到大的顺序写到另一个文本文件中去,并且在新文件中每10个整数占一行。源文件名和目标文件名通过命令行参数获取。
分数分配:
变量定义 2分
命令行参数处理 1分
文件打开 1分
文件读 2分
排序 3分
文件写 2分
文件关闭 1分
# include
void main(int argc, char *argv[])
x
FILE *fin, *fout;
Int a [100], i, j, t;
if(argc!=3)
x
printf (“ You forgot to enter a filename ”);
return;
y
fin = fopen (argv[1], “r”);
fout = fopen (argv[2], “w”);
for (i = 0; i<100; i++)
fscanf (fin, “%d”, &a[i]);
for (i = 0; i<99; i++)
for (i = 0; i<99-i; i++)
if (a[j]>a[j+1])
xt = a[j]; a[j] = a[j+1]; a[j+1]=t;y
for (i = 0; i<100; i++)
x
if (i%10 = 0)
fprintf (fout, “%s”, “ ”);
fprintf (fout, “%d”, a[i]);
y
fclose (fin);
fclose (fout);
y
1.3 四川大学攻读硕士学位研究生入学考试试题 及 答案
1.3.1 第20DDC语言题目
C语言程序设计(共30分)
一、单项选择题(在每小题的四个备选答案中,选出一个正确答案。每小题1分,共6分)
1、如果I为整型变量,f为float型变量,c表达式'a'+I*f的类型为 。
A、字符型 B、整型 C、单精度型 D、双精度型
//即使是两个float型的数据相加,都化成double型 float型的数据在运算时一律转化成双精度型,提高其运算精度
2、关于c表达式5||(a=b+c)==3的值,正确的说法为 。
A、值为1 B、值为5 C、值为0
D、仅这一个表达式,不能确定值,必须知道a,b,c的值后才能计算。
//等号==的优先级高于||所以先计算(a=b+c)==3但是不论它为真或假,在与5进行或运算时,按照或运算的法则,只要一方为真,表达式的结果为真。
3、若整型变量a的值为50,则c表达式a>>2的值为 。
A、50 B、25 C、12.5 D、12
//每右移一位除以2,且由于a为整型,结果为整型
4、若c,c1,c2均为字符型变量,下列语句执行后。
c='a';
c1=++c;
c2=c++;
c1,c2的值分别为 。
A、c1='b',c2='c' B、c1='a', c2='c' C、c1='b',c2='b' D、c1='a',c2='b'
//前加加,先加1后使用值,后加加是先使用其值在加加,所以c加加后的值赋予c1,c1得值b,c2先使用值,再加加,c2得值b
5、以下c 语句执行后,
int i, s=0;
for (i=0;i<10;i++)s+=i;
printf ('%d ', i);
输出的内容为 。
A、0 B、9 C、10 D、11
//i值在循环外定义,所以其值循环结束仍有意义,得值10
6、以下c语句执行后,
char s1[100] =″I like C 1anguage″,s2[100];
strcpy(s2, s1);
strcat (s1, s2);
puts (s2);
输出的内容为 。
A、I B、I like C language C、I like C language I like C language
D、I like C language I like C language I like C language
//连接后的串存在s1里,对s2没有影响
二、阅读程序,写出该程序的执行结果。(4分)
# include 〈stdio.h〉
void main ( )
{ char a [3] [10]={“Beijing ”,“Shanghai”, “Chengdu”};
char p1, (*p2)[10];
p1=a[0];
p2=a;
printf(“%c ”,*(a[1]+1));
// a[1]代表是第一行字符串Shanghai,加1后得值第一个字符h的地址,*取出其地址里的值h
printf(“%c ”,*(*(a+1)+2));
// *(a+i)=a[i] 代表是第一行字符串Shanghai,加2后得值第2个字符a的地址,*取出其地址里的值
printf(“%c ”,*(p1+1));
//p1是一字符指针,加一指向第零行第1个字符e的位置,*取出其地址里的值
printf(“%c ”,*(*(p2+1)+2));
//p2为一指向数组的指针,p2是与数组名等价的指针,它指向2维数组的首行,p2+1指针指向了第一行字串Shanghai,加2后得值第2个字符a的地址,*取出其地址里的值
printf(“%s ”,*(p1+1));
//打印的从第一个字符开始的第零行余下的字符串eijing
printf(“%s ”,*(p2[2]);
//p2[2]指的是第二行,打印第二行字符串Chengdu
printf(“%s ”,*(p2+1));
//p2+1指向的是第一行字符串shanghai
三、按要求编写函数。(8分)
在一程序中定义了如下结构类型用于处理单向链表:
struct linkage {
int value;
struct linkage *pNext;
};
现已经编写出按节点的成员a值从小到大建立初始链表的函数
create ( ),如下所示:
struct linkage * create (void )
{
struct linkage * pHead;
int a[4]={2,1,3,5};
pHead=NULL;
for (i=0;i<4;i++)
pHead=addItem(pHead,a[i]);
return pHead;
}
在该函数的for循环前,pHead为NULL;在执行整个for循环后,创建的链表如下所示:
即在被调函数addItem( )中,需要动态分配内存,生成新节点,将传入的第二参数的值赋给该节点的成员value:并通过第一个参数链表首节点确定适当位置放置该新节点。
请完成函数:
struct linkage * addItem (struct linkage *pHead, int value );
返回值指向单向链表头节点。
你可能用到下面的动态内存分配函数。
void* malloc (unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。返回值为指向分配域起始地址的指针。
1、在空链表中加第一个节点2分;
2、加到当前链表头节点前2分;
3、加到当前链表头节之后适当位置,可分为两步。2分;
4、其它部分2分,包括整体结构,变量定义,返回值。
struct linkage *addItem (struct linkgae *pHead ,int value)
{ struct linkage *p ,*q,*r,*s;
p=pHead;
if (!p)
{ r=(struct linkage *) malloc (sizeof (struct linkage));
r>a=value;
r>pNext =NULL;
pHead=r;
}
else if (value <=p>a)
{ r=(struct linkage *) malloc (sizeof (struct linkage));
r>a=value;
r>pNext =p;
pHead=r;
else
{ q=p>pNext;
while (q)
if (value<=q>a)
break;
else
{ p=q;
q=p>pNext;
}
r=(struct linkage *)malloc (sizeof (struct linkage));
r>a=value;
r>pNext=q;
p>pNext=r;
}
return pHead;
}
四、程序设计。(12分)
单位HTML文件由标签,标题和正文主体等部分组成。如下所示:
〈HTML〉
〈HEAD〉
〈TITLE〉HTML标题部分
〈/HEAD〉
这里是HTML文件的主体部分。
换新行。
〈/HTML〉
符号“<与”>“及其之间的内容是标签,如〈HTML〉,等。其它部分是标题和主体。请按以下说明和要求完成程序,将简单的HTML文件转换为TXT文件:
1. 序将简单HTML文件的有标签和换行符( )(去掉。标题部分结束(遇到标签)后加上一个换行符( )。每一个
标签换成一个换行符( )。其余部分原样保留。如上面的简单HTML文件处理为(L表示换行):
HTML标题部分L
这里是HTML文件的主体部分。L
换新行。
2.简单HTML文件的标签内没有嵌套情况,即在”<和“>”这间不会再出现“<或”>“。
3.标签内的内容大小写无关。如
,
,
等价。
4.示签的”<和“>”与标签内容间无空格。即不会出现
或< BR>等情况。
5.标题和正文中不会出现“<和”>“字符,它们通过转义字符实现,这时尤需考虑。
6.程序需要处理命令行参数。第一个参数指要处理的HTML文件名,第二个参数指定处理后要存放的文件名。这两个文件都是文本文件。
7.程序必须进行必要的出错处理,如无法打开文件等。
8.程序不需要包含头文件。
1、main()函数形参处理:2分。
2、变量定义1分。
3、打开关闭文件2分;
4、读源文件1分;
5、能从标签中找出内容〈BR〉〈/TITLE〉换为' '部分2分;
6、区分开标签和其它部分,并按要求写入目标文件2分;
7、整体结构正确2分;
void main (int argc, char *argv[])
{ char C,tag[7];
int status ,len ;
FILE*fin,*fout;
if (argc!=3)
{ printf(”参数个数不对!“)
exit (1)
}
if ((fin=fopen (argv [1],”r“)))==NULL)
{
printf(“打不开源文件”);
exit(1);
}
if ((fout=fopen (argv [2],”w“)))==NULL)
{
printf(”无法写入文件!“);
fclose (fin);
exit (1);
}
status =0;
while ((c=fgetc (fin)))!=EOF)
switch (C)
{
case '<':
status=1;
len=0;
break;
case ‘>’:
status=0;
if(len<=6)
tag[len]=0;
if(!strcmp(tag,”/title”)||!strcmp(tag,”br”))
fputc(‘ ’,fout);
break;
case ' ':break;
default:
if (! status)
fputc (c,fout);
else
{ len++;
if (len<=6);
tag[len1]=c;
}
}
fclose (fin);
fclose (fout);
}
1.4 四川大学攻读硕士学位研究生入学考试试题及 答案
1.4.1 第20DDC语言题目
C语言程序设计(40分)
一、分析下面的 程序,写出程序执行结果。(每小题4分,共2分)
1、
#include 〈stdio.h〉
void swap (int **p1,int **p2)
{ int *t;
t=*p1;
p1=p2;
*p2=t;
}
void main( )
{ int a=1、b=3、*p=&a、*q=&b;
swap(&p、&q);
printf('%d、5d、%d、%d ”、a、b、*p、*q;
}
//因为在swap函数里交换的是两个参数的地址,所以参数使用的是两级指针,表示交换的是指针的地址,最终使p指向了b,q指向了a。
1,3,3,1
2.
# include
void merge (char *d、char sl、char、S2)
{ while (*sl!='' && *S2!='')
if (*sl<*s2)
d++=*sl++;
else
d++=*s2++;
while (*sl!=') *d++=sl++;
while (*s2!='') *d++=s2++;
*d='',
}
void main( )
{ char sl=“acdgh”,s2=“bcfhi”,s3[20];
merge(s3,s1,s2);
puts(s3)
}
//将两个字符串合为一个按照字母顺序排列的串
abccdfghhi
二、按要求完成C函数。(每小题10分,共20分)
1.int maxsameChar(char *s);
该函数计算字符串 s中最大连续相同的字符个数。例如,若s 为“aaabbbb”,则返回值为4;若s为“abcde”,则返回值为1。
int maxSameChar (char *s)
{ int temp=1, max=0;
char c='';
while (*s)
{ if (c==*s)
tmpe++;
else
{ c=*s;
temp=1;
}
if (max
max=temp;
s++;
}
return max;
}
2. struct mode *reverse(struct mode *pHead);
其中,struct node 定义如下:
struct node
{ int key ;
struct node *pNext;
};
此函数传入的pHead指向要处理的单向链表头,该链表以NULL指针结束。函数实现链表链接方向(包括pHead 指向的原头节点)的反转,如图1所示。并将新链表头指针作为函数值返回。在完成此函数时,你只能利用原有链表节点,不能申请新节点空间。
struct node* reverse (struct node* pHead)
{ struct nodt *p,*q,*t;
if (pHead==NULL)
return NULL;
p=pHead;
q=p>pNext;
while (q! NULL)
{ t =q>pNext;
q>pNext=p;
p=q;
q=t;
}
pHead>pNext=NULL;
pHead=p;
return pHead;
}
三、按要求完成简单的客车车次查询程序。(12分)
某车站需要一个简单的客车车次查询程序。说明如下:
1. 客车车次数据文件checi.txt放在c:data目录下,格式为:
T8 成都 北京西 09:30
1364 成都 北京西 14:20
K118 攀枝花 北京西 22:00
… … …
其中每行为一次车的信息,分为4个数据项:车次,始发站,终点站和离开本站时间。前三个数据项留的宽度为8字符,最后一项结束后即换行。数据项间一定有空格隔开,每一数据项内无空格。
2.你的程序对用户通过命令行参数指一的车次,在客车车次数据文件中查找相应车次信息并输出该次车的始发站,终点站和离开本站时间,如果未找到,则输出“找不到该次车信息!”。
3.你的程序可以使用标准的C库函数,可以不引用文件。程序中应给出必要的注释。
int main (int argc, char *argv [ ])
{ char info [4] [20];
FILE * fp;
int I,found=0;
if (argc!=2)
{ printf(“参数个数不正确! ”);
return 1;
}
fp=fopen (“c:checi. txt ”,“r”);
if (fp==NULL)
{ printf (“无法打开数据文件! ”);
return 1;
}
while (! feof (fp))
{ for (I=0;i<4; i++)
fscanf (fp,“%s”,info[i]);
if (!stricmp (info[0],argv[1]))
{ found=1;
printf(“始发站:%s ”,info [1]);
printf(“始发站:%s ”,info [2]);
printf(“离本站时间:%s ”,info [3]);
break;
}
}
if (! found )
printf(“找不到该次车信息! ”);
return 0;
}
1.5 四川大学攻读硕士学位研究生入学考试试题及 答案
1.5.1 第20DDC语言题目
C语言程序设计(40分)
一、写出下列表达运算后a的值,设a,b 均为 int ,每个表达式运算到a=2,b=3。(5分)
(1) a+=b*5
//a=a+b*5,为17
(2) a=b++
//a=3
(3) a%=(a%=b)
//结果为0
(4) a=a>b&&b>a||a
//>的优先级高于&&和||原式理解为(a>b)&&(b>a)||a
&&运算符高于||,原式理解为((a>b)&&(b>a))||a,因为a值为2,结果为1真。或运算是有一为1
(5) a=!b
//!的运算符最高,<其次,&&最小原式理解为((!b)
二、下面的程序构造一个有向图,请画出其示意图。(10分)
include 〈stdio.h〉
struct node /*有向图的节点类型*/
{ int key;
struct node *left,*right,*up,*down;
};
int main (int argc ,char * argv [])
{ int i;
struct node nodes[5];
for( i=0;i<5;i++)
{ nodes [i].key=i;
nodes [i].left=NULL;
nodes [i].right=NULL;
nodes [i].up=NULL;
nodes [i].down=NULL;
}
nodes [0].left=nodes+1;
nodes [1].left=nodes;
nodes [1].up=nodes+2;
nodes [2].down=nodes+3;
nodes [3].right=nodes+4;
nodes [4].up=nodes;
nodes [4].down=nodes+1;
return 0;
}
三、按要求完成函数。(10分)
int sameChar sAT SamePos (char *s1,char *s2);
两个字符串的字符进行同位置比较,返回相同的字符数(串结束符‘’不比较)。
例如,若s1=“abc”,s2=“Abc”,则返回值为2。
int sameCharAtSame Pos (char *s1,char *s2)
{
int counter =0;
while (*sl && *s2)
{
if (*s1 == *s2)
counter ++;
s1++;
s2++;
}
return counter;
}
四、按要求编写程序对一种特殊字符串解码。(15分)
要处理的特殊字符串由A,C,G,U四个字符组成,如下所示:
ACUGCCCAUGAAAAACUUUUGACAC
其有效信息子串从第一次出现“AUG”后开始,遇到“UGA”结束(不包括“AUG”和“UGA”。)如上面的编码串需解码的有效子串为:
AAAAACUUU
有效子串中每3个字符(如“AAA”,“CGA”)作为一个密码子(可以保证,有效子串的长度一定为3的整数倍。)可能的密码子(62种)及相应码值以如下形式放在编码文件code.txt中(按密码子字典序排列);
AAA K
AAC N
…………
UUU F
请编写C程序对存放在文件中的特殊字符串解码,在屏幕输出解码串。如:KNF
KNE
要求:
1、编码文件code.txt放在c盘根目录下;
2、要解码的特殊字符串以文件形式存放,其串长不超过1024字符;
3、你编写的程序应能处理命令参数,指定要解码的字符串文件;
4、程序中可以使用C语言的标准库函数,不需要写出头文件;
5、程序中应有必有的注释。
#include 〈stdio.h〉
#include 〈string.h〉
struct
{
char name[4];
char code;
} table [62];
int main (int argc,char *argv [ ])
{
FILE *code? file=NULL, *string file =NULL;
char string [1024+2],buffer[4],*p,*end ;
int I;
/* 检查命令行参数*/
if (argc<=1)
}
/*打开编码文件以及待解码文件*/
code? file=fopen (“c:code. txt”,“r”);
string file =fopen (argv[1],“r”);
if (code_file= = NULL | | string_file = =NULL)
return 1;
/* 读编码文件,将结果记入表中 */
for (i=0; i<62; i++)
{
fscanf(code_file, “%s %c ”, tabie[i], name, &table[i].code);
}
/*读待解码文件内容到string中 */
fgets (string, sizeof (string), string_file);
/* 扫描有效子串头 */
p= strstr(string, “AUG”);
end = strstr (p + 3 , “UGA”);
/*读有效子串,查表输出解码字符,直到子串尾 */
for (p+=3; p
{
for (i=0; i<3; i++)
{
buffer [i] = p [i];
}
buffer [i] ='';
for (i=0; i<62; i++)
{
if (strcmp (buffer, table [i].name)) = = 0)
{
printf(“%c”, table[i]. code);
break;
}
}
}
/* 关闭编码文件以及待解码文件 */
fclose (code_file);
fclose (string_file);
return 0;
}
1.6 四川大学攻读硕士学位研究生入学考试试题及 答案
1.6.1 第20DDC语言题目
C语言程序设计(50分)
一、 读程序,写执行结果(8分)
1、
#include
int main( )
{ int a=4,b=3,c=1,x;
x=a>b;
printf(“%d ”,x);
//结果为1
x=a+b++;
printf(”%d ”,x);
//结果为6
x=a>b;
printf(”%d ”,x);
//结果为假,0
x=c&&b==c;
printf(”%d ”,x);
//==的运算级高于&&, c&&(b==c)结果为假0
return0;
}
2.
#include
int main( )
{ inti,j;
for(I=0;I=8;I+=2)
{ for(j=0;j<(8I)/2;j++
printf(”+”);
for(j=0;j<=I;j++)
printf(”*”);
printf( ”);
}
return0;
}
++++*
+++***
++*****
+*******
二.按要求完成函数。(28分)
1. 一种最简单的字符串加密方法是将字符串的每一字符加上一个偏移量offset(不考虑溢出)。请编写木相应的编解码函
数,其原型分别为:
char*encode(char*s,int offset);
char *decode(char *s,offset);
char *encode(char *s,int offset)
{
char *p=s;
while (*p)
{
*p +=offset;
}
renturn s;
}
char *decode(char *sm int iffset)
{
char *p= s;
while(*p)
{
*p=offset;
}
return s;
}
2编写函数将两个节点值递增的单向链表归并为一个。要求利用原节点空间。链表节点定义为:
struct node
{ int value;
struct node *pNext;
};
函数原型为:
struct node *merge(struct node *a, struct node *b);
其中a,b为要归并的两个单向链表头节点指针,函数返回值为归并后的单向链表头节点指针。
struct node
{
int value
struct node *pNext;
}
struct node *merge(struct node *a, struct node *b)
{
struct node *p;
struct node *q
struct node *t;
if (a>value <=b>vaLue)
{
p=a;
q=b
}
else
{
p=b
q=a;
}
t=p;
while (q)
{
if (p>pNext ==NULL)
{
P>Pnext=q
break;
}
if (q>value
pNext>value)
{
struct node.*k=q>pNext;
q>pNxt=p>pNext;
p>pNext=q;
q=k;
continue;
}
p=p>pNext;
}
return t;
}
三.编写程序模拟数字LED显示。(14分)
编写程序完成如下功能:用户键盘输入最多四位的整数,在屏幕上以类似LED方式显示。如用户输入为:
8234
则输出
其中每个数字字模均为7行×4列。09+个数字的字模顺序地以文本形式存放在方件C:font.txt中。
要求:
1、 输出的各数字间有1个空格;
2、 你的程序可以使用C语言标准库函数,不需要写出头文件;
3、 程序中应有必有的注释。
char font[10][7][5];
94 int n;
95 int digit[4];
96 int length=0;
97
98/ * 装载字体文件 */
99 void load fontsO
100 {
101 int I, j, k;
102 FILE *file;
103
104 file = fopen(”c:font”,”r”);
105 if (file==NULL)
106 {
107 printf(” 打开字体文件 font. Txt 错误|n”);
108 exit(1);
109 }
110
111 for (k = 0; k<10;k++)
112 {
113 for (I=0; I<7; I++)
114 {
115 char line[10];
116 fgets(line, 5, file);
117 for (j=0; j<4;j++)
118 {
119 font[k][I][j]=line[j];
120 }
121 font[k][I][4]=0;
122 }
123 }
124
125 fclose(file);
126 }
127
128/* 将输入的整数解码为单个的数字*/
129 void decode()
130 {
131 int I;
132 int m=n;
133 for (I=0; I <4;I++)
134 {
135 digit[I]=m % 10;
136 m =m/10;
137
138 if (m==0)
139 break;
140 }
141
142 length = I + 1;
143 if (length >=4)
144 length=4;
145 }
146
147 /* 显示LED */
148 void disnlav()
149 {
150 int I,j;
151 for (I=0; I<7;I++)
152 {
153 for (j = lengthI; j>=0;j__)
154 {
155 printf(”%s”, font[j][I]);
156 printf(” ”);
157 }
158 printf(” ”);
159 }
160 }
161
162 int main()
163 {
164
165 load fonts();
166
167 scanf(”%d”, &n);
168 decode();
169 display();
170 }
C语言试题及答案的延伸阅读――c语言学习体会
记得上次开班会的时候我吹牛说要和你们一起学习c语言,不知不觉已经快半个月拉。我得对自己的话负责。今天我把借来的教材看了看,以前真的是不了解,今天才知道它是贝尔实验室的设计师Dennis在1972年设计的。c语言是其他计算机语言的基础,其他的计算机语言都是在它的基础上研发。所以学好c语言对于以后要在自动化专业有所发展的同学是非常有好处的,尤其是将来的plc编程、电子产品设计等等,都需要用到c语言。
今天我学习了一个最最简单的程序,感觉十分有收获,明白了它的最基本的道理――它也是一门语言,和我们的汉语是一样的,它也有自己的语法、逻辑结构,只要是能真正的去理解它,还是很容易学会的。
今天学习的程序如下:
#include
#include
main()
{
double x,s;
printf(“input number: ”);
scanf(“%lf”,&x);
s=sin(x);
printf(“sine of %lf is %lf ”,x,s);
}
这个的功能
c语言面试题及答案
一、选择题(1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
在下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应的位置上,答在试卷上不得分。
(1)在数据结构中,从逻辑上可以把数据结构分为_______。
A)动态结构和静态结构 B)紧凑结构和非紧凑结构
C)线性结构和非线性结构 D)内部结构和外部结构
答案:C
评析:逻辑结构反映数据元素之间的逻辑关系,线性结构表示数据元素之间一对一的关系,非线性结构表示数据元素之间一对多或多对一的关系。
(2)若进栈序列为l,2,3,4,进栈过程中可以出栈,则下列选项中不可能的一个出栈序列是_______。
A)1,4,3,2 B)2,3,4,l
C)3,1,4,2 D)3,4, 2,1
答案:C
评析:栈是一种后进先出表,在选项c中,先出栈的是3,说明此时栈内必然有1,2,由于l先于2进栈,所以l不可能在2之前出栈,故选项C这种出栈序列是不可能的。
(3)排序方法中,将整个无序序列分割成若干小的子序列并分别进行插入排序的方法,称为_______。
A)希尔排序 B)冒泡排序 C)插入排序 D)选择排序
答案:A
评析:希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。
(4)在顺序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查找关键码值11,所需的关键码比较次数为_______。
A)2 B)3 C)4 D)5
答案:C
评析:二分法查找是用关键码与线性表的中间元素比较,然后根据比较结果来判断是结束查找,还是在左边或者右边子表按相同的方法继续查找。本题中,与ll比较的关键码分别为15,8,10,12四个。
(5)对于n个结点的单向链表(无表头结点),需要指针单元的个数至少为_______。
A)n-1 B)n C)n+l D)2n
答案:C
评析:在n个结点的单向链表(无表头结点)中,每个结点都有一个指针单元(即指针域),加上头指针,至少需要n+1个指针单元。
(6)在软件开发过程中,软件结构设计是描述_______。
A)数据存储结构 B)软件体系结构 C)软件结构测试 D)软件控制过程
答案:B
评析:从工程管理的角度来看,软件设计分为两步完成:概要设计和详细设计。概要设计(又称结构设计)将软件需求转化为软件体系结构、确定系统级接口、全局数据结构或数据库模式。
(7)模块本身的内聚是模块独立性的重要性度量因素之一。在7类内聚中,具有最强内聚 的一类是_______。
A)顺序性内聚 B)过程性内聚 C)逻辑性内聚 D)功能性内聚
答案:D
评析:内聚性是一个模块内部各元素间彼此结合的紧密程度的度量。内聚共有7类,它们之间的内聚性由弱到强排列顺序为:偶然内聚、逻辑内聚、时间内聚、过程内聚、通信内聚、顺序内聚和功能内聚。
(8)数据存储和数据流都是_______,仅仅是所处的状态不同。
A)分析结果 B)事件 C)动作 D)数据
答案:D
评析:数据流图有4种成分:源点或终点、处理、数据存储和数据流。数据存储是处于静止状态的数据,数据流是处于运动中的数据。
(9)数据的完整性是指数据的正确性、有效性和_______。
A)可维护性 B)独立性 C)安全性 D)相容性
答案:D
评析:数据模型的完整性规则是给定的数据模型中数据及其联系所具有的制约和依存规则,用以限定符合数据模型的数据库状态及其状态的变化,以保证数据的正确性、有效性和相容性。
(10)关系代数运算是以_______为基础的运算。
A)关系运算 B)谓词运算 C)集合运算 D)代数运算
答案:C
评析:关系代数运算是以关系代数作为运算对象的一组高级运算的集合。它的基本操作是并、交、差、笛卡尔积,另外还包垂直分割(投影)、水平分割(选择)、关系的结合(连接)等。
(11)能将高级语言程序转换成目标语言程序的是_______。
A)调试程序 B)解释程序 C)编译程序 D)编辑程序
答案:C
评析:用高级语言编写的程序称为“源程序”,而计算机只能识别和执行由0和l组成的二进制指令,所以高级语言必须先用一种称为“编译程序”的软件,把源程序翻译成二进制形式的“目标程序”。
(12) _______是构成c语言程序的基本单位。
A)函数 B)过程 C)子程序 D)子例程
答案:A
评析:c程序是由函数构成的。一个c源程序至少包含一个main函数,也可以包含一个main函数和若干个其他函数,因此,函数是c程序的基本单位。
(13)可以在C语言中用做用户标识符的是_______。
A)void B)as_b3 C)for D)2c
define _123 -abc Do
WORD If cas SIG
答案:B
评析:在c语言中规定,标识符只能由字母、数字和下划线三种符号所组成,而且第一个字符必须是字母或下划线。另外还需要注意的是关键字不能作标识符。选项A中void,C中for都为关键字,D中2c以字母开头。
(14)若有以下类型说明语句:
char w;int x;float y,z;
则表达式w*x+z-y的结果为________类型。
A)float B)char C)int D)double
答案:A
评析:在进行运算时,不同类型的数据参加运算,需要先将其转换成同一类型的数据,然后再进行运算。转换的顺序由低到高为:char,short→int→unsigned→long→double→float,故结果为float型。
(15)main(
{ float x=123A56;
printf(“%-5.2f”,x);
}
以上程序输出的结果是________。
A)123.4 B)123.5 C)123.45 D)123.46
答案:D
评析:f格式符,用来输出实数,以小数的形式输出。“%-m.nf”的含义是:输出数据共占m列,其中n位小数,如果输出位数小于m。则右端补空格。如果总长度大于列数,则按实际情况四舍五入输出。
(16)下面语句的输出结果是________。
Printf(“%d\n”,strlen(“\t\”\065\xff\n”));
A)14 B)8
C)5 D)输出项不合法,无正常输出
答案:C
评析:在c语言中,以“\”开头的字符均为转义字符,其中“\”后可跟l~3位八进制数或在“\”后跟字母x及l~2位十六进制数,以此来代表一个特定的字符。
(17)下列程序的输出结果是________。
main()
{ int a=0,b=0,c=0;
if(++a>0lI++b>0)++c;
printf(“\na=%d,b=%d,c=%d”,a,b,C);
}
A)a=0,b=0,c=0 B)a=l,b=l,c=1
C)a=l,b=O, c=I D)a=0, b=1.c=1
答案:C
评析:
“︱︱”是或运算,它有个“短路”的特点需要特别注意,当“︱︱”运算符左边的表达式的值为真时,则程序就不再对“︱︱”右边的表达式的值去进行运算,而是使得整个表达式的值直接为真。
(18)下列程序的输出结果是_________。
Main()
{ int i;
for(i=1;i+l;i++)
{ if(i>4){printlf(”%d”,i++);break;}
}
printf(“%d”,i++);
}
A)55 B)56
C)程序错误,没有输出 D)循环条件永远为真,死循环
答案:B
评析:本程序中有个for循环,但注意到for循环的条件是“i+l”,也就是只要i+l的值为真(非零值均为真),就执行循环。当i=l的时,i+l的值为真,判断if条件不成立,执行i++,输出i的值为5。
(19)下列程序的输出结果是_________。
#define A 100
main()
{ int i=O,sum=O;
do{ if(I==(i/2)*2)continue;
sum+=i;
}while(++i
printf(“%d\n”,sum);
}
A)2500 B)2050 C)4 D)O
答案:A
评析:本题程序的功能是求1到_99之问(包括1和99)所有奇数之和。程序中的while循环的终止条件为++i=100,在while循环体内,如果i是偶数,则执行continue,跳过这一次循环,去执行下一次循环,否则求和。最后输出的值是1到99之间(包括l和99)所有奇数之和(1+99)*50/2=2500。
(20)下列程序的输出结果是_________。
main()
{ int I=3;
switch(i)
{ case 1:
case 2:printf(”%d”,i);
case 3:
case 4:break;
default:printf(”OK”);
}
}
A)0 B)3 C)OK D)没有任何输出
答案:D
评析:在本题中,i的值为3,由于“case 3:”后面没有break语句,所以继续向下执行“case 4:”后面的语句,由于“case 4:”后面的语句为break强行退出switch语句,所以,本题没有任何输出。
(21)下列程序执行后的输出结果是________。
main()
{ int m[][3]={1,4,7,2,5,8,3,6,9};
int i,k=2:
for(I=0;i<3;i++)
{printf(”%d”,m[k][i]);}
}
A)456 B)258 C)369 D)789
答案:C
评析:根据二维数组的定义得出:m[O][O]=1,m[O][1]=4,m[O][2]=7,m[1][0]=2,rail][1]=5,m[1][2]=8,m[2][0]=3,m[2][l]=6,m[2][2]=9,所以本题的输出是第3行的值m[2][0],m[2][1],m[2][2],即369。
(22)设已定义洱口k为int类型变量,则以下for循环语句_________。
for(i=0;k=-1,k=1;i++,k++)
printf(”****\n”);
A)判断循环结束的条件不合法 B)是无限循环
C)循环一次也不执行 D)循环只执行一次
答案:B
评析:本题定义了一个for循环,它的循环变量是i,但由于本题并没有去设置循环条件,所以循环的条件永远默认为真,即无限次执行循环。
(23)下面程序的输出结果是___________。
unsigned fun(unsigned num)
{ unsigned k=1;
do{
k*=num%lO;
num/=lO;
}while(num);
return(k);
}
main()
{ unsigned n。26;
printf(”%d\n”,fun(n));
}
A)0 B)4 C)12 D)无限次循环
答案:C
评析:本题定义了一个fun函数,用于num求和,具体执行过程如下:
num=26:k=k*(num%10)=1*(26%10),所以k=6,num=num/10=2;
num=2:k=k*(num%10)=6*(2%10),所以k=12,num=num/lO=O;
num=O:while条件不成立,所以返回k的值12.
(24)已知字母A的ASCII码值是65,字母a的ASCII码值是97,以下程序_______。
main()
{ char a=‘A’;
int b=20;
printf(“%d,%o”,(a=a+a,a+b,b),a+‘a’-‘A’,b);
}
A)表达式非法,输出零或不确定值
B)因输出项过多,无输出或输出不确定值
C)输出结果为20,141
D)输出结果为20,141,20
答案:C
评析:本题中首先输出逗号表达式“a=a+a,a+b,b”的值,即是20。然后以八进制的形式输出a+‘a’-‘A’的值为97对应的八进制数141,由于最后一个表达式b没有对应输出格式的输出项表列就不会输出。
(25)C语言函数返回值的类型是由__________决定的。
A)return语句中的表达式类型 B)调用函数的主调函数类型
C)调用函数时临时 D)定义函数时所指定的函数类型
答案:D
评析:函数值的类型应当是在定义函数时指定的。在定义函数时对函数值说明的类型一般应该和return语句中的表达式类型一致,如果不_致,则以函数类型为准,即函数类型决定返回值的类型。
(26)下列程序执行后输出的结果是___________。
int d=l:
fun(int p)
{ int d。5;
d+=p++;
printf(”%d,”,d);
}
main()
{ int a=3;
fun(a);
d+=a++:
printf(”%d\n”,d);
}
A)8,12 B)9,13 C)8,4 D)9,5
答案:C
评析:本题执行过程如下:首先调用fun函数,使得实参a的值3传递给形参p,得到局部变量d=8,打印出局部变量d的值8;返回主函数执行“d+=a++”,此处的d为全局变量,所以d=1+3=4(由于本题是值传递,所以在函数fun中对p值的改变并不能引起a的改变),故本题的输出是8,4。
(27)已知下面的程序段,正确的判断是_________。
#define A 3
#define B(A)((_A+1)‘a)
int a=3:
……
X=3*(A+B(7));
A)程序错误,不允许嵌套定义 B)X=93
C)X=8l D)程序错误,宏定义不允许有参数
答案:C
评析:本题的宏定义是合法的,宏定义展开为3*(3+((A+1)*a))=3*(3+((7+1)*3))=81。
(28)定义int*swap()指的是_______。
A)一个返回整型值的函数swap()
B)一个返回指向整型值指针的函数swap()
C)一个指向函数swap()的指针,函数返回一个整型值
D)以上说法均错
答案:B
评析:一个函数可以带回一个整型值、字符值、实型值等,但是也可以带回指针型数据,即地址。本题的定义中,包括括号和·号,由于f)优先级高于t。故它是一个返回整型指针的函数。
(29)以下程序段的输出结果是__________。
main()
{ char s1[10],s2[10],s3[10];
scanf(”%s”,s1);gets(s2);gets(s3);
puts(s 1);puts(s2);puts(s3);
}
输入数据如下: (此处代表回车符)
aaa
bbb
A)aaa B)aaa C)aaa\0bbb\0 D)aaabbb
bbb
bbb
答案:B
评析:scanf是标准的输入函数,在输入字符串aaa时,实际的内容为“aaa ”,“\0”是由系统自动加入的;gets的功能是从终端读入一行字符,即一直读到换行符为止,并由系统自动以“\0”代替换行符。
(30)下述函数功能是________。
Int fun(char*x)
{ char*y=x;
while(*y++);
return y-x-l;
}
A)求字符串的长度 B)求字符串存放的位置
C)比较两个字符串的大小 D)将字符串x连接到字符串y后面
答案:A
评析:在函数体内定义一字符型指针并指向形参,然后遍历其中各字符直到碰到NULL,最后返回字符串首尾地址的差值,即字符串的长度。
(31)以下程序的输出结果是_________。
main()
{ char str[12]={‘s’,‘t’,‘r’,‘i’,‘n’,‘ g’};
printf(”%d\n”,strlen(str));
}
A)6 B)7 C)ll D)12
答案:A
评析:在c语言中,字符串的长度是其首字符到NULL(不含)字符的总字符个数。本题定义字符数组str的同时,对第7个元素,由系统自动添加上“\0”,故字符串的长度为6。
(32)请读程序段:
char str[]=”ABCD”,*p=str;
printf(”%d\n”,*(p+4));
程序段的输出结果是_________。
A)68 B)0
C)字符‘D’的地址 D)不确定的值
答案:B
评析:在对字符数组赋字符串值时,系统会自动在字符串的末尾加上一个字符串结束标志“\0”,故指向字符数组的指针p的+(p+4)的值为“\0”。由于“\0”的编码值就是0,所以本题输出为0。
(33)若有定义:int a[4][10];,则以下选项中对数组元素a[i][j]引用错误的是________。
(0<=i<4,0<=j<10)
A)*(&a[O][O]+10*i+j) B)*(a+i)+j
C)*(*(a+i)+j) D)*(a[i]+j)
答案:B
评析:本题中选项B是错误的引用,*(a+i)+j只代表了a[i][i]的地址。
(34)设有以下语句:
char strl[]=”string”,str2[8],。str3,。str4=”strin∥;
则__________不是对库函数的正确调用。
A)strcpy(strl,”HELLOl”); B)strcpy(str2,”HELL02”);
C)strcpy(str3,”HELL03”); D)strcpy(str4,”HELL04”);
答案:C
评析:c语言中:sgcpy(stl,st2);,其两个参数均为字符指针或字符数组,选项c中的目的`串指针str3没有指向具体有效的存储单元,故是错误的调用。
(35)请读程序:
#include
#include
main()
{ char*sl=”AbCdEf”,*s2=”aB”;
s1++;s2++;
printf(”%d\n”,strcmp(s 1,s2));
}
上面程序的输出结果是___________。
A)正数 B)负数 C)零 D)不确定的值
答案:A
评析:函数strcmp的功能是比较字符串s1和s2,如果sl>s2,则返回个正数;如果sls2,所以函数的值为正数。
(36)下面程序的输出是_________。
char s[]=”ABcD”;
main()
{ char*p;
for(p=s;p
printf(”%s\n”,p);
}
A)ABCD B)A C)D D)ABCD
BCD B C ABC
CD C B AB
D D A A
答案:A
评析:在第一次执行for循环的时候,字符数组的首地址赋给了指针变量p,使得指针变量p指向了s的首地址,输出p所指向的字符串;第二次执行for循环时,p值增加1,p指向了s的第二个元素输出BCD;第三次输出CD;第四次输出D;直到p指向字符串的结束字符“\0”,for循环终止执行。
(37)以下程序输出的结果为__________。
main()
{ char* alpha[6]={“ABCD”,EFGH”,”IJKL”,”MNOP”,”QRST”,”UVwX”};
char**p;
int i:
p=alpha;
for(I=0;i<4;i++)
printf(”%s”,p[I]);
}
A)ABCDEFGHIJKL B)ABCD
C)ABCDEFGHIJKLMNOP D)AEIM
答案:C
评析:alpha[O]指向“ABCD”的首地址;alpha[1]指向“EFGH”的首地址;alpha[2]指向“IJKL”的首地址,依此类推。当执行到p=alpha后,p指向指针数组alpha的首地址。for循环中输出了4个字符串。
(38)下面程序的输出结果是_________。
#include
main()
{ char*p[]={”B00L”,”0PK”,”H”,”SP”};
int i:
for(i=3;i>=0;i–,i–)
printf(“%c”,*p[i]);
printf(”\n”);
}
A)SO B)SP C)SPOPK D)SHOB
答案:A
评析:p[0]存放的是“BOOL\0”的首地址;p[1]存放的是“OPK\0”的首址等。
在printf语句中输出的+p[I]表示p[i]字符串的第一个字符。在for循环中,i的初值为3,那么输出的第一个字符为“s”,接着两次i–,则输出的值为+p[1],即字符“0”,所以本题的输出为SO。
(39)以下程序的输出结果是_________。
#include
void prt(int*x,int*y,int*z)
{ printf(”%d,%d,%d\n”,++*x,++*y*(z++));}
int a=10,b=40,c=20;
main()
{ prt(&a,&b&C);
prt(&a,&b,&C);
}
A)ll,42,3l B)ll,41,20 C)1l,21,40 D)11,41,2l
12,22,41 12,42,20 11,2l,41 12,42,22
答案:B
评析:由于实参传送的是变量的地址,所以对形参指针所指向的单元内容的改变,即对实参内容的改变。
(40)若一个外部变量的定义形式为static int x;,那么,其中static的作用应该是_______。
A)将变量存储在静态存储区
B)使变量x可以由系统自动初始化
C)使x只能在本文件内引用
D)使x的值可以永久保留
答案:C
评析:事实上,无论有无static修饰,外部变量都具有A、B和c三种特性。作为一种修饰,static仅是限制此类型外部变量的引用范围:只能在定义它的文件范围内使用。
(41)以下程序的输出结果是________。
#include
#define SQR(x)x*x
main()
{ int a,k=3;
a=++SQR(k+1);
printf(”%d\n”,a);
}
A)8 B)9 C)17 D)20
答案:B
评析:本题宏替换中遇到形参x以实参k+l代替,其它字符不变。sQR(k+1)展开后应为字符串k+l*k+l。
(42)下面是对宏定义的描述,不正确的是_______。
A)宏不存在类型问题,宏名无类型,它的参数也无类型
B)宏替换不占用运行时间
C)宏替换时先求出实参表达式的值,然后代入形参运算求值
D)宏替换只不过是字符替代而已
答案:C
评析:宏替换实质上就是字符替代,它不可能去进行计算,故c是错误的。带参数的宏与函数相比,宏在程序编译之前已经将代码替换到程序内,执行时不会产生类似于函数调用的问题,可以说不占用运行时间。
(43)以下程序(程序左边的数字为附加的行号)________。
1#include
2#include
3main()
4{char s[]=”string”;
5 puts(s);
6 strcpy(s,”hello”);
7 printf(”%3s\n”,s);}
A)没有错 B)第l行有错 C)第6行有错 D)第7行有错
答案:B
评析:字符串复制函数strcpy包含在头文件string.h中,因此,程序中的第l行文件包含命令是错误的。
(44)若有如下说明,则__________的叙述是正确的。
struct st
{ int a;
int b[2l;
}a;
A)结构体变量a与结构体成员a同名,定义是非法的
B)程序只在执行到该定义时才为结构体st分配存储单元
C)程序运行时为结构体st分配6个字节存储单元
D)类型名struct st可以通过extern关键字提前引用(即引用在前,说明在后)
答案:D
评析:结构体变量a与结构体成员a同名是合法的定义,引用成员a的方法是a.a,变量a处于不同的“层次”上,系统完全能够分清。st是一个结构体名,不会为结构体名分配存储空间,应该是在运行时为结构体变量a分配6个字节的存储单元,故选项B和选项C错误。
(45)若有以下结构体定义,则________是正确的引用或定义。
struct example
{ int x;
int y;
}v1;
A)example.x=10 B)example v2.x=10
C)struct v2;v2.x=lO D)struct example v2={10};
答案:D
评析:在定义结构体变量时,不能只用结构体名example或关键字strum进行定义,必需要用结构体类型名struct example定义,在引用结构体成员变量时,需要用结构体变量名进行引用,所以选D。
(46)下列程序的执行结果是_________。
#include
union un
{ int i;
char c[21;
};
void main()
{ union un x;
x.c[0]=10:
x.c[1]=1:
printf(“\n%d”,x.i);
}
A)266 B)ll C)265 D)138
答案:A
评析:由于本题定义的是共用体,所以成员表列中的整型变量x和字符数组c共占用同一个存储单元,且此存储单元为2个字节,通常c[O]位于低字节,c[1]位于高字节,所以x.i的值为266。
(47)已知形成链表的存储结构如下图所示,则下述类型描述中的空白处应填_______。
struct link
Datanext{ char data;
___________
}node;
A)struct link next B)link*next
C)struct next link D)struct link*next
答案:D
评析:在单向链表中,由于每个结点需要存储下一个结点的地址,且下一个结点的数据类型与前一个结点的数据类型完全相同,故应为struct link*next。
(48)已知小写字母a的ASCII码为97,大写字母A的ASCII.码为65,以下程序的结果是__________。
main()
{ unsigned int a=32,b=66;
printf(“%c\n”,atb);
}
A)66 B)98 C)b D)B
答案:C
评析:位运算符“l”的作用是按位或,即两个二进制数的相应位中只要有一个为1,该位的结果值为l。最后以字符型输出, 98对应的字符“b”。
(49)C语言库函数龟ets(str,n,fp)的功能是_________。
A)从fp指向的文件中读取长度n的字符串存入str指向的内存
B)从fp指向的文件中读取长度不超过n-l的字符串存入str指向的内存
C)从fp指向的文件中读取n个字符串存/Xstr指向的内存
D)从str读取至多n个字符到文件fp
答案:B
评析:fgets函数的作用是从指定的文件读入一个字符串。fgets(str,n,fp);中的n为要求得到的字符的个数,但只从fb指向的文件输入n-1个字符,然后在最后加一个‘\O’字符,因此得到的字符串共有n个字符。
(50)下述的程序向文件输出的结果是__________。
#include
void main()
{ FILE*fp=fopen(“TEST”,”wb”);
fprintf(fp,”%d%5.0f%c%d”,58,76273.0,’-',2278);
fclose(fp);
}
A)58 76273-2278 B)5876273。.000000-2278
C)5876273-2278 D)因文件为二进制文件而不可读
答案:C
评析:fprintf函数工作时,多个数据间不会自动加分隔符,选项A错误;浮点数的输出格式是“%5.0f”表明其小数部分输出O位,即没有输出,所以选项B也是错误的。
二、填空题(每空2分,共40分)
请将每个空的正确答案写在【l】至【20】序号的横线上,答在试卷上不得分。
(1)对于长度为n的顺序存储的线性表,当随机插入和删除一个元素时,需平均移动元素的个数为 【l】 。
答案:【1】n/2
评析:删除一个元素,平均移动的元素个数为(n-l+n-2+……+0)n=(n-1)/2;插入一个元素,平均移动元素个数为(n+n-l+n-2+……+1)n=(n+1)/2;所以总体平均移动元素个数为n/2。
(2)注释说明了程序的功能,它分为 【2】 注释和功能性注释。
答案:【2】序言性
评析:注释一般分为序言性注释和功能性注释。
(3)软件测试中路径覆盖测试是整个测试的基础,它是对软件 【3】 进行测试。
答案:【3】结构
评析:路径测试是白盒测试方法中的一种,它要求对程序中的每条路径最少检查一次,目的是对软件的结构进行测试。
(4)数据库技术的主要特点为数据的集成性、数据的高 【4】 和低冗余性、数据独立性和数据统一管理与控制。
答案:【4】共享性
评析:数据库技术的主要特点有以下几个方面:数据的集成性,数据的高共享性与低冗余性,数据韵独立性,数据统一管理与控制。
(5)数据元素之间 【5】 的整体称为逻辑结构。
答案:【5】逻辑关系
评析:数据元素之间逻辑关系的整体称为逻辑结构。数据的逻辑结构就是数据的组织形式。
(6)若有定义int m=5,y=2,则执行表达式y+=y-=m*=y后,y的值为 【6】 。
答案:【6】.16
评析:将赋值运算符右侧的“表达式”的值赋给左侧的变量,并且赋值运算符按照“白右而左”的结合顺序,本题表达式应先算m的值为10,再运算y的值为8,最后计算y=y+(-8)=-8+(-8)=-16。
(7)若x和y都是double型变量,]ix的初值为3.0,y的初值为2.0,则表达式pow(y,fabs(x))的值为 【7】 。
答案:【7】8.000000
评析: fabs函数功能是求x的绝对值,计算结果为double型。pow功能是计算x的y次方的值,计算结果同样为double型。所以本题表达式相当于2.0的3.0次方,结果为8.000000。
(8)设有char a,b;,若要通过a&b运算屏蔽掉a中的其它位,只保留第2位和第8位(右起为第1位),则b的二进制是 【8】 。
答案:【8】10000010
评析:运算“&”的规则是只有当两个相应的二进制位都为1时,该位的结果才为1。要保留第2、8位,只要将其与二进制数10000010相与。
(9)下列程序执行后输出的结果是 【9】 。
f(int a)
{ static c=0;
C=a+C++:
return(C);
}
main()
{ int a=2,i,k;
for(i=O;i<2;i++)
k=f(a++);
printf(”%d\n”,k);
}
答案:【9】7
评析:在程序执行时,static变量仅初始化一次,下次使用时将使用上次保存的值。
(10)下面程序执行后输出的结果是 【10】 。
int m=13:
int fun(int x,int y)
{ int m=3;
return(x*y-m);
}
main()
{ int a=7,b=5;
printf(”%d\n”,fun(a,b)/m);
}
答案:【10】2
评析:本题变量m既是外部变量(值是13),又是fun函数的局部变量(值为3)。函数fun(x*y-m)的值为7*5-3=32,在main函数中,ftm(a,b)/m中的m应取外部变量的值13,因此输出2。
(11)下列程序执行后输出的结果是 【11】 。
main()
{ nt arr[10],i,k=0;
for(I=0;i for(I=1;i<4;i++)k+=arr[i]+i; printf(”%d\n”,k); } 答案:【11】12 评析:本题的第一个for循环是用于给数组arr赋初值,第二个for循环用于求和运算。由于第二个for循环初始值为1,而循环条件为i<4,所以求的是art[1]到arr[3]及i的和,所以输出结果为12。 (12)下列程序执行后输出的结果是 【12】 。 struct s {int x,y;}data[2]={10,100,20,200}; main() { struct s*p=data; printf(”%d”,++(p->x)); } 答案:【12】11 评析:程序中结构体数组data首地址(即&data[0])赋值给结构体指针变量p,++(p->x)表示先将p所指向的结构体变量的成员x值加1,然后将此x(即data[01.x]输出。 (13)下面程序有两个printf语句,如果第一个printf语句输出的是194,则第二个print语句的输出结果是 【13】 。 main() { int a [10]={1,2,3,4,5,6,7,8,9,0},*p; p=a; printf(”%X\n”,p); printf(”%x\n”,p+9); } 答案:【13】la6 评析:对于指针变量的运算,就是对于地址的运算。本题中由于指针指向的是整型变量,所以,使指针变量移动9个位置也就是移动18个字节。注意,本题是以16进制输出的。 (14)以下函数的功能是计算s=l+l/2!+l/3!+…+l/n!,请填空. double fun(int n) { double s=O.O,fac=1.O; int i,k=1; for(i=l;i<=n;i++) { 【14】 ; fat=fat/k; s=s+fac; } } 答案:【14】k=k*i 评析:本题中通过for循环求s表达式中每一项的和,表达式“fac=fac/k;”求的是每一项的值,所以k的值应为n!,在求n!的时候,可以用上次循环阶乘的值乘i,就可以直接得此次n!,故本题填k=k*i。 (15)下面程序的运行结果是 【15】 。 main() { unsigned a=0112,x; x=a>>3: printf(”x=%o”,x); } 答案:【15】x=11 评析:在对无符号数的右移是高位补0。 (16)函数(s,i,n)是作用是从字符串s中删除从第i个字符开始的n个字符,请填空。 void (char s[],int i,int n) { int j,k,length=O; while(s[1ength]) 【16】 ; –i: j=i; } if( 【17】 ) { k=i+n; if(i+n<=length) while(k s[j++]=s[k++]; s[j]=‘\0’; } 答案:【16】length++ 【17】i 评析:第一个循环极有可能是这个计算串的长度,在i<=length时字符才被删除,被删除的是从第i个到第i+n或最后一个间的所有字符。删除前,应判断i<=length。由于已经进行了一i运算,故实际应填入i (17)下述函数统计一个字符串中的单词个数,单词是指处在空格之间的字符序列,请填空。 int word(char*s) { int num=O,flag=O; while(*s) { if( 【18】 ==”)flag=O; else if( 【19】 ){flag=1;num++} } return 【20】 ; } 答案:【18】*s++ 【19】flag==O或*(s-1)==” 【20】num 评析:在统计字符串单词个数的算法中,本题的flag是为了记录一个单词是否结束了。在第18空应填写*s++;如果某个字符不是空格,则必需判断它是否是单词,如果是,则使得flag的标志为1,num的值加1。本题判断方法是:先判断s所指向的字符是否为空格,如果是则使得flag=O,否则判断前一个字符是否是空格,如果是的话,则说明这个字符是一个单词的开始,将flag标志为1,num的值加1,如果不是,则不必记录。故第19空应flag==O或*(s-1)==”;最后一个空格需填写的是返回的单词的个数,即num。 c语言试题及答案 c语言试题 一 选择题(7分,每小题0.5分) 1.C语言源程序的基本单位是( )。 A 过程 B 函数 C 子程序 D 标识符 2.下列程序的输出结果是( )。 main( ) { int a=7,b=5; printf(“%d”,b=b/a); } A 5 B 1 C 0 D不确定值 3.假设变量a,b均为整型,表达式(a=5,b=2,a>b?a++:b++,a+b)的值是( )。 A 7 B 8 C 9 D 2 4.设a为int型变量,执行下列赋值语句后,a的取值分别是( )。 a=125.534; a=(int)125.521%4; a=5<<2; A 125,31,1 B 125,1,20 C 125,31,20 D 125.534,2,20 5.设有如下程序段,下面描述中正确的是 ( )。 int k=10; while(k=0) k=k-1; A 循环执行一次 B循环是无限循环 C循环体语句一次也不执行 D循环体语句执行一次 6.以下程序的输出结果为( )。 int i; void prt( ) { for(i=5;i<8;i++) printf(“%c”,'*'); printf(“ ”); } main( ) { for(i=5;i<=8;i++) prt( ); } A *** B *** *** *** *** C *** *** D * * * 7.在C语言程序中,以下说法正确的是( )。 A函数的定义可以嵌套,但函数的调用不可以嵌套 B函数的定义不可以嵌套,但函数的调用可以嵌套 C函数的定义和函数的调用都不可以嵌套 D函数的定义和函数的调用都可以嵌套 8.以下函数调用语句中含有( )个实参。 func((e1,e2),(e3,e4,e5)); A 2 B 3 C 5 D 语法错误 9.以下程序的输出结果为( )。 #define ADD(x) x*x main( ) { int a=4,b=6,c=7,d=ADD(a+b)*c; printf(“d=%d”,d); } A d=70 B d=80 C d=140 D d=700 10.已知职工记录描述如下,在Turbo C中,系统为变量w分配( )字节的空间。 struct worker { int no; char name[20]; char sex; union { int day; int month; int year;}birth; } w; A 29 B 20 C 25 D 6 11.设有以下定义,值为5的枚举常量是( )。 enum week{sun,mon=4,tue,wed,thu,fri,sat} w; A tue B sat C fri D thu 12.下面选项中正确的赋值语句是(设 char a[5],*p=a;)( )。 A p=“abcd”; B a=“abcd”; C *p=“abcd”; D *a=“abcd”; 13.设有以下程序段,则值为6的表达式是( )。 struct st { int n; struct st *next;}; static struct st a[3]={5,&a[1],7,&a[2],9,0 },*p; p=&a[0]; A p++->n B ++p->n C p->n++ D (*p).n++ 14.C语言中的文件类型只有( )。 A 索引文件和文本文件两种 B 文本文件一种 C 二进制文件一种 D ASCII码文件和二进制文件两种 二 判断对错,对的划“√”,错的划“×”(5分,每小题0.5分) 1.在Turbo C中,整型数据在内存中占2个字节。( ) 2.int i=20;switch(i/10){case 2:printf(“A”);case 1:printf(“B”);}的输出结果为A。( ) 3.break语句用在循环体中,可结束本层循环,continue语句用在循环体中,可结束本次循环。( ) 4.函数的递归调用不过是一个函数直接或间接地调用它自身。( ) 5.函数strlen(“ASDFG”)的值是7。( ) 6.通过return语句,函数可以带回一个或一个以上的返回值。( ) 7.结构体类型只有一种。 ( ) 8.char *p=“girl”;的含义是定义字符型指针变量p,p的值是字符串“girl”。( ) 9.若有定义:char *p(char a[10]);则p是函数名。( ) 10.用fopen(“file”,“r+”);打开的文件“file”可以进行修改。 ( ) 三 写出下列程序的运行结果(10分,每小题2分) 1.float average (float array[10]) { int i; float aver,sum=array[0]; for (i=1;i<10;i++) sum=sum+array[i]; aver=sum/10; return(aver); } main( ) { float score[10]={89,67.5,78,91,56,82.5,65,70,79,88},aver; int i; aver=average (score); printf (“average score is %5.2f”,aver); } 2.main( ) { char a[5]={‘A’,‘B’,‘C’,‘D’,‘E’},*p=a,**pa; for(p=0;p printf(“%2c”,*p); printf(“”); printf(“%2c”,**(pa=&p)); } 3.main( ) { int a,b,s=0; for(a=1,b=1;a<=100;a++) { if(b>=20) break; if(b%3==1) { b+=3; continue; } b-=5; } printf(“a=%d b=%d”,a,b); } 4.main() { printf(“main( ) :%d”,fact(5)); fact(-5); } fact(int value) { int f; if(value<0) { printf(“Arg error“); return(-1); } else if(value==1||value==0) f=1; else f=value*fact(value-1)+1; printf(“This called value=%d”,f); return f; } 5.main( ) { int a=012,b=0x12,k=12; char c=‘102’,d=‘’; printf(“a=%d b=%d k=%d”,a,b,k); printf(“c=%c,d=%c%o”,c,d,a); a=‘A’; c=49; printf(“a=%d c=%c”,a,c); } 四 阅读下列程序,在 处填入适当内容,使程序完整(8分,每个空1分) 1.有一个3*4矩阵,求其中的最大元素。 max_value( (1) ) { int i,j,max; max=array[0][0]; for(i=0;i<3;i++) for(j=0;j<4;j++) if(array[i][j]>max) max=array[i][j]; (2) ; } main( ) { int a[3][4], i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) (3) ; printf(“max value is %d”,max_value(a)); } 2.输入x、y两个整数,按先大后小的顺序输出x、y。 #include “stdio.h” main( ) { int x,y, *px,*py, (4) ; scanf(“%d%d”,&x,&y); (5) ; (6) ; if(x { p=px; px=py; py=p; } printf(“x=%d,y=%d”,x,y); printf(“MAX=%d,MIN=%d”,*px,*py); } 3.用选择排序法对任意10个整数按照由小到大排序。 main() { int a[11],i,j,k,t; printf(”Please input 10 numbers:“); for(i=1;i<11;i++) scanf(”%d“,&a[i]); printf(”“); for(i=1;i<=9;i++) { (7) ; for(j=i+1; (8) ;j++) if(a[j]>a[k]) k=j; if(k!=i) { t=a[k]; a[k]=a[i]; a[i]=t;} } printf(”The sorted numbers:“); for(i=1;i<11;i++) printf(”%d “,a[i]); } 答案 一 选择题(7分,每小题0.5分) 1. B 2. C 3. B 4. B 5. C 6. A 7. B 8. A 9. A 10. C 11. A 12. A 13. B 14. D 二 判断对错,对的划“√”,错的划“×”(5分,每小题0.5分) 1.× 2.× 3.√ 4.√ 5.× 6.× 7.× 8.× 9.√ 10.√ 三 写出下列程序的运行结果(10分,每小题2分) 1. 2. 3. 4. 5. 四 阅读下列程序,在 处填入适当内容,使程序完整(8分,每个空1分) 1.(1)int array[3][4](int array[][4]) (2)return(max) (3)scanf(“%d”,&a[i][j]) 2.(4)*p (5)px=&x(py=&y) (6)py=&y(px=&x) 3.(7) (8) C语言试题3 一 选择题(24分,每小题2分) 1.已知函数fread的调用形式为fread(buffer,size,count,fp),其中buffer代表的是( )。 A 存放读入数据项的存储区 B 存放读入数据的地址或指向此地址的指针 C 一个指向所读文件的文件指针 D 一个整形变量,代表要读入的数据项总数 2.以下程序的输出结果为( )。 main( ) { int i=010,j=10; printf(”%d,%d“,i++,j--); } A 11,9 B 9,10 C 8,10 D 9,9 3.设a为int型变量,执行下列赋值语句后,a的取值分别是( )。a=125.534;a=20.0/3;a=(int)125.521%4;a=5<<2; A 125,6,31,1 B 125,6,1,20 C 125,6.666666,31,20 D 125.534,6.666666,2,20 4.设i和k都是int类型,则for循环语句( )。 for(i=0,k=-1;k=1;i++,k++) printf(”****“); A 循环结束的条件不合法 B 循环体一次也不执行 C 循环体只执行一次 D 是无限循环 5.以下程序的输出结果为( )。 main( ) { char c; int i; for(i=65;i<68;i++) { c=i+32; switch(c) { case 'a':case 'b':case 'c':printf(”%c,“,c);break; default:printf(”end“);} } } A a,b,c,end B a,a,a,end C a,a,a, D a,b,c, 6.函数调用语句:fseek(fp,-10L,2);的含义是( )。 A 将文件位置指针从文件末尾处向文件头的方向移动10个字节 B 将文件位置指针从当前位置向文件头的方向移动10个字节 C 将文件位置指针从当前位置向文件末尾方向移动10个字节 D 将文件位置指针移到距离文件头10个字节处 7.以下程序的输出结果为( )。 main( ) { char s1[40]=”country“,s2[20]=”side“; int i=0,j=0; while(s1[i]!=' ') i++; while(s2[j]!=' ') s1[i++]=s2[j++]; s1[i]=0; printf(”%s“,s1); } A side B country C sidetry D countryside 8.下列说法不正确的是( )。 A 主函数main中定义的变量在整个文件或程序中有效 B 不同函数中,可以使用相同名字的变量 C 形式参数是局部变量 D 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效 9.在下列程序段中,枚举变量 c1的.值是( )。 enum color { red,yellow,blue=4,green,white}c1; c1=yellow; c1=white; A 1 B 3 C 5 D 6 10.设有说明 int (*ptr)();其中标识符ptr是( )。 A 是一个指向整形变量的指针 B 是一个指针,它指向一个函数值是int的函数 C 是一个函数名 D定义不合法 11.定义由n个指向整形数据的指针组成的数组p,其正确的方式为( )。 A int p; B int (*p)[n]; C int *p[n]; D int (*p)( ); 12.具有相同类型的指针类型变量p与数组a,不能进行的操作是( )。 A p=a; B *p=a[0]; C p=&a[0]; D p=&a; 二 判断对错,对的划“√”,错的划“×”(20分,每小题2分) 1.参加位运算的数据可以是任何类型的数据。( ) 2.若有定义和语句:int a;char c;float f;scanf(”%d,%c,%f“,&a,&c,&f);若通过键盘输入:10,A,12.5,则a=10,c=‘A’,f=12.5。( ) 3.C语言把文件看作是一个字符(字节)的序列。( ) 4.若有宏定义:#define S(a,b) t=a;a=b;b=t由于变量t没定义,所以此宏定义是错误的。( ) 5.在Turbo C中,下面的定义和语句是合法的:file *fp;fp=fopen(”a.txt“,”r“);( ) 6.若有定义:char s[ ]=”china“;则Turbo C系统为数组s开辟6个字节的内存单元。( ) 7.若有定义和语句:int a[3][3]={{3,5},{8,9},{12,35}},i,sum=0;for(i=0;i<3;i++) sum+=a[i][2-i];则sum=21。( ) 8.若有定义和语句:struct student { int num; char name[10]; float score;} s[5]={{1,”lili“,98.5},{9,”xiaohua“,66}},*p=s;printf(”%d“,*p++);输出结果是1。( ) 9.在程序中定义了一个结构体类型后,可以多次用它来定义具有该类型的变量。( ) 10.在Turbo C中,此定义和语句是合法的:enum aa{ a=5,b,c}bb;bb=(enum aa)5;( ) 三 写出下列程序的运行结果(36分,每小题6分) 1.main( ) { int i=29,j=6,k=2,s; s=i+i/j%k-9; printf(“s=%d”,s); } 2.main( ) { int x=31,y=2,s=0; do { s-=x*y; x+=2; y-=3;} while( x%3==0); printf(“x=%d y=%d s=%d”,x,y,s); } 3.main( ) { int a[6]={10,20,30,40,50,60},i; invert(a,0,5); for(i=0;i<6;i++) printf(“%d,”,a[i]); printf(“”); } invert(int s[ ],int i,int j) { int t; if(i { invert(s,i+1j-1); t=s[i];s[i]=s[j];s[j]=t; } } 4.#include main() { char str[ ]=“The C program”,c; int i; for(i=2;(c=str[i])!=‘ ’;i++) { switch(c) { case ‘g’: ++i; break; case ‘o’: continue; default: printf(“%c”,c); continue; } printf(“*”); } printf(“”); } 5.struct w { char low; char high; }; union u { struct w byte; short word; }uw; main( ) { int result; uw.word=0x1234; printf(“word value:%04x”,uw.word); printf(“high byte:%02x”,uw.byte.high); printf(“low byte:%02x”,uw.byte.low); uw.byte.low=0x74; printf(“word value:%04x”,uw.word); result=uw.word+0x2a34; printf(“the result:%04x”,result); } 6.main() { char *s2=“I love China!”,**s1=&s2; char *s3,c,*s4=“w”; s3=&c; *s3=‘H’; s2=s2+2; printf(“%s %c %s %c”,s2,*s3,s4,**s1); } 四 阅读下列程序,在 处填入适当内容,使程序完整(20分,每个空2分) 1. 百马百担问题:有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,问大、中、小马各多少匹? main( ) { int hb,hm,hl,n=0; for(hb=0;hb<=100;hb+= (1) ) for(hm=0;hm<=100-hb;hm+= (2) ) { hl=100-hb- (3) ; if(hb/3+hm/2+2* (3) ==100) { n++; printf(”hb=%d,hm=%d,hl=%d“,hb/3,hm/2,2*hl); } } printf(”n=%d“,n); } 2.用“起泡法”对输入的10个字符排序后按从小到大的次序输出。 #define N 10 char str[N]; main() { int i,flag; for(flag=1;flag==1;) { scanf(”%s“,str); flag=0; printf(”“); } sort(___(4)___); for(i=0;i printf(”%c“,str[i]); printf(”“); } sort(char str[N]) { int i,j; char t; for(j=1;j for(i=0;(i篇4:c语言试题及答案