C程序设计谭浩强第五版答案 第三章习题答案
scanf出问题请看:超简单的scanf错误修改
1、假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为p = ( 1 + r ) n p = (1+r)^np=(1+r) n ,其中r为年增长率,n为年数,p为与现在相比的倍数。
#include<stdio.h>
#include <math.h>
int main()
{
float p, r, n;
r = 0.07;
n = 10;
p = pow(1 + r, n);
printf("p=%f\n", p);
return 0;
}
2、存款利息的计算。有1000元,想存5年,可按以下5种办法存:
#include<stdio.h>
#include <math.h>
int main()
{
float r5, r3, r2, r1, r0, p, p1, p2, p3, p4, p5;
p = 1000;
r5 = 0.0585;
r3 = 0.054;
r2 = 0.0468;
r1 = 0.0414;
r0 = 0.0072;
p1 = p*((1 + r5) * 5); // 一次存5年期
p2 = p*(1 + 2 * r2)*(1 + 3 * r3); // 先存2年期,到期后将本息再存3年期
p3 = p*(1 + 3 * r3)*(1 + 2 * r2); // 先存3年期,到期后将本息再存2年期
p4 = p*pow(1 + r1, 5); // 存1年期,到期后将本息存再存1年期,连续存5次
p5 = p*pow(1 + r0 / 4, 4 * 5); // 存活期存款。活期利息每一季度结算一次
printf("p1=%f\n", p1); // 输出按第1方案得到的本息和
printf("p2=%f\n", p2); // 输出按第2方案得到的本息和
printf("p3=%f\n", p3); // 输出按第3方案得到的本息和
printf("p4=%f\n", p4); // 输出按第4方案得到的本息和
printf("p5=%f\n", p5); // 输出按第5方案得到的本息和
return 0;
}
3、购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。设d为300 000元,p为6000元,r为1%。对求得的月份取小数点后一位,对第2位按四舍五人处理。
#include<stdio.h>
#include <math.h>
int main()
{
float d = 300000, p = 6000, r = 0.01, m;
m = log10(p / (p - d*r)) / log10(1 + r);
printf("m = %3.1f\n", m);
return 0;
}
4分析下面的程序:
#include<stdio.h>
int main()
{
char c1, c2;
c1 = 97;
c2 = 98;
printf("c1=%c, c2=%c\n", c1, c2);
printf("c1=%d, c2=%d\n", c1, c2);
return 0;
}
如果将程序第4,5行改为c1 = 197;c2 = 198;会输出:
(3)如果将程序第3行改为int c1, c2;会输出:
5用下面的scanf 函数输人数据,使a=3,b=7,x=8.5,y=71. 82,cl=‘A’,c2=‘a’。在键盘上应如何输入?
#include<stdio.h>
int main()
{
int a, b;
float x, y;
char c1, c2;
scanf("a=%db=%d", &a, &b);
scanf("%f%e",&x, &y);
scanf("%c%c",&c1, &c2);
return 0;
}
6、请编程序将“China"译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China"应译为“Glmre”。请编一程序,用赋初值的方法使cl,c2,c3,c4,c5这5个变量的值分别为’C’,‘h’,‘i’,‘n’,‘a’ ,经过运算,使c1,c2,c3,c4,c5 分别变为’G’,‘l’,‘m’,‘r’,‘e’。分别用putchar函数和printf函数输出这5个字符。
#include<stdio.h>
int main()
{
char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
c1 = c1 + 4;
c2 = c2 + 4;
c3 = c3 + 4;
c4 = c4 + 4;
c5 = c5 + 4;
//使用putchar输出
printf("使用putchar输出: ");
putchar(c1);
putchar(c2);
putchar(c3);
putchar(c4);
putchar(c5);
printf("\n");
//使用printf输出
printf("使用printf输出: %c%c%c%c%c\n", c1, c2, c3, c4, c5);
return 0;
}
7、设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输人数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
float h, r, l, s, sq, vq, vz;
float pi = 3.141526;
printf("请输入圆半径r,圆柱高h∶");
scanf("%f %f", &r, &h); //要求输入圆半径r和圆柱高h
l = 2 * pi * r; //计算圆周长l
s = r * r * pi; //计算圆面积s
sq = 4 * pi * r * r; //计算圆球表面积sq
vq = 3.0 / 4.0 * pi * r * r * r; //计算圆球体积vq
vz = pi * r * r * h; //计算圆柱体积vz
printf("圆周长为: l=%6.2f\n", l);
printf("圆面积为: s=%6.2f\n", s);
printf("圆球表面积为: sq=%6.2f\n", sq);
printf("圆球体积为: v=%6.2f\n", vq);
printf("圆柱体积为: vz=%6.2f\n", vz);
return 0;
}
8.编程序,用getchar函数读人两个字符给c1和c2,然后分别用putchar函数和printf函数输出这两个字符。思考以下问题:
(1) 变量cl和c2应定义为字符型、整型还是二者皆可? (2) 要求输出cl和c2值的ASCII码,应如何处理?用putchar函数还是printf函数? (3) 整型变量与字符变量是否在任何情况下都可以互相代替?如: char c1,c2;与int cl,c2;是否无条件地等价?
int main()
{
int c1, c2;
printf("请输入两个字符c1,c2:");
c1 = getchar();
c2 = getchar();
printf("用putchar语句输出结果为:");
putchar(c1);
putchar(c2);
printf("\n");
printf("用printf语句输出结果为:");
printf("%c %c\n", c1, c2);
return 0;
}
数据结构
数据结构是计算机科学中的一个核心概念,它涉及到计算机中数据的存储、组织和管理方式。以下是关于数据结构的详细解释:
- 定义:
- 数据结构是计算机存储、组织数据的方式。具体地说,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系。
- 要素:
- 数据结构的两个基本要素是:数据元素的集合和关系的集合。数据元素是数据结构的基本单位,而关系则定义了这些元素如何相互关联。
- 分类:
- 数据结构可以按数据元素之间关系的不同进行分类,主要分为四类:
- 集合结构:数据元素属于同一个集合。
- 线性结构:数据元素之间存在着一对一的关系。常见的有链表、队列、栈等。
- 树形结构:数据元素之间存在着一对多的关系。常见的有二叉树、二叉查找树、平衡二叉查找树等。
- 图形结构:数据元素之间存在着多对多的关系。
- 按照存储方式的不同,数据结构可以分为顺序存储结构和链式存储结构:
- 顺序存储结构:数据元素在存储器中是连续存储的,可以用相对位转走来表示数据元素之间的逻辑结构,如顺序表、队列、栈等。
- 链式存储结构:每个数据元素里设置了一个指针用来指向另一个元素的存储地址,以此来表示数据元素之间的逻辑结构。
- 逻辑关系与存储关系:
- 数据的逻辑结构指的是数据元素之间的逻辑关系,而数据的存储结构则指的是数据元素在计算机中的表示和存储方式。这两者密切相关,是设计数据结构时需要考虑的重要因素。
- 应用:
- 数据结构在编程和软件开发中扮演着至关重要的角色。通过选择合适的数据结构,可以提高程序的运行效率、减少存储空间的使用,并使得代码更加清晰、易于维护。数据结构的选择和设计是程序设计的基础和关键。
- 常用数据结构:
- 在实际编程中,常用的数据结构包括数组、链表、栈、队列、树和图等。这些数据结构各有特点,适用于不同的应用场景。例如,数组适用于需要快速访问任意元素的情况,链表适用于需要动态调整元素数量的情况,树和图则适用于表示具有层次或网状关系的数据。
- 设计原则:
- 在设计数据结构时,需要考虑数据元素的特性、操作的需求以及存储空间的限制等因素。设计良好的数据结构应该具有高效性、稳定性和可扩展性等特点,能够满足实际应用的需求。
总之,数据结构是计算机科学中不可或缺的一部分,它涉及到计算机中数据的存储、组织和管理方式。通过学习和掌握数据结构的相关知识,可以更好地理解和应用计算机技术解决实际问题。
数组
数组(Array)是一种重要的数据结构,主要用于存储具有相同数据类型的多个元素的集合。下面我将从多个方面对数组进行详细介绍:
定义与性质
定义:数组是有序的元素序列,用于存储多个相同类型的数据。这些有序排列的同类数据元素的集合称为数组。
性质:
- 定长性:当数组被声明后,空间所能存放的元素个数就是确定的。虽然可以对数组进行扩容操作,但原始数组的大小在声明时就已经确定。
- 连续性:数组在存放时必须在该空间的最前面连续存放,这意味着数组中的元素在内存中是连续排列的。
- 边界检查:数组具有边界检查功能,当索引不在数组范围内时会抛出异常(如C#中的IndexOutOfRangeException或Java中的ArrayIndexOutOfBoundsException)。
分类
- 一维数组:由一组具有相同数据类型的数据按照一定顺序排列而成的线性表。
- 二维数组:由若干个一维数组组成的表格状数据结构,可以看作是一个行列都固定的矩阵。
- 稀疏数组:当数组中大部分元素为0或同一值时,采用压缩存储方式,只记录不同值的元素和其位置,以节省存储空间和提高运算效率。
- 动态数组:在插入或删除元素时可以自动改变大小的一维数组,具有灵活性和高效性。
- 布尔数组:由若干个布尔值组成的数组,可以用来表示某些问题的真值表或状态表。
应用与初始化
- 一维数组:通常用于存储一组具有相同属性的数据。例如,在C语言中可以使用int a[10];声明一个可以存储10个整数的数组。初始化时,可以逐个赋值,也可以一次性赋值(如int a[10] = {0, 1, 2, …};)。
- 二维数组:常用于表示表格或矩阵形式的数据。在C语言中,可以使用int a[3][4];声明一个3行4列的二维数组。初始化时,可以分行赋值(如int a[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};)。
注意事项
- 在使用数组时,要注意不要越界访问,即不要使用超出数组范围的索引。这可能会导致程序崩溃或产生不可预料的结果。
- 在声明数组时,要根据实际需要选择合适的大小。过大的数组可能会浪费内存空间,而过小的数组则可能无法满足存储需求。
- 在某些编程语言中(如C++和Java),数组的大小可以是动态的,即可以在运行时根据需要调整数组的大小。但在某些其他编程语言中(如C),数组的大小在声明时就必须确定,并且之后不能更改。
总结
数组是一种非常重要的数据结构,在编程中有着广泛的应用。通过合理地使用数组,可以高效地处理大量具有相同类型的数据,提高程序的运行效率。同时,也要注意在使用数组时遵守相关的规则和注意事项,以确保程序的正确性和稳定性。
链表
链表是一种物理存储单元上非连续、非顺序的存储结构,其特点是通过链表中的指针链接次序来实现数据元素的逻辑顺序。以下是关于链表的详细介绍:
链表的基本概念
链表由一系列结点(链表中每一个元素称为结点)组成,这些结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表的特点
动态分配:链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。结点可以在需要时动态生成,不需要预先知道数据的大小。
插入和删除效率高:由于链表在物理存储上不是连续的,因此在进行插入和删除操作时,不需要移动大量元素,从而达到较高的效率。特别是在链表头部进行插入和删除操作时,时间复杂度可以达到O(1)。
顺序访问:链表只能从头结点开始,顺序访问每个结点,直到找到目标数据或遍历完整个链表。因此,访问链表中的特定元素或查找某个元素可能需要O(n)的时间复杂度。
空间开销:由于每个结点都需要存储指向下一个结点的指针,因此链表的空间开销相对较大。
链表的类型
链表有多种类型,包括单向链表、双向链表和循环链表等。其中,单向链表是最简单的形式,每个结点只有一个指向下一个结点的指针;双向链表则每个结点有两个指针,分别指向前一个结点和后一个结点;循环链表则是尾结点的指针指向头结点,形成一个环状结构。
链表的应用场景
链表在计算机科学中被广泛应用于各种场景,如文件系统的目录结构、网页浏览器的历史记录、电话簿中的联系人列表、音乐播放器的播放列表以及操作系统的进程管理等。这些应用场景都充分利用了链表动态分配、插入和删除效率高的特点。
总结:链表作为一种重要的数据结构,在实际应用中具有广泛的用途。它克服了数组需要预先知道数据大小的缺点,实现了灵活的内存动态管理。然而,链表也失去了数组随机读取的优点,并且在空间开销上相对较大。因此,在选择使用链表还是其他数据结构时,需要根据具体的应用场景和需求进行权衡。