C综合练习-4附参考答案

  • 格式:doc
  • 大小:65.50 KB
  • 文档页数:5

C综合练习4 附参考答案(宏,结构体和文件)0.较为复杂的宏定义例题(1)定义一个宏,用于判断所给出的年份y ear是否为闰年:#define LEAP_YEAR(y)解:为闰年的条件是符合下面二者之一:(1)能被4整除,但不能被100整除。

(2)能被4整除,能被400整除。

#define LEAP_YEAR(y) (y%4==0 && y%100!=0)|| (y%400==0 )(2)定义带参数的宏为#define max(a,b) ((a)>(b)?(a):(b))对表达式max(a,max(b,max(c,d))) 作宏替换为(用文字描述):。

解:计算a、b、c、d中的最大值。

表达式是调用宏函数,两个参数分别是a,max(b,max(c,d)),其第二个参数又是一个调用宏函数,参数分别是b,max(c,d)。

(3)定义一个带参数的宏,将两个参数的值交换#define swap(a,b) { double t; }解:t=a; a=b; b=t;(4)定义一个带参数的宏,若变量中的字符为大写字母则转换成小写字母。

解:#define change(c) c=c>='A'&&c<='Z'? c:c+321. 单项选择题1.下面语句的输出结果是________。

#include “stdio.h”printf(“%d %d %d”,NULL,‟\0‟,EOF);A. 0 0 1B. 0 0 -1C. NULL EOFD. 1 0 EOF2.如果二进制文件a.dat已经存在,现要求写入全新的数据,应以________方式打开。

A.“w” B.”wb” C.”w+” D.”wb+”3.有以下的结构体变量定义语句:struct student { int num; char name[9]; } stu;则下列叙述中错误的是( )。

A. 结构体类型名为studentB. 结构体类型名为stuC. num是结构体成员名D. struct是C的关键字4. 若有以下定义struct date { int y,m,d; };struct student{ int num; char name[9]; struct date bir;}stu,*p=&stu;则以下对结构体变量stu成员的引用中错误的是( )。

A. p->bir->yB. p->bir.yC. stu.bir.yD. 5. 若有以下定义struct student { int num; char name[9]; }stu[2]={1,”zhangsan”,2,”lisi”};以下能输出字符串”lisi”的语句是( )。

A. printf(“%s”,stu[0].name);B. printf(“%s”,&stu[1].name);C. printf(“%s”,stu[1].name );D. printf(“%s”,&stu[1].name[0]);6. 有以下定义语句struct node { int n; struct node *next; } x,y,*p=&x,*q=&y;则能将y节点链接到x节点之前的语句为( )。

A. x.next=pB. x.next=qC. y.next=pD. y.next=q7. 已建立一单向链表,指针变量p1指向链表中某一节点,p2指向下一节点,将p2所指节点从链表中删除并释放的语句为( )。

A. p1=p2;free(p2);B. p1->next=p2->next;free(p2);C. *p1.next=*p2.next;free(p2);D. p1=p2->next;free(p2);8. 已建立一单向链表,指针变量p1指向链表中某一节点,p2指向下一节点;指针变量p 指向新申请节点,将p所指节点插入到链表中p1与p2之间的语句为( )。

A. p->next=p2;p1->next=p;B. p1->next=p;p->next=p2C. p=p2;p1->next=p;D. p1=p;p->next=p2;2。

程序阅读题1. 下列程序的输出结果是。

#include <stdio.h>struct st { int num; char name[10]; int age;} x[3]={{1,“zhang”,19},{2,“li”,20},{3,“wang”,21}},*p=x;void main(){ printf(“%s,%d\n”,(p+2)->name,(*p).age); } 解:wang,192.下列程序的输出结果是。

#include <stdio.h>struct ks {int a;int *b;}s[4],*p;void main(){ int n=1,i;for(i=1;i<4;i++){ s[i].a=n;s[i].b=&s[i].a;n+=2;}p=&s[0];p++;printf(“%d,%d\n”,(++p)->a,(p++)->a);}3.程序填空题1.【程序说明】从键盘输入一行字符串(小于80个),将其中所有的小写字母改写后依次输出到c:\bb.txt文件(其他字符不输出)。

改写规则:…a‟改‟b‟,‟b‟改…c‟,…..‟x‟改…y‟ ,…z‟改…a‟.# include<stdio.h>#include<stdlib.h>void main(){ FILE *fp;char str[81];int i=0;if((fp=fopen( ))==NULL){ printf(“can‟t open the file.\n”);exit(0);}gets(str);while(str[i]!=‟\0‟){ if(str[i]>=‟a‟&&str[i]<=‟z‟){if(elsestr[i]=str[i]+1;) ;}i++;}fclose(fp);}2. 【程序说明】当前目录下存放着文本文件from.txt,将其中除数字以外的内容显示在屏幕上。

【程序】#include<stdio.h>#include<stdlib.h>void main(){if(){printf(”Can not open file一>form.txt”);while(!;iffclose(fr);}3. 【程序说明】函数change 完成将结点数大于 1 的链表中最后一个结点链接到链表的最头上,成为链表的第一个结点。

struct student{ char name [ 9 ] ;int cj ;struct student * next ;} ;struct student *change (struct student * h ){ struct student *q, * p ;q=p=h ;while ( p->next != NULL )}p->next = h ;4. 【程序说明】已建立学生“英语”课程的成绩链表(成绩存于score域中,学号存于num域中),下列函数用于输出成绩优秀(>=85分)学生的学号和成绩及成绩优秀的学生人数。

Void require( struct student *head)if(head!=NULL)while(p!=NULL)7d %6.1f\n”,p->num,p->score);x++;} p=p->next;}printf(“%d\n”,x);}}4. 编程题1.有1000个学生,每个学生的数据包挎学号、姓名、三门课的成绩。

数据从键盘输入,要求按各个学生的三门课平均成绩从高分到低分打印出这1000个学生的学号、姓名、以及个人平均成绩。

2.读一个指定的文本文件 -- D:盘根目录下的a.txt文件,显示在屏幕上,如果有大写字母,则改成小写字母在输出,并统计行数输出(注:一行字符以’\n’结尾)。

C综合练习4 (宏,结构体和文件)参考答案1.单项选择题 B B B A C C B A2。

程序阅读题 1. wang,19 2. 5,13. 程序填空题1 “c:\bb.txt”,”w”2 str[i]==‟z‟3 str[i]= …a‟4 str[i],fp5 (fr=fopen(“from.txt”,”r ”))==NULL6 ch=fgetc(fr)7 ch>'9'||ch<'0'8 p=p->next ; 9 h=p ;10 int x=0 11 p=head 12 p->score>=854. 编程题1. #include <stdio.h>struct student{int num; /* 学号*/char name[8]; /* 姓名*/int score[3]; /* 成绩*/float avr; }; /*每人平均成绩*/struct student stud[1000]; /* 定义1000个记录学生信息的结构数组*/void main(){ int i, j, p ; struct student t ; /* 工作变量 *//* 输入1000个学生的记录,包括学号、姓名和三门课成绩,并计算个人的平均分*/ printf(“\nInput the student‟s number,name and scores:”);for(i = 0; i < 1000; i++){ printf(“No %d \n”,i+1); /* 提示输入第i个同学的信息*/scanf(“%d,%s,%d,%d,%d”, &stud[i].num, stud[i].name, &stud[i].score[0],&stud[i].score[1],&stud[i].score[2]);stud[ i ].avr = (stud[i].score[ 0 ]+ stud[i].score[ 1 ]+ stud[i].score[ 2 ]) /3.0 ;} /* 使用选择法排序,按照平均分从低到高排序*/for(i = 0; i < 999; ++i){ p = i;for(j = i + 1; j < 1000; j++ )if(stud[j].avr < stud[p].avr ) p = j ;t=stud[p]; stud[p]=stud[i]; stud[i]=t; }/* 输出*/printf(“The student score:\n”);for(i = 999; i >= 0; i--)printf(“%d %s %f\n”, stud[i].num, stud[i].name, stud[i].avr); }2. #include "stdio.h"#include "stdlib.h"void main(){ FILE *fp; char ch;int line=1;if((fp=fopen(“d:/a.txt”,”r ”))==NULL){printf("File open error!\n");exit(0); }while(!feof(fp)){ch=fgetc(fp);if(ch>='A'&&ch<='Z') ch+=32;putchar(ch);if(ch=='\n') line++; } fclose(fp);printf("总行数%d\n",line); }读出字符和大写转小写处理。