C语言程序设计项目教程习题答案

更新时间:2023-03-08 06:35:50 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言程序设计项目教程—

习题答案

说明:本文档在“文档结构图”视图方式下应用比较方便。

第1章 第2章 第3章 第4章 第5章 第6章 第7章 第8章 第9章

第1章

1. 什么是软件?软件有哪些特点?

答:软件是程序、数据及其相关文档的完整集合。 软件具有以下特点:

① 软件是一种逻辑产品,它以程序和文档的形式出现,保存在计算机的存储器中(磁盘或光盘),通过计算机的运行才能体现它的功能和作用。 ② 软件产品的生产主要是研制。

③ 软件产品不会用坏,不存在磨损、消耗的问题,但是软件在使用过程中,往往需要根据用户需求变化或软硬件环境的变化对软件进行修改,这种修改被称为软件维护。 ④ 软件产品的生产主要是脑力劳动。

⑤ 软件的费用是不断增加的,软件成本相当昂贵。

2. 什么是软件工程?

答:软件工程是一门用工程化方法,指导计算机软件开发和维护的学科,它采用工程的概念、原理、技术和方法来开发、维护以及管理软件。 3. 什么是软件生命周期?软件生命周期包括哪些阶段?

答:软件生命周期是指从开发软件概念的提出起,直到该软件的使用、失去使用价值而被废弃的整个过程,也可以称作软件生存周期。

软件生命周期包括可行性研究与计划制订、需求分析、软件设计、软件实现、软件测试、运行与维护。

4. 什么是软件开发模型?

答:软件开发模型是软件开发全部过程、活动和任务的结构框架。 5. 写出数据结构的概念。

答:数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,是计算机存储、组织数据的方式。数据结构主要研究和讨论数据的逻辑结构、存储结构和数据的运算。 6. 填空:

⑴ 数据结构包括逻辑结构、存储结构和数据的运算三个方面。 ⑵ 据结构的逻辑结构包括 线性结构和非线性结构两大类。

⑶ 据结构的存储结构包括顺序存储结构、 链式存储结构、 索引存储结构和 散列存储结构四类。

⑷ 表是一种采用 链式 存储结构的线性表。 7. 什么是算法?算法有哪些特性?

答:算法是解决问题所采取的步骤和方法。算法具有以下特性:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。

8. 什么是算法的时间复杂度?什么是算法的空间复杂度?

答:时间复杂度是指执行算法所耗费的时间。空间复杂度是指算法在计算机内执行时所占用的内存开销规模。 9~12. DCDA

13. 分别用流程图、N-S图描述以下问题的算法。

(1)输入一个年份,判断是否为闰年。

提示:闰年的判断条件为:①能被4整除,但不能被100整除;②能被400整除。满足两个条件之一,即为闰年。

(2)从键盘输入三个不等的整数,输出最大值。

(3)计算并输出5!。一.选择题

返回

第2章

1.什么是程序?什么是程序设计?

答:程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合。程序设计是指设计、编制、调试程序的方法和过程。 2.程序设计包括哪三个部分?

答:程序设计包括三个部分:输出结果、计算方法、原始数据。 3.结构化程序设计的原则有哪些?

答:结构化程序设计的原则是自顶向下、逐步求精、模块化,以及避免使用goto语句。 4~8.BBDBD

返回

第3章

一.选择题

1~20 ADCAB CADAC DCBAA DCDBA

二.填空题

21 a=a+(a+b) 22 3

23 printf(\24 201632 25 1B 26 1217 27 abc 28 11

29 for(i=10;i<100;i++)printf(“*”); 30 20

三、编程

1.输入圆柱体的底面半径和高,求圆柱体的体积。

#include \main() { float r,h,v; printf(\输入圆柱体的底面半径和高(用空格隔开):\ scanf(\ v=3.14*r*r*h; printf(\圆柱体体积为:%.2f\}

2.如果一个数恰好等于它的因子之和,则称该数为“完全数”。注意:一个数的因子不包括它自身,如6的因子为1,2,3,6就是一个完全数。求1~100之间的“完全数”。

#include \main() { int x,i,s; for(x=1;x<=100;x++) { s=0; for(i=1;i

}

if(x

for(j=N; j>i; j--) a[j] = a[j-1]; /*移动后面的数*/ a[i] = x; /*将新数放在i号位置上*/ printf(\插入新数据后的数据序列:\for(i=0;i

6.输入一串字符,将其中小写字母全部转换为大写字母,其它字符保持不变。

#include\

#define MAX 80 /*字符串的最大字符数*/ void main() { int i=0; /*数组下标*/ char str[MAX]; printf(\请输入原字符串:\ gets(str); while(str[i]) { if(str[i]>='a' && str[i]<='z')str[i]-=32; /*小写字母转为大写*/ i++; } printf(\转换后的字符串:\ puts(str); }

7.输入3×3的矩阵,输出两对角线数据之和。

#include\

#define M 3 /*矩阵规模*/ void main() { int i,j; /*循环控制变量*/ int a[M][M]; int sum=0; printf(\输入%d个数(空格或回车间隔),构成%d×%d的矩阵\\n\ for(i=0;i

}

}

printf(\矩阵:\\n\for(i=0;i

printf(\对角线之和:\ printf(\

8.编程:输入一段英文文章,统计并输出所有英文字母和空格出现的次数。

#include\

#define M 27 /*要统计的所有字符的数量*/ #define MAX 80 /*英文文章的最大字符数*/ void main() { int i=0; /*数组下标*/ int k;/*循环控制变量*/ int count[M]={0};/*存储各字符个数*/ char str[MAX];/*存储英文文章*/ printf(\请输入一段英文文章:\\n\ gets(str); while(str[i]) { if(str[i]>='a' && str[i]<='z') count[str[i]-96]++; if(str[i]>='A' && str[i]<='Z') count[str[i]-64]++; if(str[i]==' ') count[0]++; i++; } printf(\字符\\t个数\\n\ printf(\空格\\t%d\\n\ for(k=0;k

第5章

1.ex/st/struct st均可 2.D 3.D

4.有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据并依次输出各门课的平均成绩。

#include struct stu{ char xuehao[10]; char xingming[10]; float chengji[3]; //三门课成绩 }

main() { struct stu s[10]; int i,j; float average[3]={0}; for(i=0;i<10;i++) { printf(\请输入第%d名学生学号:\ scanf(\ printf(\请输入第%d名学生姓名:\ scanf(\ for(j=0;j<3;j++) { printf(\请输入该名学生的第%d门课程成绩:\ scanf(\ } printf(\ } printf(\名学生信息输入完毕,各门课程平均成绩如下:\\n\ for(i=0;i<10;i++) { average[0]+=s[i].chengji[0]; average[1]+=s[i].chengji[1]; average[2]+=s[i].chengji[2]; }

}

printf(\该10名学生三门各平均成绩分别为:\\n\

printf(\

5.编写一个统计宿舍成员生活费情况的程序,完成以下功能:输入每个宿舍成员一个学期各个月的生活费,计算出该宿舍所有成员本学期的总月平均生活费,以及个人月平均生活费高于总月平均生活费的成员的数据(包括姓名、各月的生活费、平均生活费),并将结果输出。

#include

#define RENSHU 5//宿舍成员人数 struct stu{ char xingming[10]; float shenghuofei[5]; //5个月生活费 float pingjun; //个人月平均生活费 }

main() { struct stu s[RENSHU]; float zongpingjun; //总平均月生活费 int i,j; zongpingjun=0; //初始化总成月平均生活费为0 for(i=0;i

}

for(i=0;izongpingjun) printf(\ getch();

6.编程计算今天是今年的第几天,要求使用包含“年”、“月”、“日”的结构体类型实现。

/*闰年:1、能被4整除而不能被100整除;2、能被400整除*/ #include struct date{ int year; int month; int day; }

main() { struct date today; int flag,day; printf(\请输入今天的日期(yyyy,mm,dd):\ scanf(\ flag=today.year%4==0&&today.year0!=0||today.year@0==0; day=(today.month>1)*31+(today.month>2)*(flag+28)+(today.month>3)*31+ (today.month>4)*30+(today.month>5)*31+(today.month>6)*30+ (today.month>7)*31+(today.month>8)*31+(today.month>9)*30+ (today.month>10)*31+(today.month>11)*30+today.day; printf(\今天是今年的第%d天。\\n\}

7.中国有句俗语叫“三天打渔两天晒网”。某人从2000年1月1日起开始“三天打渔两天晒网”,编写程序计算这个人在以后的某一天中是在打渔还是在晒网。

/*闰年:1、能被4整除而不能被100整除;2、能被400整除*/ #include struct date{ int year; int month; int day; }

/*核心算法:计算出从2001.1.1至今的总天数,与5进行取余运算,余数为1、2、3为打鱼,余数为4、0为晒网*/ main() { struct date today;

}

int i,flag,totalday=0;//totalday为指定日期距2000.1.1总天数 printf(\请输入2000年后的任意日期(yyyy,mm,dd):\scanf(\for(i=2000;i<=today.year;i++) { /*如果当前today>i,则计算i年全年天数,否则计算当前日期之前天数*/ flag=i%4==0&&i0!=0||i@0==0; if(today.year>i) { totalday+=365+flag; } else { totalday+=(today.month>1)*31+(today.month>2)*(flag+28)+(today.month>3)*31+ (today.month>4)*30+(today.month>5)*31+(today.month>6)*30+ (today.month>7)*31+(today.month>8)*31+(today.month>9)*30+ (today.month>10)*31+(today.month>11)*30+today.day; } }

switch(totalday%5) { case 0: case 4:printf(\晒网\ default:printf(\打鱼\}

8.编写程序,定义一个结构体变量,存放一个人的名字和他的电话号码(可能包括手机,办公电话,宅电等多个)。该程序允许输入多个人的名字和对应的电话号码,提示:通过结构数组实现。当输入名字已经存在时,直接输出与这个名字对应的所有号码。最后输出所有的名字以及他们对应的号码。

#include #include #include struct tongxunlu{ char xingming[10]; char shouji[15]; char jiating[15]; };

main() { struct tongxunlu xinxi[50]; char go; int i=0,j,k;

while(1) { printf(\请输入新朋友的姓名 手机号码 家庭电话:\ scanf(\ k=0; for(j=0;j

%s\\t家庭电

9.做一个学籍管理系统的小项目。

〖项目要求〗假设一个学生的信息包括学号、姓名、性别、出生日期和3门课的成绩,其中姓名为字符串,学号为整型,性别为字符型,出生日期为结构体类型(成员为年、月、日),成绩为实型数组。用结构体类型编写学籍管理程序。 #include #include #include struct date{ int year; int month; int day; };

struct stuinfo{ int xuehao; char xingming[10]; char xingbie;

struct date chushengriqi; float chengji[3]; };

main() { struct stuinfo stu[30]; char c; while(1) { system(\清屏命令*/ printf(\ ☆★ 欢迎使用学籍管理系统 ★☆\\n\\n\\n\ printf(\请选择(1-7) :\\n\ printf(\ printf(\ 1.查询学生学籍信息\\n\ printf(\ 2.修改学生学籍信息\\n\ printf(\ 3.输入学生学籍信息\\n\ printf(\ 4.删除学生学籍信息\\n\ printf(\ 5.保存数据到文件\\n\ printf(\ 6.浏览学生学籍信息\\n\ printf(\ 7.退出\\n\ printf(\ printf(\你的选择是:\ c=getche(); printf(\你选择的是--\ switch(c) { case '1':printf(\查询学生学籍信息\/*查询*/ case '2':printf(\修改学生学籍信息\修改*/ case '3':printf(\输入学生学籍信息\/*添加*/ case '4':printf(\删除学生学籍信息\/*删除*/ case '5':printf(\保存数据到文件\/*保存*/ case '6':printf(\浏览学生学籍信息\/*浏览*/ case '7':return; /*退出*/ default:printf(\错误!\ } printf(\按任意键返回主菜单\\n\ getch(); } getch(); } 返回

第6章

1.在C语言中,函数定义和函数声明分别指什么?

(1)函数的定义:在C程序设计中,将完成指定功能的C代码定义成函数,变成逻辑上一个相对独立的程序单位。函数定义需要指明函数返回值的类型、函数名、函数的形式参数(常简称形参)和函数体(包括说明和定义及语句序列)。

函数定义的格式如下:

类型标识符 函数名( ) 类型标识符 函数名(带有类型说明的参数列表)

{ {

变量定义 变量定义

语句块 语句块

} }

无参函数的定义格式 有参函数的定义格式

(2)函数的声明:C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用。函数声明是一个语句,由函数返回类型、函数名和形参列表组成。

函数声明语句的格式为:

类型 函数名( ); —— 无参函数声明格式 或

类型 函数名(参数类型说明列表); —— 有参函数声明格式

2.在C语言中,函数是否允许嵌套定义?是否允许嵌套调用?

在C语言中,函数不允许嵌套定义,但允许嵌套调用。

3.下面定义了一个函数f,分析函数功能并编写完整的主函数,定义恰当的变量,调用函数f,输出函数的返回值。

double f(double r) {

return 3.141592*r*r; }

#include double f(double r); main( ) { double s,r; scanf(\ s=f(r);

printf(\}

double f(double r) { return 3.141592*r*r; }

4.分析下面定义的函数f的功能,编写完整的主函数,定义恰当的变量并调用函数f。

void f(int n) {

int i;

double s=1;

for(i=1;i<=n;i++) s=s*i;

printf(\}

#include void f(int n); main( ) {

int n;

scanf(\ f(n); }

void f(int n) {

int i;

double s=1;

for(i=1;i<=n;i++) s=s*i;

printf(\}

5.定义一个函数,返回两个数中较大的数,在主函数中通过调用该函数求三个数之中最大的数,并输出。

#include int max(int x,int y); main( ) { int x,y,z; scanf(\ printf(\}

int max(int x,int y) { return (x>y?x:y); }

6.定义两个函数,分别求两个整数的最大公约数和最小公倍数,在主函数中输入两个整数后调用这两个函数,并输出最大公约数和最小公倍数。

#include

int multiple(int x,int y); int divisor(int m,int n); main() { int a,b;

scanf(\

printf(\最大公约数为%d\\n\ printf(\最小公倍数为%d\\n\}

int multiple(int x,int y) { int i,z; for(i=x;i<=x*y;i++) if(i%x==0&&i%y==0) {z=i;break;} return z; }

int divisor(int x,int y) {

int z,i; for(i=y;i>=1;i--) if(x%i==0&&y%i==0) {z=i;break;} return z; }

7.编写一个函数,由参数传入一个字符串,分别统计此串中字母、数字和其他字符的个数,在主函数中输入字符串并显示统计结果。

#include #include int alph,digit,others; void count(char str[]); main( ) {

char text[80];

printf(\输入字符串:\\n\ gets(text);

printf(\字符串是:\ puts(text);

strcat(text,\ alph=0; digit=0; others=0; count(text);

printf(\字母,%d数字,%d其它字符\\n\}

void count(char str[]) {

int i;

for(i=0;str[i]!='\\n';i++) {

if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) alph++;

else if(str[i]>='0'&&str[i]<='9') digit++; else

others++; } }

8.已知Fibonacci数列:

0n?0??Fib(n)??1n?1?Fib(n-1)?Fib(n-2)n??2?定义递归函数求Fib(n),并输出前20项。 #include \int fib(int n); main( ) { int i,n=19; for(i=0;i<=n;i++) printf(\}

int fib(int n) { if (n==0) return 0;

if (n==1) return 1; if (n>1) return fib(n-1)+fib(n-2); }

9.定义函数求f=(n+m)!+n!,m、n均为任意正整数。要求使用递归调用。

#include \ int f(int x); main() { int i,m,n; int sum; printf(\ scanf(\ sum=f(n+m)+f(n); printf(\}

int f(int x) { int i,j; if(x==0||x==1)return 1; else return(x*f(x-1)); }

10.按以下要求编写三个函数:

① 接收职工的姓名和职工号 ② 按职工号由小到大排序

③ 输入一个职工号,输出该工号的职工姓名 在主函数中调用这些函数。 #include \#include \#define N 10 struct message { int num; char name[20]; }sta[N];

void in() { int i; for(i=0;i

void sort() { int i,j; struct message sta1; for(i=0;ista[j].num) {sta1=sta[i];sta[i]=sta[j];sta[j]=sta1;} } }

struct message search(int a) { int i,ma,mi; mi=sta[0].num; ma=sta[N-1].num; while(a!=mi||a!=ma) { if(a<(int)((mi+ma)/2)) ma=(int)((mi+ma)/2); else if(a<(int)((mi+ma)/2)) mi=(int)((mi+ma)/2); else break; } for(i=0;i

main() { int i,num; struct message sta0; printf(\ in(); sort(); printf(\ for(i=0;i

}

printf(\

11.设计程序完成下列公式的计算。

已知 y?f(x,n)

f(x?2.3,n)?f(x?3.2,n?3)2nx2x4nx其中 f(x,n)?1???????1?(n?0) 2!4!(2n)!当x=5.6,n=7时,求y的值。要求通过函数嵌套和递归调用完成计算。

#include \int fatc(int n) { int i; int p=1; for(i=1;i<=n;i++) p=p*i; return p; }

double f(double x,int n) { double sum=1,p=1; int i,s=1; for(i=2;i<=2*n;i+=2) { s=-s; p=p*x*x; sum=sum+s*p/fatc(i); } return sum; }

main() { double y,x=5.6; int n=7; y=f(x,n)/(f(x+2.3,n)+f(x-3.2,n+3)); printf(\ return 0; } 返回

本文来源:https://www.bwwdw.com/article/5lq.html

Top