C语言基础(二)

一、选择题(每小题2分,共10分)

(下在各小题,分别有一个或多个正确答案,请将所有正确答案的编号,填写在该小题题干后的括号内。错选或漏选均不得分)。

1、若定义:int a[2][3]0246810};以下描述正确的有( ACD

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,28,故C正确;

Da[0]a相同   

因二者都是指针,指针的地址都是指向数组中的第一个元素的地址,故D正确。

Ea[1][2]的值为10

它是指第二行的第三个元素,为10,正确

2、对函数的正确使用方法描述( ACD  )。

A、用数组做函数参数时,必须在主调函数和被调函数中分别定义数组

B、实参数组元素和形参数组元素类型可以不一致

C、形参数组长度可以不指定    D、形参数组长度可以大于实参数组长度

E、数组名做参数属于值传递

3、对静态变量的正确描述( ABDE  

A、静态局部变量在静态存储区内分配单元(    

B、静态外部变量可以赋初值,也可以不赋初值

C、静态外部变量的作用与外部变量相同

D、静态局部变量在函数调用结束时,仍保存其值,不会随着消失。

E、静态局部变量只赋一次初值

4、下列描述正确的是(  A C)。

A、由main 函数及其参数argc* argv[]可以实现命令行方式

B、使用fclose关闭文件时,先释放文件指针,再写缓冲区数据到文件中

//先写缓冲区数据到文件中,再释放文件指针

C、字符数组并不要求它的最后一个字符是‘\0

//是的,以字符指针指向的字符串才要求,因为只有这样,才能知道字符串的长度,而在字符数组中,不用\0,一样可以知道到哪里是字符数组的结尾。

D、‘A’和“A”都是字符串常量   

E、若char*S=\ta\017bc”;则指针变量S指向的字符串所占的字节数是7

5、在缓冲文件系统中用于读写的函数有( ABD  

Aputchar ()    Bfread()  Crewind ()    Dpurw()   Efseek()

二、程序阅读,并给出运行结果(共10分,每题5分)。

1main()

 unsigned a,b,x

   int n;

   a=0x763                       输出结果:

   n=6;

   b=a<<(12-n);

   x=(a>>n-2)^b;  //+,-,的优先级比<<,>>高。

   printf(“\nb=%x,\nx=%x”,b,x);

   

 

在用2个字节表示整数的系统中

结果为

d8c0

d8b6

在用4个字节表示整数的系统中

结果为

1d8c0

1d8b6

 

故以上两种结果都正确。

 

  (2) #include stdin.h

   struct m int x;

int *y;

              *p;

 int a [4]=1233-40100};

  struct m b [4]=10,&a[2],9,&a[3],8,&a[0],7,&a[1]'

  main()

  p=b;                输出结果:

  printf(“%d\n,++p-x; //->的优先级高于++,因此等于是++(p->x),11

  printf(“%d\n,(++p)-x; //p后移一个元素,其x值为9;

  printf(“%d\n,++(*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)把ab合并的结果,写到一个临时文件c中,最后把c的文件覆盖到a文件中,达到题意的要求。

#include<stdio.h>

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分,共计6分)

1、‘\t’表示什么?

①字符串常数  ②标识符  ③变量  ④字符常量

答案:④

2、对宏定义不正确的描述是哪一个?

①在进行宏定义时,可以引用已经定义的宏名,可以层层置换

//可以引用已经定义了的宏名,可以层层置换

②宏名的有效范围包括本文件的任何位置

//宏名的有效范围定义命令之后到本源文件结束,可以用#define终止宏定义的作用域

③宠定义不是语句,不必在行末加分号

//是预处理定义语句

④对程序中双引号括起来的字符串,即使与宏名相同,也不进行置换

3、若定义static char s[20]=computer”;则执行语句x = strlen(s);之后,x的值为多少?8

20    9    8   19

//strlen函数计算char*型字符串的长度的时候,并不包含末尾的\0;4

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) (5-3);

//不能对其赋值

6、下列说法中正确的是哪一个?

sizeof (char) 是结果为整型的表达式//正确

sizeof (char) 是一个不合法的表示形式

sizeof (char) 是一种函数调用

sizeof (char) 是结果为实型的表达式

二、阅读程序,并回答问题(共12分)

1、下列程序的输出是什么?(3分)

# include <stdio. h>

void main ()

char * aplha [6] = ﹛“ABC”,“DEF”,“GHI”,“JKL”,“MNO”,“PQR”﹜;

char **p;

int i;

p = aplha;

for (i = 0; i<4; i++)

printf (“%s”, p[i]);

printf (“\n”);

﹜//这尼玛也是考题。。。。

 

//输出结果

ABCDEFGHIJKL

刚好是字符串数组里面的前四个元素的内容连接起来

 

2、下列程序为什么无法将用户输入的三个整数按从小到大排序输出?应该如何修改?(6分)

# include <stdio.h>

void swap (int x, int y)

int t = x;

x = y;

y = t;

void main ()

{

int a, b, c;

scanf (%d, %d, %da, 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);

}

//函数swap采用值传递,虽然将形参xy交换了,但是并不影响到实参。将值传递改成指针传递就可以了。

C函数参数采用值传递方式,虽然swap函数将形式参数xy的值进行了调换,但是影响不到相应的实在参数。所以在主函数中,通过调用sawp函数调换ab(或ac,或bc)的值是根本达不到目的的。

修改:

1)(2分)

void swap (int *x, int*y)

{

int t = *x;

*x = *y;

*y = t;

}

2)(2分)主函数

ifa>b swap(&a,&b);

ifa>c swap(&a,&c);

ifb>c swap(&b,&c);

 

3、假设系统为基本整型量分配2个字节,为字符型量分配1个字节。下列程序完成的功能是什么?(3分)

# include <stdio. h>

union

  {

int n;

char ch [2];

   }u;

void main ()

{

int m;

scanf (%d”,&m);

u.n = m;

printf (\n%u, %u”,u.ch[0], u.ch[1]);

}

 

//该程序的功能,取用户输入的整数值的高字节和低字节,并按照任意整数的低字节和高字节分别输出。

 

三、程序设计题(12分)

假设一个文本文件中保存着100个整数,请将这100个整数按从小到大的顺序写到另一个文本文件中去,并且在新文件中每10个整数占一行。源文件名和目标文件名通过命令行参数获取。

 

分数分配:

变量定义   2

命令行参数处理  1

文件打开   1

文件读    2

排序    3

文件写    2

文件关闭   1

# include <stdio. h>

void mainint argc, char *argv[]

FILE *fin, *fout;

Int a [100], i, j, t;

ifargc!=3

printf (“ You forgot to enter a filename\n”);

return;

fin = fopen (argv[1], “r”);

fout = fopen (argv[2], “w”);

for (i = 0; i<100; i++)

fscanf (fin, %da[i]);

for (i = 0; i<99; i++)

for (i = 0; i<99i; i++)

if (a[j]>a[j+1])

t = a[j]; a[j] = a[j+1]; a[j+1]=t;

for (i = 0; i<100; i++)

if (i%10 = 0)

fprintf (fout, “%s”, “\n”);

fprintf (fout, “%d”, a[i]);

fclose (fin);

fclose (fout);

C语言程序设计(共30分)

一、单项选择题(在每小题的四个备选答案中,选出一个正确答案。每小题1分,共6分)

1、如果I为整型变量,ffloat型变量,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的值为     

A50    B25   C12.5   D12

//每右移一位除以2,且由于a为整型,结果为整型

4、若c,c1,c2均为字符型变量,下列语句执行后。

c='a';

c1=++c;

c2=c++;

c1,c2的值分别为                     

Ac1='b',c2='c'    Bc1='a', c2='c'      Cc1='b',c2='b'   Dc1='a',c2='b'

//前加加,先加1后使用值,后加加是先使用其值在加加,所以c加加后的值赋予c1c1得值bc2先使用值,再加加,c2得值b

5、以下语句执行后,

   int i,   s=0;

for (i=0;i10;i++)s+=i;

printf   ('%d\n', i);

输出的内容为            

A0       B9    C10         D11

//i值在循环外定义,所以其值循环结束仍有意义,得值10

6、以下c语句执行后,

char s1[100] =I like C 1anguage,s2[100];

strcpy(s2, s1);

strcat (s1, s2);

puts (s2);

输出的内容为              

AI    BI like C language     CI like C language I like C language

DI 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\n",*(a[1]+1));

// a[1]代表是第一行字符串Shanghai,加1后得值第一个字符h的地址,*取出其地址里的值h

printf("%c\n",*(*(a+1)+2));

// *(a+i)=a[i] 代表是第一行字符串Shanghai,加2后得值第2个字符a的地址,*取出其地址里的值

printf("%c\n",*(p1+1));

//p1是一字符指针,加一指向第零行第1个字符e的位置,*取出其地址里的值

printf("%c\n",*(*(p2+1)+2));

//p2为一指向数组的指针,p2是与数组名等价的指针,它指向2维数组的首行,p21指针指向了第一行字串Shanghai,加2后得值第2个字符a的地址,*取出其地址里的值

printf("%s\n",*(p1+1)); 

//打印的从第一个字符开始的第零行余下的字符串eijing

printf("%s\n",*(p2[2]);

//p2[2]指的是第二行,打印第二行字符串Chengdu

printf("%s\n",*(p21)); 

//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;i4;i++

pHead=addItem(pHead,a[i]);

return pHead;

在该函数的for循环前,pHeadNULL;在执行整个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=ppNext;

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;


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值