C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构
- 格式:doc
- 大小:44.00 KB
- 文档页数:11
C语言知识点清单(杭电姚晔整理)第1章基本数据类型和表达式1.1 关键字和标识符标识符(p8)1.2 基本数据类型常用数据类型(p21,p122),字符型数据(p50,p123),原码反码补码(p120),实型数据的存储(p121)1.3 常量和变量常量和变量的定义(p21),整型字符型实型常量与变量(p123)1.4 输入和输出函数printf(p23),scanf(p27),字符型数据的输入和输出(scanf/printf/getchar/putchar/p51/p128),整型数的输入输出(scanf/printf格式控制p125),实型数的输入输出(scanf/printf格式控制p127) 1.5 常用库函数常用数学函数(p28)1.6 运算符和表达式算术运算(p22),赋值运算(p23),关系运算(p25),逻辑运算(p52),位运算(p140),长度运算符(p142),算术表达式(p131),赋值表达式(p133),关系表达式(p134),逻辑表达式(p136),条件表达式(p139),逗号表达式(p139),运算符的优先级与结合性(p142),复合语句(P33),自动类型转换(p130),强制类型转换(p130)第2章控制结构与语句2.1 结构化程序设计数据表达(p5),流程控制(p6),主要语法单位(p9),C语言的特点(p12)2.2 顺序结构顺序控制结构(p6)2.3 选择结构if-else语句(p26,p45),多分支else-if语句(p47,p60),switch语句(p57)2.3 循环结构for语句(p32),while语句(p69),do-while语句(p73),循环嵌套(p79),循环语句的选用(p82) 2.4 转向语句break语句(p59,p75),continue语句(p76)第3章函数3.1 函数的定义函数首部(p97),函数体(p98),函数原型声明(p100),问题分析思想(p105),模块化设计(p106/p239)3.2 函数的调用调用过程(p98),调用形式(p99),参数传递(p99),返回结果(p100,p104)3.3 嵌套与递归函数的嵌套调用(p238),递归函数基本概念(p241),递归程序设计(p244)3.4 函数与变量局部变量和全局变量(p108),变量生命周期(p112),变量存储的内存分布(p113),静态变量(p113),外部变量(p258),静态全局变量(p258),变量的存储类型及作用域(附录p340)第4章数组4.1 一维数组一维数组的定义和引用(p149),一维数组的初始化(p151),一维数组的编程(p152)4.2 二维数组二维数组的定义和引用(p160),二维数组的初始化(p161),二维数组的编程(p162)4.3 字符串字符数组(p167),字符串(p168),字符串处理函数(gets/puts/strcpy/strcat/strcmp/strlen/p203) 4.4 数组与函数数组名作为函数参数(p196),冒泡排序(p199),命令行参数(p273)第5章指针5.1 指针基本知识地址与指针(p181),指针变量的定义(p182),指针的基本运算(p184),指针变量的初始化(p186) 5.2 指针与数组指针、数组和地址的关系(p192)5.3 指针与字符串字符串与字符指针(p201),用指针数组操作多个字符串(p270)5.4 指针数组与多级指针指针数组的概念(p265),指向指针的指针(p266),二维数组的指针形式(p268),5.5 指针与函数指针作为函数参数(p188),指针实现动态内存分配(malloc/free/p209),指针作为函数返回值(p278),指向函数的指针(p278)第6章结构体6.1 结构体的概念结构的定义(p219),结构变量的定义和初始化(p221),结构变量的使用(p223)6.2 结构体数组结构数组操作(p226)6.3 结构体指针结构指针的概念(p229),结构指针做函数参数(p230)6.4 单向链表链表的概念(p285),单向链表的常用操作(p286)第7章文件7.1 文件概述文件的概念(p299),文本文件与二进制文件(p300),文件结构与文件类型指针(p301),文件处理步骤(p304)7.2 打开与关闭文件打开文件(p306),关闭文件(p308)7.3 文件读写函数字符方式读写函数fgetc/fputc(p309),字符串方式读写函数fgets/fputs(p311),格式化方式读写函数fscanf/fprintf(p314),数据块方式读写函数fread/fwrite(p315),文件定位函数rewind/fseek/ftell(p317),检测文件指针状态函数feof/ferror/clearerr(p317)第8章其他知识点8.1 编译预处理文件包含(p249),常用标准头文件(p251),宏基本定义(p247),带参数的宏定义(p248),条件编译(p252)8.2 共用体联合变量(附录p339)8.3 枚举枚举变量(附录p339)。
第4章循环结构【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果是什么?为什么?如果将精度改为 10-3,运行结果有变化吗?为什么?解答:如果对item赋初值0,则程序运行结果是pi=0,因为item为0时不满足while 循环的执行条件,即不执行循环,故 pi 值为 0。
如果将精度改为 10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度变大使得while循环次数减少,必然影响到n的值。
【练习 4-2】运行例 4-2程序时,如果将最后一个输入数据改为-2,运行结果有变化吗?如果第一个输入数据是 -1,运行结果是什么?为什么?解答:如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是一结束标志,不进行统计,故任意一个负数都可以。
如果第一个输入数据是-1,运行结果是:Grade averageis 0,因为第一个输入就是-1,则while循环条件不成立,不执行循环体。
【练习4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数eps, 计算序列1-1/4+1/7-1/10+1/13-1/16+…的值,精确到最后一项的绝对值小于eps (保留6位小数)。
试编写相应程序。
解答:#include <stdio.h>#include <math.h>int main(void){int denominator, flag;double item, s,eps;printf(“Input eps:”);scanf(“%lf”,&eps);flag = 1;denominator = 1 ;item = 1.0;s = 0;while(fabs (item) >= eps) {item = flag * 1.0 / denominator;s = s + item;flag = -flag;denominator = denominator +3;}printf ( “s = %f\n”, s);return 0;}【练习4-4】如果将例4-3程序中的do-while语句改为下列while语句,会影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0){number = number / 10; count ++;}解答:会有影响,因为当输入数据 number 为 0时,上述 while 循环将不执行,count 值仍为 0,故输出为 0,不符合题目要求。
何钦铭《C语言程序设计》(第3版)课后习题参考答案习题11.对C 语言来说,下列标识符中哪些是合法的,哪些是不合法的?total, _debug, Large&Tall, Counter1, begin_解答:合法标识符:total, _debug, Counter1;不合法标识符:Large&Tall, begin_。
2.改写本章1.4 节中的流程图1.2,求1~100 中能被6 整除的所有整数的和。
解答:3.改写本章1.4 节中的程序,求1~100 中能被6 整除的所有整数的和,并在编程环境中验证该程序的运行结果。
解答:#include <stdio.h>int main(void){int i, sum = 0;for(i = 1; i <= 100; i++)if (i % 6 == 0)sum = sum + i;printf("%d", sum);return 0;}4.对于给定的整数n(n>1),请设计一个流程图判别n 是否为一个素数(只能被1 和自己整除的整数),并分析该流程图中哪些是顺序结构、哪些是分支结构与循环结构。
解答:在流程图中,分支结构和循环结构如图1.2 所示,自上而下的2 个实线框和2 个虚线组成了顺序结构。
习题21.求整数均值:输入4 个整数,计算并输出这些整数的和与平均值,其中平均值精确到小数点后1 位。
试编写相应程序。
解答:#include <stdio.h>int main (void){int num1, num2, num3, num4;double average, sum;scanf ("%d%d%d%d", & num1, & num2, & num3, & num4);sum = num1+ num2+ num3 + num4;average = sum / 4;printf ("Sum = %.0f; Average = %.1f\n", sum, average);return 0;}2.阶梯电价:为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50 千瓦时(含50 千瓦时)以内的,电价为0.53 元/千瓦时;超过50 千瓦时的,超出部分的用电量,电价上调0.05 元/千瓦时。
c语言程序设计第三版C语言程序设计第三版是一本面向初学者和中级程序员的教材,它不仅涵盖了C语言的基础知识,还深入探讨了高级编程技巧和最佳实践。
这本书的第三版在前两版的基础上进行了更新和改进,以适应现代编程环境和教学需求。
第一章:C语言简介本章介绍了C语言的历史和特点,包括其结构化编程的特性和在操作系统、嵌入式系统等领域的广泛应用。
同时,也简要介绍了C语言的编译和运行过程。
第二章:C语言基础这一章是C语言编程的入门,涵盖了变量、数据类型、运算符和表达式等基本概念。
通过实例代码,读者可以学习到如何声明变量、进行算术运算和逻辑运算。
第三章:控制结构控制结构是程序流程控制的核心,本章详细介绍了条件语句(if、switch)、循环语句(for、while、do-while)以及跳转语句(break、continue、goto)的使用方法和应用场景。
第四章:函数函数是C语言模块化编程的基础,本章介绍了函数的定义、声明、调用以及参数传递。
此外,还探讨了递归函数和内联函数的概念。
第五章:数组和字符串数组是存储多个数据项的集合,而字符串则是特殊的字符数组。
本章讲解了一维数组、多维数组、字符串的声明、初始化和操作,以及字符串处理函数的使用。
第六章:指针指针是C语言中非常强大的特性,它允许程序员直接操作内存地址。
本章深入讲解了指针的基本概念、指针与数组的关系、指针的算术运算以及函数指针。
第七章:结构体和联合体结构体和联合体是C语言中用于创建复杂数据结构的工具。
本章介绍了如何定义和使用结构体、联合体以及枚举类型,以及它们在实际编程中的应用。
第八章:预处理器预处理器是C语言编译过程中的一个阶段,它处理源代码中的宏定义、文件包含和条件编译等指令。
本章解释了预处理器的工作原理和常用指令。
第九章:文件操作文件操作是程序与外部世界交互的一种方式。
本章介绍了文件的打开、关闭、读写和定位等操作,以及文件指针的使用。
第十章:动态内存分配动态内存分配允许程序在运行时分配和释放内存。
第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<stdio.h>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",&s1.num,,&s1.math,&s1.english,&pu ter);math_sum+=s1.math;english_sum+=s1.english;computer_sum+=puter;}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<stdio.h>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].computer);students[i].average=(students[i].math+students[i].english+stu dents[i].computer)/3.0;}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].computer,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].computer, 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].computer=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.3 3.根据下面的定义,能打印出字母 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).data.a B.(*p).aC.p->data.a D.p.data.a5.对于以下结构定义,(*p)->str++中的++加在 D 。
struct { int len; char *str; } *p;A.指针 str 上 B.指针 p 上C.str 指向的内容上 D.语法错误二、填空题1.“.”称为成员_(分量)_运算符,“->”称为_指向_运算符。
2.完成下列程序,该程序计算 10 名学生的平均成绩。
#include <stdio.h>#include <string.h>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。