C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构
- 格式:doc
- 大小:43.00 KB
- 文档页数:11
一、概念题二、判断题1. 结构体中的成员不可以单独使用(F)。
2. 成员名可以与程序中的变量名相同,二者不代表同一对象(T)。
3. 不能将一个结构体变量作为一个整体进行输入输出(T)。
4. 结构体变量所占内存长度是各成员占的内存长度之和(T)。
5. 结构体中的成员不可以单独使用(F )。
9. 一个结构体变量的指针就是该变量所占内存段的起始地址(T)。
10. 用结构体变量作实参,形参也必须是同类型的结构体变量(T )。
三、单选题1. 设变量定义如下,则对其中的结构分量num正确的引用是( )。
struct student {int num ;char name[20];float score;} stud[10];A. stud[1].num=10;B. student.stud.num=10;C. struct.stud.num=10;D. struct student.num=10;2. 已知职工记录描述如下,设变量w中的“生日”是“1993年10月25日”,下列对“生日”的正确赋值方式是()。
struct worker{int no;char name[20];char sex;struct birth{ int day; int month; int year;}a;};struct worker w;A day=25;month=10;year=1993;B w.birth.day=25; w.birth.month=10; w.birth.year=1993;C w.day=25; w.month=10; w.year=1993;D w.a.day=25; w.a.month=10; w.a.year=1993;3. 对于以下的变量定义,语句( )在语法和语义上都是正确的。
struct node {float x,y;char s[10];} point={1,2,”abc”},*p;A. *p=point;B. p=&point;C. point=p;D. p->x=point.y;4. 设有以下语句typedef struct S{ int g;char h;} T;则下面叙述中正确的是()。
《C语⾔程序设计》-何钦铭第⼀章引⾔1.2 程序与程序设计语⾔冯 · 诺依曼模型的存储程序概念:将程序与数据共同存储结构化的程序设计⽅法:将复杂程序划分为若⼲个相互独⽴的模块(⼀个模块可以是⼀条语句、⼀段程序或⼀个函数等)使完成每个模块的⼯作变得单纯⽽明确,在设计⼀个模块时不受其他模块的牵连。
同时,通过现有模块积⽊式的扩展就可以形成复杂的、更⼤的程序模块或程序1.3 C语⾔的发展历史与特点C语⾔的特点:(拥有底层操作能⼒)1.结构化语⾔2.易于移植3.简洁紧凑,使⽤⽅便灵活4.强⼤的处理能⼒5.⽣成的⽬标代码质量⾼,运⾏效率⾼第⼆章⽤C语⾔编写程序2.3 计算分段函数#include <stdio.h> //编译预处理指令程序运⾏时,⾸先从main函数开始运⾏%f指定输出时保留6位⼩数,%.2f则指定输出时保留2位⼩数循环体语句只能是⼀条语句(如果循环体语句由多条语句组成,必须⽤⼤括号把他们括起来,变成⼀条复合语句)整型数据的输出格式控制说明%md,指定了数据的输出宽度为m(包括符号位)。
若数据的实际位数(含符号位)⼩于m,左端补空格;若⼤于m,按实际位数输出实型数据的输出格式控制说明 %m.nf,指定了输出浮点型数据时保留n位⼩数,且输出宽度是m(包括符号位和⼩数点)。
若数据的实际位数(含符号位)⼩于m,左端补空格;若⼤于m,按实际位数输出f是针对浮点型数据⽽⾔,若输出数据为整型,则%m.nf应改为%md赋值运算符左边只能是⼀个变量第三章分⽀结构ch = getchar() //从键盘输⼊⼀个字符,并赋值给变量chputchar(输出参数); //输出参数是字符型变量或字符型常量第四章循环结构else和 if 的匹配准则:else与最靠近它的、没有与别的 else 匹配过的匹配do-while语句:循环条件需要在循环体中明确,且⾄少会执⾏⼀次循环体do {循环体语句} while (表达式);//判断⼀个数是否为素数#include <stdio.h>int main() {int i,m;printf("Enter a number:");scanf("%d", &m);for(i=2;i<=m/2;i++)if(m%i==0)break; //若m能被某个i整除,则m不是素数,提前结束循环if(i>m/2 && m!=1) //若循环正常结束,说明m不能被任何⼀个i整除printf("%d is a prime number! \n", m);elseprintf("No! \n");return 0;}break语句强制循环结束,不再执⾏循环体中位于其后的其他语句,break语句应该和if语句配合使⽤,即条件满⾜时,才执⾏break跳出循环;否则若break⽆条件执⾏,意味着永远不会执⾏循环体中break后⾯的其他语句continue语句:跳过循环体中continue后⾯的语句,继续下⼀次循环,continue语句⼀般也需要与if语句配合使⽤break语句和continue语句的区别在于,break结束循环,⽽continue跳过后⾯语句继续循环。
第9章补充习题及答案习题9.1 选择题(1)设int i,*p= &i;以下语句正确的是。
A.*p=10; B.i=p; C.i=*p; D.p = 2*p+1;(2)设char chStr[10],*pStr=chStr; 以下语句不正确的是。
A.pStr= chStr +5; B.chStr=pStr+ chStr;C.chStr [2]=pStr [4]; D.*pStr = chStr [0];(3)以下程序的执行结果是。
#include "stdio.h"void main(){ int iA[ ]={1,2,3,4,5,6};int *pInt;pInt = iA;*(pInt+3)+=2;printf("%d,%d\n",*pInt,*(pInt+3));}A.1,3 B.1,6 C.3,6 D.1,4 (4)以下fnMycomp()函数的功能是按词典顺序比较两个字符串chStr1和chStr2的大小。
如果chStr1大于chStr2,则返回正值;等于则返回0;小于则返回负值。
请选择正确的编号填空。
int fnMycomp(char *chStr1,char *chStr2){for( ; chStr1==chStr2; )if(*chStr1== '\0')return (0);return (*chStr1-*chStr2);}A.chStr1++ B.chStr2++C.chStr1++;chStr2++ D.chStr1++,chStr2++ (5)以下fnMycopy()函数的功能是将两个字符串chStr1和chStr2连接起来。
请选择正确的编号填空。
void fnMycopy(char *chStr1, char *chStr2){char *pStr=chStr1;while(*chStr1) ① ;while(*chStr2){*chStr1= ② ;chStr1++;chStr2++;}*chStr1 = '\0';③ ;}① A.chStr1-- B.chStr1++ C.chStr1D.*chStr1② A.*chStr2 B.chStr2 C.chStr2--D.*chStr2++③ A.return (chStr1) B.return (chStr2)C.return(pStr) D.return(pStr-chStr2)9.2 填空题(1)以下程序的执行结果是。
第9章结构【练习9-1】定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个部分。
解答:struct complex{float real;float imaginary;};【练习9-2】人的出生日期由年、月、日组成,请在例 9-1 中的通讯录结构中增加一个成员:出生日期,用嵌套定义的方式重新定义该结构类型。
解答:struct date{int year;int month;int day;};struct student{int num;char name[10];struct date birthday;int computer,english,math;double average;};【练习9-3】例 9-1 中,如果要计算的是三门课程的课程平均成绩,应该如何改写程序?解答:#include<>struct student{int num;char name[10];int computer,english,math;double average;};int main(void){int i, n;double math_sum,english_sum,computer_sum;struct student s1;printf("Input n:");scanf("%d", &n);printf("Input the student's number, name and course scores:\n"); math_sum=english_sum=computer_sum=0;for(i=1;i<=n;i++){printf("No.%d:",i); scanf("%d%s%d%d%d",&,,&,&,&;math_sum+=;english_sum+=;computer_sum+=;}printf("math_ave:%.2lf\nenglish_ave:%.2lf\ncomputer_ave:%.2lf\n", math_sum/n,english_sum/n,computer_sum/n);return 0;}【练习9-4】定义一个包含 5 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。
解答:struct student{int num;char name[10];int computer, english, math;};struct student s[5]={{30101, "张一",69,75,84 },{30132, "李二",80,8 5,90},{40231, "王三",71,91,74},{40754, "赵四",65,76,87},{50426, "刘五",81,92,73}};【练习9-5】参考例 9-2,输入并保存 10 个学生的成绩信息,分别输出平均成绩最高和最低的学生信息。
解答:#include<>struct student{int num;char name[10];int computer,english,math;double average;};int main(void){int i,n,max,min;struct student students[50];printf("Input n:");scanf("%d",&n);for(i=0;i<n;i++){printf("Input the info of No.%d:\n",i+1);printf("number:");scanf("%d",&students[i].num);printf("name:");scanf("%s",&students[i].name);printf("math score:");scanf("%d",&students[i].math);printf("english score:");scanf("%d",&students[i].english);printf("computer score:");scanf("%d",&students[i]puter);students[i].average=(students[i].math+students[i].english+stu dents[i]puter)/;}max=min=0;for(i=1;i<n;i++){if(students[max].average<students[i].average) max=i;if(students[min].average>students[i].average) min=i;}printf("max_average_infortmation:\n");printf("number:%d,name:%s,math:%d,english:%d,computer:%d,average: %.2lf\n",students[max].num,students[max].name,students[max].math,stud ents[max].english,students[max]puter,students[max].average);printf("min_average_information:\n");printf("number:%d,name:%s,math:%d,english:%d,computer:%d,average: %.2lf\n",students[min].num,students[min].name,students[min].math,stud ents[min].english, students[min]puter, students[min].average);return 0;}【练习9-6】定义一个 struct student 类型的结构指针,用其实现一个学生信息的输入和输出。
解答:struct student{ /* 学生信息结构定义 */ int num; /* 学号 */char name[10]; /* 姓名 */int computer, english, math ; /* 三门课程成绩 */double average; /* 个人平均成绩 */}s, *p;p = &s;scanf("%d%s%d%d%d", &p->num, p->name, &p->math, &p->english, &p->computer);【练习9-7】改写例 9-3 中的函数 update_score( ),将第一个形参改为结构数组形式。
解答:int update_score(struct student s[],int n,int num,int course,int score) {int i,pos;for(i=0;i<n;i++)if(s[i].num==num)break;if(i<n){switch(course){case 1:s[i].math=score; break;case 2:s[i].english=score; break;case 3:s[i]puter=score; break;}pos = i;}elsepos = -1;return pos;}习题9一、选择题1.下面定义结构变量的语句中错误的是 D 。
A.struct student{ int num; char name[20]; } s;B.struct { int num; char name[20]; } s;C.struct student{ int num; char name[20]; }; struct student s; D.struct student{ int num; char name[20]; }; student s;2.如果有定义语句:struct {int x, y; } s[2] = { { 1, 3 }, { 2, 7 } };则语句:printf(“%d\n”, s[0].y/s[1].x ); 输出结果为 B 。
A.0 B.1 C.2 D.33.根据下面的定义,能打印出字母 M 的语句是 C 。
struct person{char name[10];int age;} c[10] = { “John”, 17, “Paul”, 19, “Mary”, 18, “Adam”, 16 };A.printf(“%c”, c[3].name); B.printf(“%c”, c[3].name[1]);C.printf(“%c”, c[2].name[0]); D.printf(“%c”, c[2].name[1]);4.设有如下定义,则对 data 中的 a 成员的正确引用是 B 。
struct sk{ int a; float b; } data, *p=&data;A.(*p). B.(*p).aC.p-> D.5.对于以下结构定义,(*p)->str++中的++加在 D 。
struct { int len; char *str; } *p;A.指针 str 上 B.指针 p 上C.str 指向的内容上 D.语法错误二、填空题1.“.”称为成员_(分量)_运算符,“->”称为_指向_运算符。
2.完成下列程序,该程序计算 10 名学生的平均成绩。
#include <>#include <>struct student {int num;char name[20];int score;};struct student stud[10];int main(void){int i , sum = 0 ;for(i = 0; i < 10; i++){scanf("%d%s%d ",&stud[i].num,_stud[i].name_,&stud[i].score);sum += stud[i].score;}printf("aver = %d \n", sum/10);return 0;}3.下列程序读入时间数值,将其加 1 秒后输出,时间格式为:hh: mm: ss,即小时:分钟:秒,当小时等于 24 小时,置为 0。