谭浩强C语言程序设计第三章题目

第三章:顺序程序设计,按照顺序执行的程序设计。

友情提示:有的题目可能没写,因为我感觉没必要,还有就是下面的所有回答专业性的名词解释使用人工智能或Baidu的,程序是完全自己写的,主要是用来记笔记方便以后复习用的,希望对大家有帮助,共勉!

题目1:假如我国国民生产总值的年增长率为7%,计算 10年后我国国民生产总值与现在相比增长多少百分比。

计算公式为p = (1+r)^n

其中参数r为年增长率,n为年数,p为与现在相比的倍数。

分析:

        根据题目给的计算公式计算就行了,有个幂运算可以借助math.h头文件中的pow(double _X,double _Y);函数即可,值得注意的是题目求的是增长了多少百分比而不是简单地求倍数。

#include<stdio.h>
#include<math.h>//包含幂运算的函数pow()的头文件
​
int main(){
​
    double r = 0.07;//年增长率
    int n = 10;//年数
    double p;//增长的倍数
    double grow_percentage;//增长的百分比
​
    //根据题目计算增长的倍数
    p = pow(1 + r,n);
​
    //计算增长的百分比
    //减1操作是为了从倍数中移除基础值(即1倍),从而得到实际的增长部分
    //因为p是未来的值(比如是10年后的国民生产总值)与现在的值相比的倍数。
    //由于现在的值被视为1倍(即没有增长的情况)
    //所以减去1就代表了真正的增长的倍数
    grow_percentage = (p - 1) * 100;
​
    //.2表示保留两位小数
    printf("增长的倍数为:%.2f\n",p);
    printf("增长了:%.2f的百分比\n",grow_percentage);
​
    return 0;
}

题目2:存款利息的计算。有1000元,想存5年,可按以下5种办法存:

(1)一次存5年期

(2)先存2年期,到期后将本息再存3年期

(3)先存3年期,到期后将本息再存2年期

(4)存1年期,到期后将本息再存1年期,连续存5次

(5)存活期存款,活期利息每一季度结算一次

2017年银行存款利息如下:

1年期定期存款利息为1.5%;

2年期定期存款利息为2.1%;

3年期定期存款利息为2.75%;

5年期定期存款利息为3%;

活期存款利息为0.35%(活期存款每一季度结算一次利息)

如果r为年利率,n为存款年数,则计算本息的公式如下:

1年期本息和: P= 1000* (1+r);

n年期本息和: P= 1000* (1+n* r);

存n次1年期的本息和: P=1000* (1+r)^n

活期存款本息和: P= 1000 *(1+r /4) ^4

说明: 1000 * (1+r /4)是一个季度的本息和。

#include<stdio.h>
#include<math.h>
​
int main(){
​
    double deposit = 1000.0; //存款金额
​
    //年利率
    double rate1 = 0.015;//1年期定期存款利息
    double rate2 = 0.021;
    double rate3 = 0.0275;
    double rate5 = 0.03;
    double liverate = 0.0035;//活期存款利息
​
    //本息和
    double P1, P2, P3, P4, P5;
​
    //(1)一次存5年期
    P1 = deposit * (1 + 5 * rate5);
    printf("一次存5年期的本息和为:%.2f\n", P1);
​
    //(2)先存2年期,到期后将本息再存3年期
    P2 = deposit * (1 + 2 * rate2);
    //要使用2年期过后的本息进行再次计算
    P2 = P2 * (1 + 3 * rate3);
    printf("先存2年期,到期后将本息再存3年期的本息和为:%.2f\n", P2);
​
    //(3)先存3年期,到期后将本息再存2年期
    P3 = deposit * (1 + 3 * rate3);
    P3 = P3 * (1 + 2 * rate2);
    printf("先存3年期,到期后将本息再存2年期的本息和为:%.2f\n", P3);
​
    //(5)存1年期,到期后将本息再存1年期,连续存5次
    P4 = deposit * pow((1 + rate1), 5);
    printf("存1年期,到期后将本息再存1年期,连续存5次的本息和为:%.2f\n", P4);
​
    //存活期存款,活期利息每一季度结算一次
    P5 = deposit * pow((1 + rateCurrent / 4), 4 * 5);
    printf("存活期存款,活期利息每一季度结算一次的本息和为:%.2f\n", P5);
​
    return 0;
}

题目3:购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。设d为300000元,p为6000元,r为1%。对求得的月份取小数点后一位,对第2位按四舍五人处理。

提示:

#include<stdio.h>
#include<math.h>
​
int main(){
​
    //贷款d
    double d = 300000.0;
    //每月还款额
    double p = 6000;
    //月利率
    double r = 0.01;
​
    //还清月数
    double m;
​
    m = log10(p / (p - d * r)) / log10(1 + r);
​
    //%.1f 格式说明符会自动进行四舍五入,保留一位小数。
    printf("还款月数为:%.1f",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;
}

(1)运行时会输出什么信息?为什么?

会输出:

原因:

        在ASCII编码中,97和98分别对应字符'a'和'b'。

        所以当使用%c格式化输出字符时,会打印出'a'和'b'。

        而当使用%d来格式化输出时,会打印出它们的整数值,即97和98。

(2)如果将程序第4,5行改为c1 = 197;c2 = 198;运行时会输出什么信息?为什么?

会输出:

原因:

        第一行的输出是因为打印 char 类型的值时,超出范围的值并不能在 ASCII 表中找到对应的字符,所以打印出来的字符可能会有所不同,取决于各自电脑系统和编码设置。

        第二行的输出是因为char类型通常是有符号的,它的取值范围通常是-128到127。这是因为char类型占用一个字节,也就是8位,可以表示的整数范围是0到255 (2^8),但是当我们把它作为有符号整数处理时,取值范围就变成了-128到127。然后输出197和198的话会溢出,在这种情况下,C语言会进行所谓的"模运算",结果将是这些值减去256(也就是2的8次方,因为char类型是8位的)。所以,197变成了-59(197-256),198变成了-58(198-256)。

(3)如果将程序第3行改为int c1, c2;运行时会输出什么信息?为什么?

会输出:

原因:

        第一行输出的两个字符可能会是乱码或者空白,因为197和198在ASCII表中并没有对应的字符。

        然而,当你使用%d格式输出时,c1c2的值将被正确地显示为197和198,因为现在它们是int类型,可以完全支持这个范围内的值。

题目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;
}

分析:

        首先,对于整数a和b,需要按照 "a=3b=7" 的格式进行输入,注意,这里没有空格。

        其次,对于浮点数x和y,%e确实代表科学记数法的输入。所以,需要将71.82转换为科学记数法,即7.182E1。所以输入 "8.57.182E1"(没有空格)。

        最后,对于字符c1和c2的输入,我们需要确保输入的两个字符之间没有任何空格,因为scanf会自动将空格作为字符串的结束。输入Aa.

输出:

题目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个字符。

分析:

        赋初值之后,直接对相应的字符+4即可实现本题的要求,但是这个方法有个不足之处可以看下面的注意。

#include<stdio.h>

int main()
{
    char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
    c1 += 4;
    c2 += 4;
    c3 += 4;
    c4 += 4;
    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;
}

注意:但是有没有注意一个问题,上面这个程序如果是W、w、X、x、Y、y、Z、z怎么办呢,当然不会报错,只是会得到你不想得到的东西。比如如下程序可能会输出的值。

    char c1 = 'C', c2 = 'W', c3 = 'x', c4 = 'y', c5 = 'z';

    c1 += 4;

    c2 += 4;

    c3 += 4;

    c4 += 4;

    c5 += 4;

输出:(注意:第二行是使用printf输出的,写错了)

原因:

        因为W的ASCII码为87,所以单纯的+4之后会变成左括号,因为左括号[的ASCII码为91,其余的也是一样的。

解决方法:像数据结构中的”循环队列”一样(数据结构可以看我后面关于数据结构的章节,后面会抽空更新)

#include <stdio.h>

int main() {

    char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';

    //法一(不推荐):比较复杂的方法(就是下面法二的分开写的版本),
    //很麻烦,不使用for循环就得为每一个字符写下面这4份代码
    //1.首先将要转换的字符转成0-25之间的数字
    // int offset = c1 - 'A';
    //2.然后将数字向后移动4位
    // offset += 4;
    //3.如果移动位数超过26,就从0开始
    // offset %= 26;
    //4.最后将数字转回字母
    // c1 = offset + 'A';
    
    //法二(推荐):一步到胃
    //c1 - 'A':这个操作是为了将字符转换成一个从0开始的数字,以便我们可以在0到25的范围内进行计算。
    //+ 4:这是将字符向后移动4位。
    //% 26:这个操作是为了在移动位数超过26(字母表的长度)时,能够从头开始计算,也就是循环队列的概念。
    //+ 'A':最后再加上 'A',是为了把计算结果转换回字母。
    c1 = (c1 - 'A' + 4) % 26 + 'A';
    //同上
    c2 = (c2 - 'a' + 4) % 26 + 'a';
    c3 = (c3 - 'a' + 4) % 26 + 'a';
    c4 = (c4 - 'a' + 4) % 26 + 'a';
    c5 = (c5 - 'a' + 4) % 26 + 'a';

    printf("使用putchar输出: ");
    putchar(c1);
    putchar(c2);
    putchar(c3);
    putchar(c4);
    putchar(c5);
    putchar('\n');

    printf("使用printf输出: %c%c%c%c%c\n", c1, c2, c3, c4, c5);

    return 0;
}

题目7:设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输人数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。

基础题,不多说了,知道公式就行

#include <stdio.h>
#define PI 3.14159

int main() {
    float r, h;
    printf("请输入圆的半径和圆柱的高:");
    scanf("%f %f", &r, &h);

    float circumference = 2 * PI * r;
    float area = PI * r * r;
    float sphereSurfaceArea = 4 * PI * r * r;
    float sphereVolume = (4.0 / 3) * PI * r * r * r;
    float cylinderVolume = PI * r * r * h;

    printf("圆的周长是:%.2f\n", circumference);
    printf("圆的面积是:%.2f\n", area);
    printf("圆球的表面积是:%.2f\n", sphereSurfaceArea);
    printf("圆球的体积是:%.2f\n", sphereVolume);
    printf("圆柱的体积是:%.2f\n", cylinderVolume);

    return 0;
}

题目8:编程序,用getchar函数读人两个字符给c1和c2,然后分别用putchar函数和printf函数输出这两个字符。思考以下问题:

这里要注意:题目说的是将getchar的返回值给c1和c2


(1) 变量cl和c2应定义为字符型、整型还是二者皆可?

答:

        应定义为整型(int),确保能够存储getchar函数返回的所有可能值(因为getchar函数返回的是一个整型),包括字符和特殊的EOF标志,从而避免潜在的符号和范围问题(如果getchar的返回值为1000,完全超过了char所能表示的范围就会造成范围问题)。

(2)输出cl和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?

        要输出 c1 和 c2 值的 ASCII 码,可以使用 printf 函数,因为它允许你以多种格式输出数据,包括整数(ASCII 码值)。使用%c可输出字符本身,使用%d可输出字符的ASCII码。

  然而 putchar 函数通常用于输出字符本身,而不是它们的 ASCII 码值。

#include <stdio.h>  
  
int main() {  
    int c1;
      
    c1 = getchar();  
      
    //输出c1的ASCII码  
    printf("The ASCII code of c1 is: %d\n", c1);    
      
    //如果你还想输出字符本身,可以这样做  
    printf("The character of c1 is: %c\n", c1);  

    //使用putchar输出字符本身
    printf("Use putchar output the c1 is:\n");
    putchar(c1);
    putchar('\n');
      
    return 0;  
}

(3)型变量与字符变量是否在任何情况下都可以互相代替?如:char c1,c2;与int cl,c2;是否无条件地等价?

        并不是

        在存储大小上,char通常占用1个字节,而int类型根据操作系统的不同可能是2字节或4字节

        表示范围的角度来看,int 能够表示的范围通常比 char 要大得多

        用途上也不同,char 主要用于存储字符数据,而 int 用于存储整数数据

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值