c语言程序设计答案_c程序设计语言答案 - CSDN
精华内容
参与话题
  • c语言程序设计习题答案(谭浩强)
  • C语言程序设计试题及答案解析,第1、2、3章 概述、类型、表达式。
  • C语言程序设计第三版课后习题答案完整版谭浩强清华大学出版社
  • C语言程序设计第五版 谭浩强 第五版课后答案

    万次阅读 多人点赞 2020-07-03 10:31:02
    谭浩强 C语言程序设计第五版 第4章课后答案 3.求两个正整数m和n,求其最大公约数和最小公倍数。 #include<stdio.h> void main() { int m, n, t, i, a = 1; scanf("%d%d", &m, &n); if (m < n) ...

    谭浩强 C程序设计第五版 第五版课后答案

    c程序设计

    第一章

    在这里插入图片描述

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

    • 程序:就是一组能识别和执行的指令,每一条指令使计算机执行特定的操作

    • 程序设计:是指从确定任务到得到结果、写出文档的全过程

    2.为什么需要计算机语言?高级语言有哪些特点?

    • 为什么需要计算机语言:计算机语言解决了人和计算机交流是的语言问题,使得计算机和人都能识别

    • 高级语言有哪些特点:
      2.1 高级语言的数据结构要比汇编和机器语言丰富;
      2.2 高级语言与具体机器结构的关联没有汇编以及机器语言密切;
      2.3 高级语言更接近自然语言更容易掌握;
      2.4 高级语言编写的程序要经过编译或解释计算机才能执行;

    3.正确理解以下名词及其含义:

    (1)源程序,目标程序,可执行程序。

    • ​源程序:指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令

    • 目标程序:为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名

    • 可执行程序:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体,生成一个可供计算机执行的目标程序,成为可执行程序

    (2)程序编辑,程序编译,程序连接。

    程序编辑:上机输入或者编辑源程序。

    程序编译:

    • 先用C提供的“预处理器”,对程序中的预处理指令进行编译预处理
    • 对源程序进行语法检查, 判断是否有语法错误,直到没有语法错误未知
    • 编译程序自动把源程序转换为二进制形式的目标程序

    程序连接:将所有编译后得到的目标模块连接装配起来,在与函数库相连接成为一个整体的过程称之为程序连接

    (3)程序,程序模块,程序文件。

    • 程序:一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具

    • 程序模块:可由汇编程序、编译程序、装入程序或翻译程序作为一个整体来处理的一级独立的、可识别的程序指令

    • 程序文件:程序的文件称为程序文件,程序文件存储的是程序,包括源程序和可执行程序

    (4)函数,主函数,被调用函数,库函数。

    • 函数:将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,来完成一定功能

    • 主函数:又称main函数,是程序执行的起点

    • 被调用函数:由一个函数调用另一个函数,则称第二个函数为被调用函数

    • 库函数:一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是

    ​ 编译器特定的库函数

    (5)程序调试,程序测试。
    • 程序调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程

    • 程序测试:是指对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行

    4.编写一个C程序,运行时输出

    Hello World!
    这个程序是一些国外C教材中作为第一个程序例子介绍的,一般称为Hello程序。

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	printf("%s\n", "Hello World!");
    	return 0;
    }
    

    运行截图:

    C程序设计第五版谭浩强第4题答案

    5.编写一个C程序,运行时输出以下图形:

    ****

    ****

    ​ ****

    ​ ****

    代码示例:

    #include <stdio.h>
    
    int main()
    {
    	for (int i = 0; i < 4; i++)
    	{
    		for (int j = 0; j < i; j++)
    		{
    			printf("%s", "  ");
    		}
    		printf("%s\n", "*****");
    	}
    	return 0;
    }
    

    运行截图:

    C语言程序设计第五版谭浩强第5题答案

    6.编写一个C程序,运行时输人a,b,c三个值,输出其中值最大者。

    代码示例:

    #include<stdio.h>
    
    int main()
    {
    	int a, b, c, max;
    	printf("请输入三个数:\n");
    
    	scanf("%d%d%d", &a, &b, &c);
    	if (a > b)
    	{
    		max = a;
    	}
    	else
    	{
    		max = b;
    	}
    
    	if (c > max)
    	{
    		max = c;
    	}
    	printf("三个数中最大的数为:%d", max);
    	return 0;
    
    }
    

    运行截图:

    C语言程序设计第五版谭浩强第6题答案

    7.看懂《C程序设计(第五版)学习辅导》第16章中介绍的用Visual Studio 2010对C程序进行编辑、编译、连接和运行的方法,并进行以下操作:

    (1)建立一个新项目,定名为project1.

    C语言程序设计第五版谭浩强第6题答案

    (2)建立一个新文件,定名为test1。

    C语言程序设计第五版谭浩强课后答案 第二题

    (3)向test1 文件输人源程序(此源程序为读者自己编写的程序)。

    C语言程序设计第五版谭浩强课后答案 第三题

    (4)编译该源程序,如发现程序有错,请修改之,直到不出现“编译出错”为止。

    (5)连接并运行, 得到结果。分析结果。

    C程序设计第五版课后答案

    更多相关文章

    C程序设计第五版谭浩强课后习题答案 第一章
    C程序设计第五版谭浩强课后习题答案 第二章
    C程序设计第五版谭浩强课后习题答案 第三章
    C程序序设计第五版谭浩强课后习题答案 第四章
    C语言程序设计第五版谭浩强课后习题答案 第五章
    C语言程序设计第五版谭浩强课后习题答案 第六章
    C语言程序设计第五版谭浩强课后习题答案 第七章
    C语言程序设计第五版谭浩强课后习题答案 第八章
    C语言程序设计第五版谭浩强课后习题答案 第九章
    C语言程序设计第五版谭浩强课后习题答案 第十章

    展开全文
  • c语言程序设计答案 第五版 谭浩强

    千次阅读 2019-06-15 23:53:27
    1.假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值于现在相比增长多少百分比。计算公式为 p=(1+r)^2, r为年增长率,n为年数,p为于现在相比比的倍数。 #include<stdio.h>...

    1.假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值于现在相比增长多少百分比。计算公式为 p=(1+r)^2,
    r为年增长率,n为年数,p为于现在相比比的倍数。

    #include<stdio.h>
    #include<math.h>//pow为调用数学函数需要加math.h头文件
    int main()
    {
        int n;
        float p, r=0.07;
        for(n=1;n<=10;n++)
        p=pow((r+1),n);
        printf("p=%.2f",p);//%。2f保留两位小数
    }   
    

    c语言程序设计答案 第五版 谭浩强
    2.存款利息的计算。有1000元,想存5年,可按以下5种办法存:

    (1)一次存5年期。

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

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

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

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

    2007年12月的银行存款利息如下:

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

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

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

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

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

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

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

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

    活期存款本息和:P=1000*(1+r/4)^4n;
    注意:1000*(1+r/4)^4n是一个季度的本息和;
    c语言程序设计答案 第五版 谭浩强

    #include<stdio.h>
    #include<math.h>
    main()
    {
        float r5,r3,r2,r1,r0,p1,p2,p3,p4,p5,p;
        p = 1000;
        r0 = 0.0072;
        r1 = 0.0414 ;
        r2 = 0.0468;
        r3 = 0.054;
        r5 = 0.0585;
        p1 = p*(1+5*r5);//分别计算出5种方案的本息和
        p2 = p*(1 + 2 * r2)*(1 + 3 * r3);
        p3 = p*(1 + 3 * r3)*(1 + 2 * r2);
        p4 = p*pow(1+r1,5);
        p5 = p*pow(1 + r0/4,4*5);
        printf("p1=%f\n",p1);
        printf("p2=%f\n",p2);
        printf("p3=%f\n",p3);
        printf("p4=%f\n",p4);
        printf("p5=%f\n",p5);
        return 0;
    }
    

    c语言程序设计答案 第五版 谭浩强
    3.购房从银行贷了一笔款d, 准备每月还款额为p, 月利率为r, 计算多少月能还清。设d为300000元,p为6000元,r为1%。对求得的月份取小数点后一位,对第2位按四舍五入处理。

    公式为:m=log(p/(p-d*r))/log(1+r);

    #include <stdio.h>
    #include <math.h>
    int main()
    {
        int d = 300000, p = 6000;    //定义贷款总额,每月还贷数
        double r = 0.01, m, x, y;    //定义利率,月份
        x = p / (p - d * r);
        y = 1 + r;
        m = log10(x) / log10(y);     //计算公式
        printf("m=%.2lf\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;
    }
    

    (1)运行时会输出什么信息?为什么?
    输出:c1=a,c2=b
    c1=97,c2=98
    因为第一行printf输出格式为%c 为字符输出对应ASCII码 第二行printf输出格式为%d 为10进制整型输出

    (2)如果将程序第4,5行改成 c1=197;c2=198;运行时会输出什么信息?为什么?
    输出:c1=(不存在ASCII码里的符号),c2=(不存在ASCII码里的符号)
    c1=197,c2=198

    (3)如果将程序第3行改成 int c1,c2;运行时会输出什么信息?为什么?
    c1=a,c2=b
    c1=97,c2=98
    因为第一行printf输出格式为%c 为字符输出对应ASCII码 第二行printf输出格式为%d 为10进制整型输出
    输出内容的类型由输出格式而定c语言程序设计答案 谭浩强

    5.用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入?

    #include<stdio.h>
    int main()
    {
    
    int a, b;
    
    float x, y;
    
    char c1, c2;
    
    scanf("a=%d b=%d",&a,&b);
    
    scanf("%f %e",&x,&y);
    
    scanf("%c%c", &c1, &c2);
    
    printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1, c2);
    
    return 0;
    
    }
    

    输入方式一及结果分析:

    a=3 b=7

    8.5 71.82Aa

    a=3,b=7,x=8.500000,y=71.820000,c1=A,c2=a

    请按任意键继续…

    在输入8.5和71.82两个实数给x和y后,应紧接着输入字符A,中间不要有空格,由于字母A不是数字,系统在遇到字母A时,就确定输入给y的值已经结束,字符A就送到下一个scanf语句中的字符变量c1。

    输入方式二及结果分析:

    a=3 b=7

    8.5 71.82 Aa

    a=3,b=7,x=8.500000,y=71.820000,c1= ,c2=A

    请按任意键继续…

    在输入8.5和71.82两个实数后,输入的空格符就被c1读入,c2读入了字符A,故输出c1时就输出空格,输出c2的值为A。

    输入方式三及结果分析:

    a=3 b=7

    8.5 71.82

    Aa

    a=3,b=7,x=8.500000,y=71.820000,c1=

    ,c2=A

    请按任意键继续…

    在输入8.5和71.82两个实数后,按回车键再输入Aa,这时“回车”被作为一个字符送到内存输入缓冲区,被c1读入,字符A被c2读取,故在输出c1时,就输出一个换行,在下一行输出逗号和c2的值A。

    请编程序将”China”译成密码,译码规律是用原来字母后面的第4个字母代替原来的字母。
    例如,字母”A”后面第4个字母是”E”, “E”代替”A”。因此,”China”应译为”Glmre”。
    请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为’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 += 4;
    
    c2 += 4;
    
    c3 += 4;
    
    c4 += 4;
    
    c5 += 4;
    
    printf("用printf输出密码为:%c%c%c%c%c\n", c1, c2, c3, c4, c5);
    
    printf("用putchar输出密码为:");
    
    putchar(c1);
    
    putchar(c2);
    
    putchar(c3);
    
    putchar(c4);
    
    putchar(c5);
    
    printf("\n");
    
    return 0;
    
    }
    

    c语言程序设计答案 第五版 谭浩强
    设圆半径r = 1.5,圆柱高h = 3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。要求:用scanf输入数据,取小数点后两位。

    
    #include<stdio.h>
    #include<math.h>
     void main()
     {
     float r,h,pi=3.141592,C,S1,S2,V1,V2;
     printf("请输入圆半径圆柱高\n");
     scanf("%f%f",&r,&h);
    
     C=4*pi*r;
     printf("圆周长=%2.2f\n",C);
    
    S1=pi*r*r;
    printf("圆面积=%2.2f\n",S1);
    
    S2=4*pi*r*r;
    printf("圆球表面积=%2.2f\n",S2);
    
    V1=(4/3)*pi*pow(r,3);
    printf("圆球体积=%2.2f\n",V1);
    
    V2=S1*h;
    printf("圆柱体积=%2.2f\n",V2); 
     }
    

    8.用getchar函数读入两个字符给c1,c2,分别用putchar和printf输出这两个字符。思考以下问题:

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

    (2)要求输出c1和c2的ASCII码,应如何处理?

    (3)整形变量和字符变量是否在任何情况下都可以互相代替?char c1, c2;和int c1, c2;是否无条件等价?

    #include<stdio.h>
    
    int main()
    
    {
    
    char 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);
    
    /*printf("%d,%d\n", c1, c2);*/
    
    return 0;
    
    }
    

    (1)c1和c2可以定义为字符型或整型,二者皆可。

    (2)用printf函数输出,使用%d格式符,即:

    printf(“%d,%d\n”, c1, c2);

    结果为:97,98

    (3)字符变量占1个字节,整型变量占2或4个字节。故整型变量在可输出字符的范围内(ASCII码为0到127之间的字符)是可以与字符型数据互相转换的。如果整数在此范围外,不能代替。c语言程序设计答案 第五版 谭浩强

    展开全文
  • C语言程序设计(第2版)答案修正版 C语言程序设计(第2版)课后习题答案 第一章 1.请参照本章例题,编写一个C程序,输出以下信息: ************************** Very good! ************************** 解: #include&...

    C语言程序设计(第2版)答案修正版
    C语言程序设计(第2版)课后习题答案
    第一章
    1.请参照本章例题,编写一个C程序,输出以下信息: **************************
    Very good!
    ************************** 解:
    #include<stdio.h>
    void main()
    {
    printf(“”);
    printf(“\n”);
    printf(“Very good!\n”);
    printf(“\n”);
    printf(“
    ”);
    }
    2.编写一个C程序,输入a、b、c三个值,输出其中最大值。 解:
    #include<stdio.h>
    void main()
    {
    int a,b,c,max;
    printf(“请输入三个数a,b,c:\n”);
    scanf(“%d,%d,%d”,&a,&b,&c);
    max=a;
    if(max<b) max=b;
    if(max<c) max=c;
    printf(“最大数为: %d”,max);
    }
    第二章
    1.假如我国国民生产总值的年增长率为10%,计算10年后我国国民生产总值与现在相比增
    长多少百分比。计算公式为P=(1+r)^n,r为年增长率;n为年数;P为与现在相比的百分比。
    解:
    #include<stdio.h>
    #include<math.h>
    void main()
    {
    double P, r=0.1, n=10; P=pow((1+r), n);
    printf(“%lf\n”, P);
    }
    3.请编程序将“China”译成密码,译码规律是用原来字母后面的第4个字母代替原来的字母。
    例如,字母“A”后面第4个字母是“E”, “E”代替“A”。因此,“China”应译为“Glmre”。请编
    一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为?C?、?h?、?i?、?n?、?a?,经过运算,使c1、c2、c3、c4、c5分别变为?G?、?l?、?m?、?r?、?e?,并输出。 解:
    #include <stdio.h>
    void main()
    {
    char c1=?C?,c2=?h?,c3=?i?,c4=?n?,c5=?a?;
    c1+=4;
    c2+=4;
    c3+=4;
    c4+=4;
    c5+=4;
    printf(“密码是%c%c%c%c%c\n”,c1,c2,c3,c4,c5); }
    第三章
    3.用下面的scanf函数输入数据,使a=3, b=7, x=8.5, y=71.82, c1=?A?, c2=?a?。问在键盘上如何输入,
    解:
    #include<stdio.h>
    void main()
    {
    int a, b; float x, y; char c1, c2; scanf(“a=%d, b=%d”, &a, &b);
    scanf(“ x=%f, y=%e”, &x, &y);
    scanf(“ c1=%c, c2=%c”,&c1, &c2);
    }
    a=3, b=7
    x=8.5, y=71.82
    c1=A, c2=a
    5. 设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求文字说明,取小数点后2位数字。请编程序。
    解:
    #include<stdio.h>
    void main()
    {
    float r,h,C1,Sa,Sb,Va,Vb; scanf(“%f,%f”,&r,&h);
    C1=23.14r;
    Sa=3.14rr;
    Sb=4Sa;
    Va=4
    3.14rrr/3;
    Vb=Sa
    h;
    printf(“C1=%.2f\n”,C1);
    printf(“Sa=%.2f\nSb=%.2f\nVa=%.2f\nVb=%.2f\n”,Sa,Sb,Va,Vb);
    }
    6. 输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9,输出要求有文字说明,取
    位2小数。
    解:
    #include<stdio.h>
    void main()
    {
    float F,c;
    scanf(“%f”,&F);
    c=5*(F-32)/9;
    printf(“c=%.2f”,c);
    }
    7. 编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf函数输
    出这两个字符。思考以下问题:
    (1)变量c1、c2应定义为字符型或整形,或二者皆可, (2)要求输出c1和c2值的ASCII码,应如何处理,用putchar函数还是printf函数,
    (3)整形变量与字符变量是否在任何情况下都可以互相代替,如:
    char c1,c2;与int c1, c2; 是否无条件地等价, 解:
    #include<stdio.h>
    void main()
    {
    char c1,c2;
    c1=getchar();
    c2=getchar();
    putchar(c1);putchar(„\n?);putchar(c2);putchar(„\n?); }
    #include<stdio.h>
    void main()
    {
    char c1,c2;
    c1=getchar();
    c2=getchar();
    printf(“c1=%d c2=%d\n”,c1,c2); printf(“c1=%c c2=%c\n”,c1,c2); }
    第四章 3. 写出下面各逻辑表达式的值。设a=3,b=4,c=5。 (1) a+b>c&&b==c
    (2) a||b+c&&b-c
    (3) !(a>b)&&!c||1 (4) !(x=a)&&(y=b)&&0 (5) !(a+b)+c-1&&b+c/2 解:
    (1) 0
    (2) 1
    (3) 1
    (4) 0
    (5) 1
    5. 有3个整数a、b、c,由键盘输入,输出其中最大的数,请编程序。
    解:
    #include<stdio.h>
    void main()
    {
    int a,b,c,temp,max; printf(“请输入3个整数: ”);
    scanf(“%d,%d,%d”,&a,&b,&c); temp=(a>b)?a:b; max=(temp>c)?temp:c; printf(“3个整数的最大数是%d\n”,max); }
    6. 给一个百分制成绩,要求输出等级?A?、?B?、?C?、?D?、?E?。90分以上为?A?,80~90分
    为?B?,70~79分为?C?,60分以下为?D?。 解:
    #include<stdio.h>
    void main()
    {
    float score;
    char grade;
    printf(“请输入学生成绩: ”);
    scanf(“%f”,&score);
    while(score>100||score<0)
    { printf(“\n输入有误,请重新输入: ”);
    scanf(“%f”, &score); }
    switch((int)(score/10)) {
    case 10:
    case 9: grade=?A?;break;
    case 8: grade=?B?;break;
    case 7: grade=?C?;break;
    case 6: grade=?D?;break;
    case 5:
    case 4:
    case 3:
    case 2:
    case 1:
    case 0: grade=?E?;break;
    }
    printf(“成绩是%5.1f, 相应的等级是%c. \n”,score,grade); }
    7. 给定一个不多于5位的正整数,要求:
    (1)求出它是几位数;
    (2)分别输出每一位数字;
    (3)按逆序输出各位数字。例如原数为321,应输出123。
    解:
    #include <stdio.h>
    void main()
    {
    long int num;
    int indiv,ten,hundred,thousand,ten_thousand,place; /分别代表个位、十位、百位、千位、万位和位数/
    printf(“请输入一个整数(0~99999): ”);
    scanf(“%ld”,&num);
    if (num>9999) place=5;
    else if(num>999) place=4;
    else if(num>99) place=3;
    else if(num>9) place=2;
    else place=1;
    printf(“place =%d\n”, place);
    ten_thousand=num/10000;
    thousand=num/1000%10;
    hundred=num/100%10;
    ten=num%100/10;
    indiv=num%10;
    switch(place)
    { case 5: printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,indiv);
    printf(“\n反序数字为: ”);
    printf(“%d%d%d%d%d\n”,indiv,ten,hundred,thousand,ten_thousand);
    break;
    case 4: printf(“%d,%d,%d,%d”,thousand,hundred,ten,indiv);
    printf(“\n反序数字为: ”);
    printf(“%d%d%d%d\n”,indiv,ten,hundred,thousand);
    break;
    case 3: printf(“%d,%d,%d”,hundred,ten,indiv);
    printf(“\n反序数字为: ”);
    printf(“%d%d%d\n”,indiv,ten,hundred);
    break;
    case 2: printf(“%d,%d”,ten,indiv);
    printf(“\n反序数字为: ”);
    printf(“%d%d\n”,indiv,ten);
    break;
    case 1: printf(“%d”,indiv);
    printf(“\n反序数字为: ”);
    printf(“%d\n”,indiv);
    break;
    }
    }
    8. 企业发放的奖金根据企业的当年利润决定。当利润I低于或等于100000元时,奖金可提成10%;利润大于100000元,小于200000元(100000<I?200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7.5%;利润大于200000元,小于400000元(200000<I?400000)时,低于200000元的部分仍按上述办法提成(下同),高于200000元的部分按5%提成。利润大于400000元,小于600000元(400000<I?600000)时,高于400000元的部分按3%提成。利润大于600000元,小于1000000元(600000<I?1000000)时,高于600000的部分按1.5%提成;利润大于1000000元(I>1000000)时,超过1000000元的部分按1%提成。从键盘输入当年利润I,求应发放奖金总数。要求: (1)用if语句编程序;(2)用switch语句编程序。
    解:
    (1) 用if语句编程序。
    #include <stdio.h>
    void main()
    {
    long i;
    float bonus,bon1,bon2,bon4,bon6,bon10; bon1=1000000.1; /利润为10万元时的奖金/ bon2=bon1+1000000.075; /利润为20万元时的奖金/ bon4=bon2+2000000.05; /利润为40万元时的奖金/ bon6=bon4+2000000.03; /利润为60万元时的奖金/ bon10=bon6+4000000.015; /利润为100万元时的奖金/ printf(“请输入利润i: ”);
    scanf(“%ld”,&i);
    if(i<=100000) bonus=i
    0.1; /利润在10万元以内按0.1提成奖金/ else if(i<=200000)
    bonus=bon1+(i-100000)0.075; /利润在10万至20万元时的奖金/ else if(i<=400000)
    bonus=bon2+(i-200000)0.05; /利润在20万至40万元时的奖金/ else if(i<=600000)
    bonus=bon4+(i-400000)0.03; /利润在40万至60万元时的奖金/ else if(i<=1000000)
    bonus=bon6+(i-600000)0.015; /利润在60万至100万元时的奖金/ else
    bonus=bon10+(i-1000000)0.01; /利润在100万元以上时的奖金/ printf(“奖金是%10.2f\n”,bonus);
    }
    (2) 用switch语句编程序。
    #include <stdio.h>
    void main()
    {
    long i;
    float bonus, bon1, bon2, bon4, bon6, bon10;
    int c;
    bon1=100000
    0.1;
    bon2=bon1+100000
    0.075; bon4=bon2+200000
    0.05; bon6=bon4+200000
    0.03; bon10=bon6+400000
    0.015; printf(“请输入利润i: ”);
    scanf(“%ld”,&i);
    c=i/100000;
    if(c>10) c=10;
    switch©
    {
    case 0: bonus=10.1;break; case 1: bonus=bon1+(i-100000)0.075;break;
    case 2 :
    case 3: bonus=bon2+(i-200000)0.05; break;
    case 4:
    case 5: bonus=bon4+(i-400000)0.03;break;
    case 6:
    case 7:
    case 8:
    case 9: bonus=bon6+(i-600000)0.015;break;
    case 10: bonus=bon10+(i-1000000)0.01;
    }
    printf(“奖金是%10.2f”,bonus);
    }
    9. 输入4个整数,要求按由小到大的顺序输出。 解:
    #include <stdio.h>
    void main()
    {
    int t,a,b,c,d;
    printf(“请输入4个整数: ”);
    scanf(“%d,%d,%d,%d”,&a,&b,&c,&d); printf(“\n a=%d,b=%d,c=%d,d=%d\n”,a,b,c,d); if(a>b) {t=a; a=b; b=t;} if(a>c) {t=a; a=c; c=t;} if(a>d) {t=a; a=d; d=t;} if(b>c) {t=a; b=c; c=t;} if(b>d) {t=b; b=d; d=t;} if(c>d) {t=c; c=d; d=t;}
    printf(“排序结果如下: \n”);
    printf(“%d, %d, %d, %d\n”,a,b,c,d);
    }
    10. 有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1。这4个塔的高度分别为10m。塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
    解:
    #include <stdio.h>
    void main()
    {
    int h=10;
    float x1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=-2,y4=-2,x,y,d1,d2,d3,d4;
    printf(“请输入一个点(x,y): ”);
    scanf(“%f,%f”,&x,&y);
    d1=(x-x1)
    (x-x1)+(y-y1)
    (y-y1); /求该点到各中心点的距离/ d2=(x-x2)
    (x-x2)+(y+y2)
    (y+y2); d3=(x+x3)
    (x+x3)+(y-y3)
    (y-y3); d4=(x+x4)(x-x4)+(y+y4)(y+y4); if(d1>1&&d2>1&&d3>1&&d4>1) h=0; /判断该点是否在塔外/ printf(“该点高度为%d\n”,h);
    }
    2axbxc,,,011. 求方程的解。
    根据代数知识,应该有以下几种可能:
    (1)a=0, 不是二次方程,而是一次方程。
    2(2),有两个相等的实根。 bac,40
    2(3),有两个不等的实根。 bac,40
    2(4),有两个共轭复根。 bac,40
    编写程序,运行时,分别给出不同的a, b, c值,相应于上面4种情况,分析输出结果。 解:
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    void main()
    {
    float a,b,c,disc,x1,x2,realpart,imagpart;
    scanf(“%f,%f,%f”,&a,&b,&c);
    printf(“The equation”);
    if(fabs(a)<=1e-6)
    printf(“is not a quadratic\n”);
    else
    {
    disc=bb-4ac;
    if(fabs(disc)<=1e-6) printf(“has tow eual roots:%8.4f\n”,-b/(2
    a));
    else if(fabs(disc)>1e-6)
    { x1=(-b+sqrt(disc))/(2a);
    x2=(-b-sqrt(disc))/(2
    a);
    printf(“has distinct real roots:%8.4f and %8.4f\n”,x1,x2);
    }
    else
    {
    realpart=-b/(2a);
    imagpart=sqrt(-disc)/(2
    a);
    printf(“has complex roots:\n”);
    printf(“%8.4f+%8.4fi\n”,realpart,imagpart);
    printf(“%8.4f-%8.4fi\n”,realpart,imagpart);
    }
    }
    }
    第五章

    1. 求100~200间的全部素数。
      解:
      #include<stdio.h>
      #include<math.h>
      void main()
      {
      int m,i,n=0;
      double k;
      for(m=101;m<=200;m=m+2)
      {
      k=sqrt(m);
      for(i=2;i<=k;i++)
      if(m%i0) break;
      if(i>=k+1)
      {
      printf(“%d”,m); n=n+1;
      }
      if(n%10
      0) printf(“\n”);
      }
      printf(“\n”);
      }
    2. 输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。 解:
      #include<stdio.h>
      void main()
      {
      char c;
      int i=0,j=0,k=0,l=0; while((c=getchar())!=?\n?)
      {
      if(c>=?A?&&c<=?Z?||c>=?a?&&c<=?z?) i++; else if(c>=?0?&&c<=?9?) j++; else if(c==? ?) k++;
      else l++;
      }
      printf(“i=%d,j=%d,k=%d,l=%d\n”,i,j,k,l); }
    3. 输出所有“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该本
      身。例如:153是一个水仙花数,因为153=13+53+3^3。
      解:
      #include<stdio.h>
      #include<math.h> void main()
      {
      int i,j,k,n;
      printf(““水仙花”数是:”);
      for(n=100;n<1000;n++) {
      i=n/100;
      j=n/10-i10;
      k=n%10;
      if(n==i
      ii+jjj+kk*k) printf(“%4d”,n); }
      printf(“\n”);
      }
    4. 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
      第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半
      零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
      解:
      #include<stdio.h>
      void main()
      {
      int day,x1,x2;
      day=9;
      x2=1;
      while(day>0)
      {
      x1=(x2+1)*2;
      x2=x1;
      day–;
      }
      printf(“total=%d\n”,x1);
      }
    5. 一球从100米高度自由下落,每次落地后返回原高度的一半,再落下。求它在第10次落
      地时,共经过了多少米,第10次反弹多高, 解:
      #include<stdio.h> void main()
      {
      int i,n;double h=100,s=100;
      scanf(“%d”,&n);
      for(i=1;i<=n;i++) {
      h*=0.5;
      if(i==1) continue; s=2*h+s;
      }
      printf(“h=%f,s=%f\n”,h,s); }
    6. 打印以下图案





    解:
    #include<stdio.h> #include<math.h> void main()
    {
    int i,j,k;
    for(i=0;i<=3;i++)
    {
    for(j=0;j<=2-i;j++)
    printf(“ ”);
    for(k=0;k<=2i;k++)
    printf(“
    ”);
    printf(“\n”);
    }
    for(i=0;i<=2;i++)
    {
    for(j=0;j<=i;j++)
    printf(“ ”);
    for(k=0;k<=4-2i;k++)
    printf(“
    ”);
    printf(“\n”);
    }
    }
    7. 两个乒乓球队进行比赛,各出3人。甲队为A、B、C 3人,乙队为X、Y、Z 3人。已抽
    签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Y比,
    请编程序找出3三队选手的对阵名单。 解:
    #include<stdio.h> void main()
    {
    char i,j,k; /i是A的对手,j是B的对手,k是C的对手/
    for(i=?X?;i<=?Z?;i++)
    for(j=?X?;j<=?Z?;j++)
    {
    if(i!=j)
    for(k=?X?;k<=?Z?;k++)
    { if(i!=k&&j!=k)
    {
    if(i!=?X?&&k!=?X?&&k!=?Z?) printf(“order is A–%c\tB–%c\tC–%c\n”,i,j,k);
    }
    }
    }
    }
    第六章 1. 已知一个班10个学生的成绩,要求输入这10个学生的成绩,然后求出它们的平均成绩。
    解:
    #include <stido.h> main()
    {
    float a[10],sum,avg;
    int i;
    sum=0.0;
    printf(“Please input the students score:”);
    for(i=0;i<10;i++)
    {scanf(“%f”,&a[i]);
    sum=sum+a[i];
    }
    avg=sum/10;
    printf(“The average is:%f\n”,avg);
    }
    2. 已知一个班10个学生的成绩,存放在一个一维数组中,要求找出其中成绩最高的学生的
    成绩和该生的序号。
    解:
    #include<stdio.h>
    void main()
    {
    int ch[10];
    int i,max=0,xh;
    printf(“请输入10个学生的成绩:\n”);
    for(i=0;i<10;i++)
    {
    scanf(“%d”,&ch[i]);
    if(ch[i]>max)
    {
    max=ch[i];
    xh=i;
    }
    }
    printf(“成绩最高为:%d\n”,max);
    printf(“该生的序号为:%d\n”,xh);
    }
    3. 有3个学生,上4门课,要求输入全部学生的各门课成绩,并分别求出每门课的平均成
    绩。
    解:
    #include<stdio.h>
    #include<stdlib.h> #define RENSHU 3
    #define KECHENG 4
    void main()
    {
    float chengji[4][4];
    int i,j;
    printf(“\n请按人输入(一次输入一个人所有课程的成绩)成绩(%d人,%d门课
    程):”,RENSHU,KECHENG); for(i=0;i<RENSHU;i++) {
    printf(“\n第%d人:”,i+1);
    for(j=0;j<KECHENG;j++)
    scanf(“%f”,&chengji[i][j]); }
    for(j=0;j<KECHENG;j++) {
    chengji[RENSHU][j]=0; for(i=0;i<RENSHU;i++)
    chengji[RENSHU][j]+=chengji[i][j];
    chengji[RENSHU][j]=chengji[RENSHU][j]/RENSHU;
    }
    for(i=0;i<=RENSHU;i++) {
    for(j=0;j<KECHENG;j++) printf(“%8.2f”,chengji[i][j]); printf(“\n”);
    }
    printf(“\n”);
    }
    4. 已知5个学生的4门课的成绩,要求求出每个学生的平均成绩,然后对平均成绩从高到
    低将各学生的成绩记录排序。
    解:
    #include <stdio.h> #include <stdlib.h> void main()
    {
    int a[5][4]={{94,78,87,76},{66,87,75,69},{100,98,89,77},{82,58,72,84},{82,73,67,54}};
    int i,j,sum;
    float average,b[5],t;
    for(i=0;i<5;i++)
    {
    sum=0;
    for(j=0;j<4;j++)
    {
    sum=sum+a[i][j];
    b[i]=sum/4.0;
    }
    printf(“average%d=%4.2f\n”,i+1,b[i]);
    }
    for(j=0;j<4;j++)
    for(i=j+1;i<5;i++)
    if(b[i]>b[j])
    {
    t=b[i];
    b[i]=b[j];
    b[j]=t;
    }
    for(i=0;i<5;i++)
    printf(“%.2f\n”,b[i]);
    }
    5. 将一个数组的值按逆序重新存放,例如,原来顺序为:8,6,5,4,1。要求改为:1,4,
    5,6,8。
    解:
    #include<stdio.h> void main()
    {
    int i,a [10],temp; for(i=0;i<10;i++) scanf(“%d”,&a[i]);
    for(i=0;i<10;i++) printf(“%4d”,a[i]);
    for(i=0;i<5;i++) {
    temp=a[i];
    a[i]=a[9-i];
    a[9-i]=temp;
    }
    for(i=0;i<10;i++) printf(“%4d”,a[i]);
    printf(“\n”);
    }
    6. 有个15数按由小到大顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数
    组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
    解:
    #include<stdio.h> void main()
    {
    int a[15]={14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
    int start,end,mid,i,find_flag;
    int x;
    printf(“input x”);
    scanf(“%d ”,&x);
    start=0;
    end=14;
    find_flag=0;
    do{
    mid=(start+end)/2;
    if(xa[mid])
    {
    printf(“Find the number,it is a[%d]”,mid);
    break;
    }
    else if(x>a[mid]) end=mid-1;
    else start=mid+1;
    }while(start<end); }
    7. 输出以下图案:
    ,
    ,
    ,
    ,
    ,
    解:
    #include<stdio.h> void main()
    {
    int i,j,k;char a[5][5];
    for(i=0;i<5;i++) {
    for(j=0;j<5;j++) {
    a[i][j]=?*?;
    printf(“%c”,a[i][j]);
    }
    printf(“\n”);
    for(k=1;k<=i+1;k++)
    printf(“ ”);
    }
    printf(“\n”);
    }
    8. 有一篇文章,共有3行文字,每行有个80字符。要求分别统计出其中英文大写字母、小
    写字母、空格以及其它字符的个数。 解:
    #include<stdio.h> void main()
    {
    int i,j,upp,low,dig,spa,oth;
    char text[3][80];
    upp=low=dig=spa=oth=0;
    for(i=0;i<3;i++)
    {
    printf(“\nPlease input line %d:\n”,i+1);
    gets(text[i]);
    for(j=0;j<80&&text[i][j]!=?\0?;j++)
    {
    if(text[i][j]>=?A?&&text[i][j]<=?Z?) upp++;
    else if(text[i][j]>=?a?&&text[i][j]<=?z?) low++;
    else if(text[i][j]>=?0?&&text[i][j]<=?9?) dig++;
    else if(text[i][j]
    ? ?) spa++;
    else oth++;
    }
    }
    for(i=0;i<3;i++)
    printf(“%s\n”,text[i]);
    printf(“upper case:%d\n”,upp);
    printf(“lower case:%d\n”,low);
    printf(“digit case:%d\n”,dig);
    printf(“space case:%d\n”,spa);
    printf(“other case:%d\n”,oth);
    }
    9. 有一行电文,已按下面规律译成密码:
    A->Z a->z
    B->Y b->y
    C->X c->x

    即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。假
    如已知道密码是Umtorhs,要求编程序将密码译回原文,并输出密码和原文。
    解:
    #include<stdio.h>
    void main()
    {
    int i;char str1[100],str2[100]; gets(str1);
    for(i=0;str1[i]!=?\0?;i++)
    if(str1[i]>=65&&str1[i]<=90) str2[i]=155-str1[i];
    else if(str1[i]>=97&&str1[i]<=122) str2[i]=219-str1[i];
    else str2[i]=str1[i]; printf(“%s\n%s\n”,str1,str2);
    }
    10. 编一程序,将两个字符串连接起来,(1)用strcat函数;(2)不用strcat函数。
    解:
    (1)
    #include<stdio.h>
    void main()
    {
    int i,j;char str1[100],str2[100],str3[201];
    gets(str1);
    gets(str2);
    str3=strcat(str1,str2); printf(“%s\n%s\n%s\n”,str1,str2,str3); }
    (2)
    #include<stdio.h>
    void main()
    {
    int i,j;char str1[100],str2[100],str3[201];
    gets(str1);
    gets(str2);
    for(i=0;str1[i]!=?\0?;i++)
    str3[i]=str1[i];
    for(j=0;str2[j]!=?\0?;j++)
    str3[j+i]=str2[j];
    str3[j+i]=0
    printf(“%s\n%s\n%s\n”,str1,str2,str3); }
    第七章

    1. 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,
      并输出结果两个整数由键盘输入。
      解:
      #include<stdio.h>
      int maxyueshu(int m,int n) {
      int i=1,t;
      for(;i<=m&&i<=n;i++) { if(m%i0&&n%i0) t=i; } return(t);
      }
      int minbeishu(int m,int n) {
      int j;
      if(m>=n) j=m;
      else j=n;
      for(;!(j%m0&&j%n0);j++) ; return j;
      }
      void main()
      {
      int a,b,max,min;
      printf(“enter two number is: ”);
      scanf(“%d,%d”,&a,&b);
      max=maxyueshu(a,b);
      min=minbeishu(a,b);
      printf(“max=%d,min=%d\n”,max,min); }
    2. 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。
      解:
      #include<stdio.h>
      int psushu(int m) {
      int i,t=1;
      for(i=2;i<m/2&&t1;i++)
      if(m%i
      0) t=0; return t;
      }
      void main()
      {
      int a,s;
      printf(“enter sushu is \n”);
      scanf(“%d”,&a);
      s=psushu(a);
      if(s==1) printf(“a is sushu\n”); else printf(“s is not sushu\n”); }
    3. 写一个函数,使给定的一个二维数组(,×,)转置,即行列互换。
      解:
      #include<stdio.h> int zhuangzhi(int b[3][3])
      {
      int i,j,t;
      for(i=0;i<3;i++) for(j=0;j>=i&&j<3-i;j++)
      {t=b[i][j];b[i][j]=b[j][i];b[j][i]=t;}
      }
      void main()
      {
      int a[3][3];int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) scanf(“%d”,&a[i][j]); for(i=0;i<3;i++) {
      for(j=0;j<3;j++) printf(“ %d”,a[i][j]); printf(“\n”);
      }
      zhuangzhi(a); for(i=0;i<3;i++) {
      for(j=0;j<3;j++) printf(“ %d”,a[i][j]); printf(“\n”);
      }
      }
    4. 写一函数,使输入的一个字符串按反序存放,在主函数中输入和输出字符串。
      解:
      #include<stdio.h>
      void main()
      {
      char str0[100];
      gets(str0);
      fanxu(str0);
      puts(str0);
      }
      fanxu(char str1[100]) {
      int i,t,j;
      char str2[100];strcpy(str2,str1);
      t=strlen(str1);
      for(i=0,j=t-1;j>-1;i++,j–) str1[i]=str2[j];
      }
    5. 写一函数,将两个字符串连接。
      解:
      #include<stdio.h>
      lianjie(char a[100],b[100]) {
      strcat(a,b);
      }
      void main()
      {
      char str1[100],str2[100]; gets(str1);gets(str2); lianjie(str1,str2); puts(str1);
      }
    6. 写一函数,将两个字符串中的元音字母复制到另一个字符串,然后输出。
      解:
      #include<stdio.h>
      fuzhi(char a[100],b[100]) {
      int i,j=0;
      for(i=0;a[i]!=?\0?;i++)
      if(a[i]==97||a[i]==101||a[i]==105||a[i]==111||a[i]==117||a[i]==65||a[i]==69||a[i]==73||a[i]==85)
      {b[j]=a[i]; j++;}
      }
      void main()
      {
      char str1[100],str2[100]; gets(str1);
      fuzhi(str1,str2);
      puts(str2);
      }
    7. 写一函数,输入一个四位数字,要求输出这四个数字字符,但每个数字间空一个空格。
      如输入2008,应输出“2_0_0_8”。
      解:
      #include<stdio.h>
      void insert(char str[]) {
      int i;
      for(i=strlen(str);i>0;i–) {
      str[2i]=str[i];
      str[2
      i-1]=? ?;
      }
      printf(“\noutput:\n%s”,str);
      }
      void main()
      {
      char str[80];
      printf(“\ninput four digits:”);
      scanf(“%s”,str);
      insert(str);
      }
    8. 编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的
      个数,在主函数中输入字符串以及输出上述结果。 解:
      #include<stdio.h>
      char tongji(char str0[100],int b[4)
      {
      int i;
      for(i=0;str0[i]!=?\0?;i++)
      {
      if(str0[i]>=65&&str0[i]<=90||str0[i]>=97&&str0[i]<=122) b[0]++;
      else if(str0[i]>=48&&str0[i]<=57) b[1]++;
      else if(str0[i]==32) b[2]++; else b[3]++;
      }
      }
      void main()
      {
      char str1[100];static int i,a[4];
      gets(str1);
      tongji(str1,a);
      printf(“zimu Shuzi Kongge Qita\n”);
      for(i=0;i<4;i++)
      printf(“%-8d”,a[i]);
      printf(“\n”);
      }
    9. 写一函数,输入一行字符,将此字符串中最长的单词输出。 解:
      #include<stdio.h>
      cechang(char str1[100],word0[15]) {
      int i=0,j=0,t=0;
      static char word1[15]; for(;str1[i]!=?\0?;i++)
      { if(!(str1[i]>=97&&str1[i]<=122||str1[i]>=65&&str1[i]<=90))
      {t=j;j=0;continue;}
      word1[j]=str1[i];j++;
      if(j>=t) strcpy(word0,word1); }
      }
      void main()
      {
      char str0[100],longword[15]; gets(str0);
      cechang(str0,longword); puts(longword);
      }
    10. 写一函数用“起泡法”对输入的10个字符按由小到大的顺序排列。 解:
      #include<stdio.h>
      int paixu(int x[])
      {
      int i,j,t;
      for(j=1;j<10;j++)
      for(i=0;i<=9-j;i++)
      if(x[i]>x[i+1]) {t=x[i+1];x[i+1]=x[i];x[i]=t;}
      }
      void main()
      {
      int y[10];int i;
      for(i=0;i<10;i++)
      scanf(“%d”,&y[i]);
      paixu(y);
      for(i=0;i<10;i++)
      printf(“%5d”,y[i]);
      printf(“\n”);
      }
    11. 输入10个学生5门课的成绩,分别用函数实现下列功能: ?计算每个学生平均分;
      ?计算每门课的平均分;
      ?找出所有50个分数中最高的分数所对应的学生和课程; 解:
      #include<stdio.h>
      float x1[10],x2[5]; float pp(),cc(),find(); void main()
      {
      char name[10][20],class[5][20];
      float score[10][5],max[5];int a[5],i,j;
      for(i=0;i<10;i++) gets(name[i]);
      for(j=0;j<5;j++) gets(class[j]);
      for(i=0;i<10;i++)
      for(j=0;j<5;j++)
      scanf(“%f”,&score[i][j]); pp(score);
      cc(score);
      find(score,max,a); for(i=0;i<10;i++)
      {
      puts(name[i]);
      printf(“%.3f\n”,x1[i]);
      }
      for(j=0;j<5;j++)
      {
      puts(class[j]);
      printf(“%.3f\n”,x2[j]);
      }
      for(j=0;j<5;j++)
      {
      printf(“%.3f \n”,max[j]);
      puts(name[a[j]]);
      puts(class[j]);
      }
      }
      float pp(float f[10][5])
      {
      float sum=0;int i,j; for(i=0,sum=0;i<10;i++) {
      for(j=0;j<5;j++)
      sum=sum+f[i][j];
      x1[i]=sum/5;
      }
      }
      float cc(float y[10][5]) {
      float sum=0;int i,j; for(j=0;j<5;j++)
      {
      for(i=0;i<10;i++)
      sum=sum+y[i][j];
      x2[j]=sum/10;
      }
      }
      float find(float z[10][5],s[5];int t[5])
      {
      int i,j;
      for(j=0,s[j]=z[0][j];j<5;j++)
      for(i=0;i<10;i++)
      if(s[j]<z[i][j]) {s[j]=z[i][j];t[j]=i;}
      }
    12. 写几个函数:
      ?输入10个职工的姓名和职工号;
      ?按职工号由小到大顺序排序,姓名顺序也随之调整; ?要求输入一个职工号,用折半法找出该职工的姓名,从主函数输入要查找的职工号,输出
      该职工姓名。
      解:
      #include<stdio.h>
      #define N 10
      find(int a[],b[])
      {
      int i,j,s,t,c[N][2]; for(i=0;i<N;i++)
      {c[i][1]=a[i];c[i][1]=i;} for(i=0;i<N;i++)
      for(j=0;j<N-i-1;j++) if(c[i][0]>c[i+1][0]) { t=c[i][0];c[i][0]=c[i+1][0];c[i+1][0]=t; s=c[i][1];c[i][1]=c[i+1][1];c[i+1][1]=s;}
      for(i=0;i<N;i++)
      b[i]=c[i][1];
      return;
      }
      lookfor(int h[],k ) {
      int i,j;
      for(i=0;i<N;i++) if(h[i]-k==0) j=i; return j;
      }
      void main()
      {
      int number[N],x[N],i,j,u,p;char name[N][20];
      for(i=0;i<N;i++) {
      gets(name[i]); scanf(“%d”,&number[i]); }
      scanf(“%d”,&p);
      find(number,x); u=lookfor(number,p); for(i=0;i<N;i++) {
      printf(“%d”,number[i]); puts(name[x[i]]); }
      puts(name[x[u]]); }
    13. 输入4个整数a,b,c,d,找出其中最大的数。用函数的递归调用来处理。
      解:
      #include <stdio.h> void main()
      {
      int max_4(int a,int b,int c,int d);
      int a,b,c,d,max; printf(“Please enter interger numbers:”); scanf(“%d%d%d%d”,&a,&b,&c,&d); max=max_4(a,b,c,d); printf(“max=%d \n”,max);
      }
      int max_4(int a,int b,int c,int d)
      {
      int max_2(int,int); int m;
      m=max_2(a,b);
      m=max_2(m,c);
      m=max_2(m,d);
      return(m);
      }
      int max_2(int a,int b) {
      if(a>b) return a;
      else return b;
      }
    14. 用递归法将一个整数n转换成字符串。例如,输入整数2008,应输出字符串“2008”。n
      的位数不确定,可以是任意位数的整数。
      解:
      #include <stdio.h>
      #include<math.h>
      int x[10];
      pf(unsigned long m,int n) {
      int y;
      if(n==0) {y=(int)(m%10);x[0]=y;}
      else {y=(unsigned long)((m-pf(m,n-1))/pow(10,n))%10;x[n]=y;}
      return(y);
      }
      void main()
      {
      unsigned long a,b;int i,j,k;char c[11];
      scanf(“%ld”,&a);
      for(j=0,b=a;b>0.1;j++,b/=10) ; pf(a,j-1);
      for(i=0,k=j-1;i<j;i++,k–) c[i]=x[k]+48;c[10]=?\0?;
      puts©;
      }
    15. 给出年、月、日,计算该日是该年的第几天。 解:
      #include <stdio.h>
      int find(int x,int y,int z) {
      int i,t,s,days=0;
      if(x%40) t=1;
      else t=0;
      for(i=1;i<y;i++)
      {
      if(i
      2) s=2-t;
      else s=0;
      days=days+30+i%2-s;
      }
      days=days+z;
      return(days);
      }
      void main()
      {
      int year,month,date,day; scanf(“%d %d %d”,&year,&month,&date); day=find(year,month,date); printf(“THE DATE IS THE %dth DAYS\n”,day); }
      第八章
    16. 输入三个整数,按由小到大的顺序输出。
      解:
      #include <stdio.h>
      void main()
      {
      int a,b,c,*p1,*p2,*p3,t; scanf(“%d,%d,%d”,&a,&b,&c);
      p1=&a;p2=&b;p3=&c;
      if(*p1>*p2) {t=p1;p1=p2;p2=t;}
      if(*p1>*p3) {t=p1;p1=p3;p3=t;}
      if(*p2>*p3) {t=p2;p2=p3;p3=t;}
      printf(“%d,%d,%d\n”,*p1,*p2,*p3); }
    17. 输入三个字符串,按由小到大的顺序输出。
      解:
      #define N 3
      #define M 20
      #include <stdio.h>
      void main()
      {
      char str0[N][M],str1[M],*p,*q; int i,l,m,n;
      q=str0;
      for(;p<q+N;p++)
      gets§;
      l=strcmp(q,q+1);
      if(l>0) {strcpy(str1,q);strcpy(q,q+1);strcpy(q+1,str1);}
      m=strcmp(q,q+2);
      if(m>0) {strcpy(str1,q);strcpy(q,q+2);strcpy(q+2,str1);}
      n=strcmp(q+1,q+2);
      if(n>0) {strcpy(str1,q);strcpy(q+1,q+2);strcpy(q+2,q+1);}
      for(p=q;p<q+N;p++)
      puts§;
      }
    18. 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三
      个函数;?输入10个数;?进行处理;?输出10个数。 解:
      #include <stdio.h>
      void main()
      {
      int number[10];
      input(number);
      max_min_value(number);
      output(number);
      }
      input(int number[10])
      {
      int i;
      printf(“input 10 numbers:”);
      for(i=0;i<10;i++)
      scanf(“%d”,&number[10]);
      }
      max_min_value(int array[10]) {
      int *max, *min, *p, *array_end;
      array_end=array+10;
      max=min=array;
      for(p=array+1;p<array_end;p++)
      if(*p>*max) max=p;
      else if(*p<*min) min=p;
      *p=array[0]; array[0]=*min; *min=*p;
      *p=array[9]; array[9]=*max; *max=*p;
      return;
      }
      output(int array[10])
      {
      int *p;
      printf(“now,they are:”);
      for(p=array;p<=array+9;p++)
      printf(“%d ”,*p);
      }
    19. 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函
      数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。 解:
      #define N 10
      #include<stdio.h>
      void shift(float *p,int x) {
      float a[N],*q,*o;int i; o=a;q=p;
      for(i=0;i<x;i++)
      (o+i)=(q+N-x+i); for(p=p+N-1;p>=q;p–) p=(p-x);
      for(i=0;i<x;i++)
      (q+i)=(o+i);
      return;
      }
      void main()
      {
      float shuzhu[N],*u,*v; int h,i;u=v=shuzhu; scanf("%f",&h);
      for(;u<v+N;u++)
      scanf(“%f”,u);
      shift(v,h);
      for(u=v;u<v+N;u++) printf(“%.2f ”,*u);
      printf(“\n”);
      }
    20. 有n个学生围成一圈,顺序排号。从第1个学生开始报数(从1到3报数),凡报到3的
      学生退出圈子,到最后只留下一名学生,问最后留下的是原来的第几号学生。
      解:
      #define N 5
      #include<stdio.h>
      void main()
      {
      int i,j,k,a[N+1],*p; for(i=0,p=a;p<=a+N;i++,p++)
      *p=i;
      p=a+1;k=N;
      for(i=0,j=1;k!=1;j++) {
      if(p>(a+N)) p=a+1; if(*p!=0) i++; if((i-3)==0) {*p=0;i=0;k–;}
      p++;
      }
      for(i=1;i<=N;i++)
      if(a[i]!=0) printf(“The last number is %d\n”,a[i]); }
    21. 写一函数,求一个字符串的长度。在主函数种输入字符串,并输出其长度。
      解:
      int strlen(char *s)
      {
      int n=0;
      while(*s)
      {n++;s++;}
      return n;
      }
      #include <stdio.h>
      void main()
      {
      char s[255];
      gets(s);
      printf(“长度是 %d \n”,strlen(s)); }
    22. 有一字符串a,内容为: “My name is Li jilin.”,另有一字符串b,内容为: “Mr. Zhang Haoling
      is very happy.”。写一函数,将字符串b中从第5个到第17个字符复制到字符串a中,取代
      字符串a中第12个字符以后的字符。输出新的字符串a。 解:
      #define N 100
      #include<stdio.h>
      #include<string.h>
      void main()
      {
      void change_name(char *p1,char *p2);
      char a[N]=“My name is Li jilin.”,*p1;
      char b[N]=“Mr. Zhang Haoling is very happy.”,*p2; p1=a,p2=b;
      change_name(p1,p2);
      printf(“%s\n”,p1);
      }
      void change_name(char *p1,char *p2)
      {
      strncpy(p1+11,p2+4,13); *(p1+23)=?.?;
      *(p1+24)=\0;
      }
    23. 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。
      解:
      #include <stdio.h>
      void main ()
      {
      int upp=0,low=0,dig=0,spa=0,oth=0,i=0;
      char *p,s[20];
      printf(“input string:”);
      while((s[i]=getchar())!=?\n?) i++;
      p=&s[0];
      while(*p!=?\n?)
      {
      if((*p>=?A?)&&(*p<=?Z?)) ++upp;
      else if((*p>=?a?)&&(*p<=?z?)) ++low;
      else if(*p==? ?) ++spa;
      else if((*p>=?0?)&&(*p<=?9?)) ++dig;
      else ++oth;
      p++;
      }
      printf(“upper case:%d,lower case:%d,space:%d,digit:%d,other:%d”,upp,low,spa,dig,oth);
      }
    24. 在主函数中输入10个等长的字符串。用另一函数对它们排序,然后在主函数输出这10
      个已排好序的字符串。
      解:
      #include <stdio.h> #include<string.h> void main ()
      {
      int i;char p[10],str[10][20];
      for(i=0;i<10;i++)
      p[i]=str[i];
      printf(“input 10 strings:\n”);
      for(i=0;i<10;i++)
      scanf(“%s”,p[i]);
      sort§;
      printf(“now,the sequence is:\n”);
      for(i=0;i<10;i++)
      printf(“%s\n”,p[i]);
      }
      sort(char p[])
      {
      int i,j;char temp;
      for(i=0;i<9;i++)
      for(j=0;j<9-i;j++)
      if(strcmp(
      (p+j),
      (p+j+1))>0)
      {temp=*(p+j); (p+j)=(p+j+1); *(p+j+1)=temp;}
      }
    25. 将n个数按输入时顺序的逆序排列,用函数实现。 解:
      #include <stdio.h> void main ()
      {
      int i,n;
      char *p,num[20];
      printf(“input n:”);
      scanf(“%d”,&n);
      printf(“input these numbers:\n”);
      for(i=0;i<n;i++)
      scanf(“%d”,&num[i]);
      p=&num[0];
      sort(p,n);
      printf(“now, the sequence is:\n”);
      for(i=0;i<n;i++)
      printf(“%d”,num[i]);
      }
      sort(char *p,int m) {
      int i;char temp,*p1,*p2;
      for(i=0;i<m/2;i++)
      {p1=p+i; p2=p+(m-1-i); temp=*p1; *p1=*p2;*p2=temp;}
      }
    26. 编一个函数inv,将数组a中n个整数按相反顺序存放,用指针变量作为调用该函数时
      的实参。
      解:
      #include <stdio.h> void inv(int a,int n) {
      int temp,q,i=0;
      q=a+n-1;
      while(a+i<q)
      {
      temp=
      (a+i);
      (a+i)=*q;*q=temp;
      i++;q–;
      }
      }
      void main ()
      {
      int a[10]={3,7,9,11,0,6,7,5,4,2} ;
      int k,*p;
      printf(“the original array:\n”);
      for(p=a,k=0;k<10;k++)
      printf(“%4d”,*p++);
      p=a;
      inv(p,10 );
      printf(“the array has been inverted:\n”);
      for(p=a,k=0;k<10;k++)
      printf(“%4d,”,*p++);
      printf(“\n”);
      }
    27. 输入一个字符串,内有数字和非数字字符,例如:a123x456 17960? 302tab5876将其中
      连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0],456放在a[1],
      统计共有多少个整数,并输出这些数。
      解:
      #include <stdio.h>
      void main ()
      {
      char str[50],pstr;
      int i,j,k,m,e10,digit,ndigit,a[10],pa;
      printf(“input a string:\n”);
      gets(str);
      printf(“\n”);
      pstr=&str[0]; pa=&a[0]; ndigit=0; i=0; j=0;
      while(
      (pstr+i)!=?\0?)
      {
      if((
      (pstr+i)>=?0?)&&((pstr+i)<=?9?)) j++; else
      {
      if(j>0)
      {
      digit=
      (pstr+i-1)-48;
      k=1;
      while(k<j)
      {
      e10=1;
      for(m=1;m<=k;m++)
      e10*=10;
      digit+=((pstr+i-1-k)-48)e10;
      k++;
      }
      pa=digit;
      ndigit++;
      pa++;
      j=0;
      }
      }
      i++;
      }
      if(j>0)
      {
      digit=
      (pstr+i-1)-48;
      k=1;
      while(k<j)
      {
      e10=1;
      for(m=1;m<=k;m++)
      e10
      =10;
      digit+=(
      (pstr+i-1-k)-48)*e10;
      k++;
      }
      pa=digit;
      ndigit++;
      pa++;
      j=0;
      }
      printf(“There are %d numbers in this line. They are:\n”,ndigit);
      j=0;
      pa=&a[0];
      for(j=0;j<ndigit;j++) printf(“%d ”,
      (pa+j));
      printf(“\n”);
      }
    28. 写一函数,将一个3*3的整型二维数组转置,即行列互换。
      解:
      #include <stdio.h> void main ()
      {
      int a[3][3],p,i;
      printf(“input matrix:\n”);
      for(i=0;i<3;i++)
      scanf(“%d %d %d”,&a[i][0],&a[i][1],&a[i][2]);
      p=&a[0][0];
      move§;
      printf(“now, matrix:\n”);
      for(i=0;i<3;i++)
      printf(“%d %d %d\n”,a[i][0],a[i][1],a[i][2]);
      }
      move(int pointer) {
      int i,j,t;
      for(i=0;i<3;i++)
      for(j=i;j<3;j++)
      {t=
      (pointer+3
      i+j); (pointer+3i+j)= (pointer+3j+i); (pointer+3j+i)=t;}
      }
      }
      第九章
    29. 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。 解:
      struct
      {int year;
      int month;
      int day;
      }date;
      void main()
      {
      int days;
      printf(“Input year,month,day:”);
      scanf(“%d,%d,%d”,&date.year,&date.month,&date.day);
      switch(date.month)
      {
      case 1: days=date.day; break;
      case 2: days=date.day+31; break;
      case 3: days=date.day+59; break;
      case 4: days=date.day+90; break;
      case 5: days=date.day+120; break;
      case 6: days=date.day+31; break;
      case 7: days=date.day+181; break;
      case 8: days=date.day+212; break;
      case 9: days=date.day+243; break;
      case 10: days=date.day+273; break;
      case 11: days=date.day+304; break;
      case 12: days=date.day+334; break; }
      if((date.year%40&&date.year%100!=0||date.year%4000)&&date.month>=3) days+=1;
      printf(“\n%d/%d is the %dth day in%d.”,date.month,date.day,days,date,year); }
    30. 写一个函数days,实现上面的计算。由主函数将年、月、日传递给days 函数,计算后将日子数传回主函数输出。
      解:
      struct y_m_d
      {int year:
      int month;
      int day;
      }date;
      int days(struct y_m_d date1)
      {
      int sum;
      switch(date1.month)
      {
      case 1:sum=date1.day; break;
      case 2:sum=date1.day+31; break;
      case 3:sum=date1.day+59; break;
      case 4:sum=date1.day+90; break;
      case 5:sum=date1.day+120; break;
      case 6:sum=date1.day+151; break;
      case 7:sum=date1.day+181; break;
      case 8:sum=date1.day+212; break;
      case 9:sum=date1.day+243; break
      case 10:sum=date1.day+243; break
      case 11:sum=date1.day+243; break
      case 12:sum=date1.day+243; break }
      if((date1.year%40&&date1.year%100!=0||date1.year%4000)&&date1.month>=3)
      sum+=1;
      return sum;
      }
    31. 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num、name、score[3],用主函数输入这些记录,用print函数输出这些记录。 解:
      #define N 5
      struct student
      {char num[6];
      char name[8];
      int score[4];
      }stu[N];
      void main()
      {
      int i,j ;
      for(i=0;i<N;i++)
      {
      printf(“\Input score of student %d:\n”,i+1);
      printf(“no.:”);
      scanf(“%s”,stu[i].num);
      printf(“name:”);
      scanf(“%s”,stu[i].name);
      for(j=0;j<3;j++)
      {
      printf(“score%d:”j+1);
      scanf(“%d”,&stu[i].score[j]);
      }
      printf(“\n”);
      }
      print(stu);
      }
      print(struct student stu[6])
      {
      int i,j;
      printf(“%5s%10s”,stu[i].num,stu[i].name);
      for(j=0;j<3;j++)
      printf(“%9d”,stu[i].score[j]);
      print(“\n”);
      }
    32. 在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。
      解:
      #define N 5
      struct student
      {char num[6];
      char name[8];
      int score[4]
      }stu[N];
      input(struct student stu[])
      {
      int i,j;
      for(i=0;i<N;i++) {
      printf(“input scores of student %d:\n”,i+1);
      printf(“NO.:”);
      scanf(“%s”,stu[i].num);
      printf(“name: ”);
      scanf(“%s”, stu[i].name);
      for(j=0;j<3;j++)
      {
      printf(“score%d:”,j++);
      scanf(“%d”, &stu[i].score[j]);}
      }
      printf(“\n”);
      }
      }
    33. 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的
      数据,要求输出各学生3门课的平均成绩,然后按照平均成绩由高到低输出学生的信息(包
      括学号、姓名、3门课成绩、平均分数)。 解:
      #define N 10
      struct student
      { char num[6];
      char name[8];
      int score[4];
      float avr;
      }stu[N];
      void main()
      {
      int i,j,max,maxi,sum;
      float average;
      for(i=0;i<N;i++)
      {
      printf(“\nInput scores of student %d:\n”,i+1);
      printf(“NO.:”);
      scanf(“%s”,stu[i].num);
      printf(“name: ”);
      scanf(“%s”, stu[i].name);
      for(j=0;j<3;j++)
      {
      printf(“score%d:”,j++);
      scanf(“%d”, &stu[i].score[j]);}
      }
      }
      average=0;max=0;maxi=0; for(i=0;i<N;i++)
      { sum=0;
      for(j=0;j<3;j++)
      sum+=stu[i].score[j];
      stu[i].avr=sum/3.0;
      average+=stu[i].avr;
      if(sum>max) {max=sum; maxi=i;}
      }
      average/=N;
      printf(“NO. name score1 score2 score3 average\n”); for(i=0;i<N;i++)
      {
      printf(“%5s%10s”,stu[i].num,stu[i].name);
      for(j=0;j<3;j++)
      printf(“%9d”,stu[i].score[j]);
      printf(“%8.2f\n”,stu[i].avr); }
      printf(“average=%6.2f\n”,average); printf(“The highest score is: %s,score total:%d.”,stu[maxi].name,max);
      }
    34. 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最
      后留在圈子中的人原来的序号。
      解:
      #define N 13
      struct person
      {int number;
      int nextop;
      }link[N+1];
      void main()
      {
      int i,count,h;
      for(i=1;i<=N;i++)
      {
      if(i==N) link[i].nextp=1;
      else link[i].nextp=i+1;
      link[i].number=i;
      }
      printf(“\n”);
      count=0;
      h=N;
      printf(“sequence that person2 leave the circle:\n”); while(count<N-1)
      {
      i=0;
      while(i!=3)
      {
      h=link[h].nextp;
      if(link[h].number)
      i++;
      }
      printf(“%4d”,link[h].number); link[h].number=0; count++;
      }
      printf(“\nThe last one is”);
      for(i=1;i<=N;i++)
      if(link[i].number) printf(“%3d”,lin[i].number); }
    35. 建立由3个学生数据结点构成的单向动态链表,向每个结点输入学生的数据(每个学生
      的数据包括学号、姓名、成绩),然后逐个输出各结点的数据。
      #include<stdio.h>
      #include<malloc.h> #define LEN sizeof(struct student)
      struct student
      { int num;
      char sex;
      float score;
      struct student *next; };
      void main()
      { struct student *head,*p,*q;
      head=p=q=(struct student *)malloc(LEN);
      scanf(“%d,%s,%f”,&p->num,&p->sex,&p->score);
      p=(struct student *)malloc(LEN);
      scanf(“%d,%s,%f”,&p->num,&p->sex,&p->score);
      q=(struct student *)malloc(LEN);
      scanf(“%d,%s,%f”,&q->num,&q->sex,&q->score);
      head->next=p; p->next=q;q->next=NULL;
      p=head;
      printf(“\n结点1:%d,%s,%6.2f\n”,p->num,p->sex,p->score);
      p=p->next;
      printf(“\n结点2:%d,%s,%6.2f\n”,p->num,p->sex,p->score);
      p=p->next;
      printf(“\n结点3:%d,%s,%6.2f\n”,p->num,p->sex,p->score); }
      第十章
    36. 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件test中保存。输入的字符串以“~”结束。
      解:
      #include <stdio.h>
      main()
      {
      File *fp;
      Char str[100];
      Int I=0;
      If((fp=fopen(“test”,”w”)==NULL)
      {printf(“Can not open the file\n”);
      exit(0);
      }
      printf(“Input a string:\n”);
      gets(str);
      while(str[i]!=?!?)
      {if (str[i]>=?a?&&str[i]<=?z?)
      str[i]=str[I-32];
      fputc(str[i],fp);
      I++;
      }
      fclose(fp);
      fp=fopen(“test”,”r”);
      fgets(str,strlen(str)+1,fp);
      printf(“%s\n”,str);
      fclose(fp);
      }
    37. 有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺
      序排列),输出到一个新文件C中去。 解:
      #include<stdio.h> main()
      {
      FILE *fp;
      Int I,j,n,i1; Char c[100],t ,ch; If((fp=fopen(“a1”,”r”))==NULL)
      {printf(“can not open the file\n”);
      exit(0);
      }
      printf(“\n file A:\n”);
      for(I=0;(ch=fgetc(fp)!=EOF;I++)
      {c[i]=ch;
      putchar(c[i]); }
      fclose(fp);
      i1=I;
      if((fp=fopen(“b1”,”r”))==NULL)
      {printf(“\n can not ipen the file”);
      exit(0);
      }
      printf(“\n file B:\n”);
      for(I=i1;(ch=fgenc(fp))!=EOF;I++)
      {c[i]=ch;
      putchar(c[i]); }
      fclose(fp);
      n=I;
      for(i=0;I<n;I++) for(j=I+1;j<n;j++) if(c[i]>c[j]) {t=c[i];
      c[i]=c[j];
      c[j]=t;
      printf(“\n file C:\n”);
      fp=fopen(“c1”,”w”);
      for(I=0;I<n;I++)
      {putc(c[i],fp);
      putchar(c[i]); }
      fclose(fp);
      }
    38. 有5个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号、姓名、3
      门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。
      解:
      #include<stdio.h>
      struct student
      {char num[10];
      char name[8];
      int score[3];
      float ave;
      }stu[5];
      main()
      {int I,j,sum;
      FILE *fp;
      For(I=0;I<5;I++)
      {printf(“\n input score of student%d:\n”,I+1);
      printf(“NO.:”);
      scanf(“%s”,stu[i].num);
      printf(“name:”);
      scanf(“%s”,stu[i].name);
      sum=0;
      for(j=0;j<3;j++)
      {printf(“score %d :”j+1);
      scanf(“%d”,&stu[i].score[j]);
      sum+=stu[i].score[j]; }
      stu[i].ave=sum/3.0 }
      fp=fopen(“stud”,”w”);
      for(I=0;I<5;I++)
      if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)
      printf(“File write error\n”);
      fclose(fp);
      fp=fopen(“stud”,”r”);
      for(I=0;I<5;I++)
      {fread(&stu[i],sizeof(struct student),1,fp);
      printf(“%s,%s,%d,%d,%d,%6.2f\n”,stu[i].num,stu[i].name,stu[i].score[0], stu[i].score[1],
      stu[i].score[2] ,stu[i].ave);
      }
      }
    39. 将上题stud文件中的学生数据,按平均分进行排序处理,将已排序的学生数据存入一个
      新文件stu-sort中。
      解:
      #include <stdio.h>
      #define N 10
      struct student
      {char num[10]; char name[8];
      int score[3];
      float ave;
      }st[N],temp;
      main()
      {
      FILE *fp;
      Int I,j,n;
      If((fp=fopen(“stud”,”r”))==NULL)
      {printf(“can not open the file”);
      exit(0);
      }
      printf(“\n file „stud?:”);
      for(I=0;fread(&st[i],sizef(struct student),1,fp)!=0;I++)
      {printf(“\n%8s%8s”,st[i].num,st[i].name);
      for(j=0;j<3;j++)
      printf(“%8d”,st[i].score[j]);
      printf(“%10.f”,st[i].ave);
      fclose(fp);
      n=I;
      for(I=0;I<n;I++)
      for(j=I+1;j<n;j++)
      if(st[i].ave<st[j].ave)
      {temp=st[i];
      st[i]=st[j];
      st[j]=temp; }
      printf(“\nnow:”);
      fp=fopen(“stu-sort”,”w”);
      for(I=0;I<n;I++)
      {fwrite(&st[i],sizeof(struct student),1,fp);
      printf(“\n%8s%8s”,st[i].num,st[i].name);
      for(j=0;j<3;j++)
      printf(“%8d”,st[i].score[j]);
      printf(“%10.2f”,st[i].ave);
      fclose(fp);
      }
    40. 将上题以排序的学生成绩文件进行插入处理。插入一个学生的3门课成绩,程序先计算
      新插入学生的平均成绩,然后将它按成绩高低顺序插入,插入后建立一个新文件。
      解:
      #include <stdio.h>
      struct student
      {char num[10];
      char name[8];
      int score[3];
      float ave;
      }st[10],s;
      main()
      {FILE *fp, * fp1 ; int I,j,t,n;
      printf(“\n NO.:”);
      scanf(“%s”,s.num);
      printf(“name:”);
      scanf(“%s”,s.name);
      printf(“score1,score2,score3:”);
      scanf(“%d,%d,%d”,&s. score[0], &s. score[1], &s. score[2]); s.ave=(s.score[0]+s.score[1]+s.score[2])/3.0;
      if((fp=fopen(“stu_sort”,”r”))==NULL)
      {printf(“can not open file.”);
      exit(0);
      }
      printf(“original data:\n”);
      for(I=0;fread(&st[i],sizeof(struct student),1,fp)!=0;I++)
      {printf(“\n%8s%8s”,st[i].num,st[i].name);
      for(j=0;j<3;j++)
      printf(“%8d”,st[i].score[j]);
      printf(“%10.2f”,st[i].ave);
      }
      n=I;
      for(t=0;st[t].ave>s.ave&&t<n;t++);
      printf(“\nnow:\n”);
      fp1=fopen(“sort1.dat”,”w”);
      for(I=p;j<t;I++) {fwrite(&st[i],sizeof(stuct student),1,fp1);
      print(“\n%8s%8s”,st[i],num,st[i].name);
      for(j=0;j<3;j++)
      ptintf(“%8d”,st[i].score[j]);
      printf(“%10.2f”,st[i].ave);
      }
      fwrite(&s,sizeof(struct student),1,fp1);
      printf(“\n%8s%7s%7d%7d%7d%10.2f”,s.num,s.name,s.score[0],s.score[1],s.score[2],s.ave);
      for(I=t;I<n;I++)
      {fwrite(&st[i],sizeof(struct student),1,fp1);
      printf(“\n %8s%8s”,st[i].num,st[i].name);
      for(j=0;j<3;j++)
      printf(“%8d”,st[i].score[j]);
      printf(“10.2f”,st[i].ave);
      fclose(fp);
      fclose(fp1);
      }
    41. 上题结果仍存入原有的stu_sort文件,而不另建立新文件。 解:
      #include<stdio.h>
      struct student
      {char num[10];
      char name[8];
      int score[3];
      float ave;
      }st[10],s;
      main()
      {FILE *fp, *fp1;
      int I ,j,t,n;
      printf(“\nNO.:”);
      scanf(“%s?,s.num);
      printf(“name:”);
      scanf(“%s?,s.name);
      printf(“score1,score2,score3:”);
      scanf(“%d%d%d”,&s.score[0]+&s.score[1]+&s.score[1], &s.score[2]);
      s.ave=( s.score[0]+ s.score[1]+ s.score[2])/3.0;
      if((fp=fopen(“stu=sort”,”r”))==NULL)
      {printf(“can not open the file.”);
      exit(0);
      }
      printf(“original data:\n”);
      for(I=0;fread(&st[i],sizeof(struct student),1,fp)!=0;I++)
      {printf(“\n%8s%8s”,st[i].num,st[i].name);
      for(j=0;j<3;j++)
      printf(“%8d”,st[i].score[j]);
      printf(“%10.2f”,st[i].ave);
      }
      fclose(fp);
      n=I;
      for(t=0;st[t].ave>s.ave+&&t<n;t++);
      ptintf(“\nnow:\n”);
      fp=fopen(“stu_sort”,”w”);
      for(I=0;I<t;I++)
      {fwrite(&st[i],sizeof(struct student),1,fp);
      printf(“\n%9s%8s%8d%8d%8d%10.2f”,s.num,s.name,s.score[0],s.score[1] s.score[2] s.ave);
      for(I=t;I<n;I++)
      {fwrit(&sr[i],sizeof(struct srudent),1,fp);
      printf(“\n %8s%8s”,st[i].num,st[i].name);
      for(j=0;j<3;j++)
      printf(“%8d”,st[i].score[j]);
      printf(“%10.2f”,st[i].ave);
      }
      fclose(fp);
      }
    42. 有一磁盘文件emploee,文件内存放职工的数据,每个职工的数据包括职工姓名、职工号、性别、年龄、住址、工资、健康状况、文化程度。今要求将职工名、工资的信息单独抽出来另建一个简明的职工工资文件。
      解:
      #include<stdio.h>
      struct emploee
      {char num[6];
      char name[10];
      char sex[2];
      int age;
      char addr[20];
      int salary;
      char health[8];
      char class[10];
      }en[10];
      struct emp
      {char name[10];
      int salary;
      }em-case[10];
      main()
      {FILE fp1, fp2;
      int I,j;
      if ((fp1=fopen(“emploee”,”r”))==NULL)
      {printf(“can not open the file.”);
      exit(0);
      }
      printf(“\n NO. name sex age addr salary health class\n”);
      for(I=0;fread(&em[i],sizeof(struct emploee),1,fp1)!=p;I++)
      {printf(“\n%4s%8s%4s%6s%10s%6s%10s%8s”,em[i].num,em[i].name,em[i].sex, em[i].age,
      em[i].addr, em[i].salary, em[i].health, em[i].class);
      strcpy(em_case[i].name, em[i].name);
      em_case[i].salary=en[i].salary; }
      printf(“\n\n
      ***************************************”); if((fp2=fopen(“emp_salary”,”wb”))==NULL)
      {printf(“can not open the file.”);
      exit(0);}
      for(j=0;j<I;j++)
      {if(fwrite(&en_case[j],sizeof(struct emp),1,fp2)!=1)
      printf(“error!”);
      printf(“\n %12s%10d”,em_case[j].name,em_case[j].salary); }
      printf(“\n*******************************************”); fclose(fp1);
      fclose(fp2);
      }
    43. 从上题的“职工工资文件”中删去一个职工的数据,再存回原文件。 解:
      #incude <stdio.h>
      #incude <string.h>
      struct emploee
      {char name[10];
      int salary;
      }emp[20];
      main()
      {FILE *fp;
      int I,j,n,flag;
      char name[10];
      int salary;
      if((fp=fopen(“emp_salary”,”rb”))==NULL)
      {printf(“can not open file.”);
      exit(0);
      }
      printf(“\n original data:”);
      for(I=0;fead(&emp[i],sizeof(struct emploee),1,fp)!=0;I++)
      printf(“\n %8s %7d”,emp[i].name,emp[i].salary);
      fclose(fp);
      n=I;
      printf(“\n input name deleted:”);
      scanf(“%s”,name);
      for(flag=1,I=0;flag&&I<n;I++)
      {if(strcmp(name,emp[i].name)==0) {for(j=I;j<n-1;j++)
      {strcmp(name,emp[i].name)==0
      {for(j=I;j<n-1;j++) {strcpy(emp[j].name,emp[j+1].name);
      emp[j].salary=emp[j+1].salary;
      }
      flag=0; }
      } if(!flag)
      n=n-1; else
      printf(“\n Now,the content of file:\n”);
      fp=fopen(“emp-dalary”,”wb”);
      for(I=p;I<n;I++)
      fwrite(&emp[i],sizeof(struct emploee),1,fp);
      fclose(fp);
      fp=fopen(“emp_salary”,”r”);
      for(I=0;fread(&emp[i],sezeof(struct emploee),1,fp)!=0;I++)
      printf(“\n%8s%7d”,emp[i].name,emp[i].salary); fclose(fp);
      }
    44. 从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中,再从该
      文件中读入这些数据,将其中小写字母转换成大写字母后在显示屏上输出。
      解:
      #include<stdio.h> main()
      {int I,flag;
      char str[80],c;
      FILE *fp;
      Fp=fopen(“text”,”w”);
      Flag=1;
      While(flag1)
      {printf(“\n Input string:\n”);
      ges(str);
      fprintf(fp,”%s”,str);
      printf(“\nContinue?”);
      c=getchar();
      if((c
      ?N?)||(c==?n?))
      flag=0;
      getchar();
      }
      fcolse()fp;
      fp=fopen(“text”,”r”);
      while(fscanf(fp,”%s”,str)!=EOF)
      {for(I=0;str[i]!=?\0?;I++)
      if((str[i]>=?a?)&& (str[i]<=?z?))
      str[i]-=32;
      printf(“\n%s\n”,str);
      }
      fclose(fp);
      }
    展开全文
  • 谭浩强C语言程序设计第五版 第4章 课后习题 答案 1.什么是算术运算?什么是关系运算?什么是逻辑运算? 答:算术运算时数学里基础的加减乘数求余数等;关系运算时求两个或者多个变量或者表达式之间的关系;逻辑运算...

    谭浩强C语言程序设计第五版 第4章 课后习题 答案

    第四章 选择结构程序设计

    1. 什么是算术运算?什么是关系运算?什么是逻辑运算?

    【答案解析】

    算熟运算:

    算术运算即“四则运算”,是加法、减法、乘法、除法、乘方、开方等几种运算的统称。

    其中加减为一级运算,乘除为二级运算,乘方、开方为三级运算。在一道算式中,如果有多级运算存在,则应先进行高级运算,再进行低一级的运算。

    C语言中的算熟运算符包括:+-*/++--% 等种类。

    如果只存在同级运算;则从左至右的顺序进行;如果算式中有括号,则应先算括号里边,再按上述规则进行计算。

    示例:$ (1 + 1)^{2} * 4+5 * 3$

    解析:

    1. 先进行括号内运算1+1,然后进行乘方运算得到结果4.
    2. 接下来与4相乘,得到结果16
    3. 因为乘法优先级大于加法,因此先进行5*3,得到结果15
    4. 最终相加得到结果31

    结果:31

    关系运算:

    关系的基本运算有两类:一类是传统的集合运算(并、差、交等),另一类是专门的关系运算(选择、投影、连接、除法、外连接等),而在C语言中,关系运算通常被认为是比较运算,将两个数值进行比较,判断比较结果是否符合给定的条件。

    常见的关系运算符包括:<<=>>===!= 等种类。

    其中,前4种关系运算符(<、<=、>、>= )的优先级别相同,后2种(==、!=)也相同。而前4种高于后2种。

    例如, > 优先于 == 。而 >< 优先级相同。
    并且,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符(=)。

    逻辑运算:

    在逻辑代数中,有与、或、非三种基本逻辑运算。表示逻辑运算的方法有多种,如语句描述、逻辑代数式、真值表、卡诺图等。而在C语言中,逻辑运算通常用于使用逻辑运算符将关系表达式或其它逻辑量连接起来组成逻辑表达式用来测试真假值。

    常见的逻辑运算符包括:&&||! 等种类

    && 与是双目运算符,要求有两个运算对象,表示两个运算对象都成立,则结果为真,否则结果为假。

    例如:(a<b) && (x>y),表示(a<b)和(x>y)同时成立则为真。

    ||:是双目运算符,要求有两个运算对象,表示两个运算对象只要任意一个成立,则结果为真,否则结果为假。

    例如:(a<b) && (x>y),表示(a<b)和(x>y)两个对象中任意一个成立则结果为真。

    **!**是单目运算符,只要求有一个运算对象,表示取运算对象反义,运算对象为真则结果为假,运算对象结果为假则结果为真。

    例如:!(a>b),表示(a>b)成立时结果为假,不成立时结果为真。

    若在一个逻辑表达式中包含多个逻辑运算符,则优先次序为: ! > && > ||。当然若一个逻辑表达式中包含括号括起来的子逻辑,则优先括号内的子逻辑判断。

    示例:

    (1>2)||(2>3)&&(4>3) 结果为0
    !(1>2)||(2>3)&&(4>3)结果为1

    注:&&优先级大于||,((2>3)&&(4>3))无法同时成立,则结果为假,然后与(1>2)结果进行逻辑或运算,两者都为假因此第一次结果为假。 而第二次!优先级最高,先对(1>2)的结果取逻辑非,得到结果为真,因此结果为真。

    2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?

    答案:

    在C语言中逻辑常量只有两个,即0和1,用来表示两个对立的逻辑状态,其中0表示假,1表示真。

    逻辑变量与普通代数一样,也可以用字母、符号、数字及其组合成为的逻辑表达式表示。

    对于系统来说,判断一个逻辑量的值时,系统会以0作为假,以非0作为真。例如3&&5的值为真,系统给出3&&5的值为1

    3. 写出下面各逻辑表达式的值。设a=3,b=4,c=5。

    (1)a + b > c && b == c

    (2)a || b + c && b - c

    (3)!(a > b) && !c || 1

    (4)!(x = a) && (y = b) && 0

    (5)!(a + b) + c - 1 && b + c / 2

    解题思路:

    1. 关系运算符的优先级高于赋值运算符,但是低于算术运算符;
    2. &&表示两边条件同为真则成立,||表示两边条件任意一个为真则成立,!取条件反义。
    3. 逻辑运算符优先级: ! > && > ||
    4. 有括号优先括号。
    3.1 题目:a + b > c && b == c -> 3+4>5&&4==5

    解析: 3+4>5 优先3+4得到结果7,因此7>5结果为真; 4==5为假,一真一假逻辑与最终结果为假。

    答案: 0

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", a || b + c && b - c);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版 谭浩强 第四章 课后习题 答案

    3.2 题目:a || b + c && b - c -> 3||4 + 5 && 4-5

    解析: 优先算术运算4+5得到7,非0则为真,4-5得到-1,非0则为真,接下来逻辑与判断,最终逻辑或判断

    答案: 1

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", a || b + c && b - c);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版

    3.3 题目:!(a > b) && !c || 1 -> !(3>4) && !5 || 1

    解析 : !优先级最高,!(3>4)最终结果为真,!5为假; 其次 &&,真&&假得到假,最终||,1为真,假或真为真

    答案: 1

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", !(a > b) && !c || 1);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版课后答案

    3.4 题目:!(x = a) && (y = b) && 0 -> !(x=3) && (y=4)&&0

    解析: 这里&&优先级最低是最后一个逻辑运算,因此不管如何,最终&&0,则肯定为假

    答案: 假-0

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	int x, y;
    	printf("%d\n", !(x = a) && (y = b) && 0);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版课后习题答案

    3.5 题目:!(a + b) + c - 1 && b + c / 2 -> !(3+4)+5-1 && 4+5/2

    解析: 在vs中优先对(a+b)取非得到0,0+5-1结果为4,因此最终为真(此题涉及不同平台结果不同的问题,因为在有的平台下编译器会优先算术运算,则最终取非得到结果为假)

    **答案: ** 1

    #include <stdio.h>
    int main()
    {
    	int a = 3, b = 4, c = 5;
    	printf("%d\n", !(a + b) + c - 1);
    	printf("%d\n", !(a + b) + c - 1 && b + c / 2);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计课后答案谭浩强

    4. 有3个整数a, b, c,由键盘输入,输出其中最大的数。

    解题思路: 每个数字两两与剩余两个数字进行比较,若比剩下的两个数大则最大,例如:a>b && a>c则a是最大的

    答案:

    #include <stdio.h>
    int main()
    {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        if (a == b && a == c) {
            printf("Three numbers are equal\n");
        }else if (a == b && a > c) {
            printf("a and b are the largest number\n", a); 
        }else if (a == c && a > b) {
            printf("a and c are the largest number\n", a); 
        }else if (b == c && b > a) {
            printf("c and b are the largest number\n", a); 
        }else if (a > b && a > c) {
            printf("a=%d is the largest number\n", a); 
        }else if (b > a && b > c) {
            printf("b=%d is the largest number\n", b); 
        }else {
            printf("c=%d is the largest number\n", c); 
        }   
        return 0;
    }
    

    C语言程序设计第五版 谭浩强

    5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000 的正数。若不是,则要求重新输入。

    解题思路: 首先判断输入的数字是否大于1000且是正数,然后使用sqrt函数对数据进行取平方根,最主要的是最终在输出是调整输出格式,小数部分为0位,只需要正数部分,且整数部分不会超过4位,

    答案:

    #include <stdio.h>
    #include <math.h>
    int main()
    {
    	float a, b;
    	scanf_s("%f", &a);
    	if (a >= 1000 || a < 0) {
    		printf("请输入小于1000的正数\n");
    		scanf_s("%f", &a);
    		b = sqrt(a);
    	}
    	else {
    		b = sqrt(a);
    	}
    	printf("a=%4.0f, b=%4.0f\n", a, b);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    课后习题 答案

    6. 有一个函数,编写程序,输入x的值,输出y相应的值。

    y={x   (x<1)2x1  (1<=x<10)3x11(x>=10) y= \begin {cases} x\qquad\qquad\ \ \ (x<1)\\2x-1\qquad\ \ (1<=x<10)\\3x-11\qquad(x>=10) \end{cases}

    解题思路: 根据输入的不同x值进行条件判断,不同的条件采用不同的表达式进行计算即可

    答案:

    #include <stdio.h>
    int main()
    {
    	int x, y;
    	scanf_s("%d", &x);
    	if (x < 1) {
    		y = x;
    	}
    	else if (x >= 1 && x < 10) {
    		y = 2 * x - 1;
    	}
    	else {
    		y = 3 * x - 11;
    	}
    	printf("y = %d\n", y);
    	system("pause");//这一句是为了让控制台不退出
    	return 0;
    }
    

    C语言程序设计第五版第六题答案

    7. 有一个函数,

    y={1(x<0)0   (x=0)1   (x>0) y= \begin {cases} -1\qquad(x<0) \\ 0\qquad\ \ \ (x=0) \\ 1\qquad\ \ \ (x>0) \end{cases}

    有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后,上机运行程序,观察和分析结果。

    #include <stdio.h>
    
    int main()
    {
    	int x, y;
        printf("enter x:");
        scanf("%d", &x);
        y=-1;
        if (x != 0)
    		if (x > 0)
                y=1;
        	else
            	y=0;
        printf("x=%d,y=%d\n", x, y);
        return 0;
    }
    

    解题思路: if语句使用过程中,else总是匹配距离自己最近的且没有配对的if,因此x!=0具有两种情况x>0和x<0;因此x==0时y保持-1;x!=0&&x>0时y=1;x!=0&&x<0时y=0。

    流程图:

    C语言程序设计第五版流程图

    答案:
    课后习题答案

    #include <stdio.h>
    
    int main()
    {
    	int x, y;
        printf("enter x:");
        scanf("%d", &x);
        y=0;
        if (x >= 0)
    		if (x > 0) y=1;
        	else y=-1;
        printf("x=%d,y=%d\n", x, y);
        return 0;
    }
    

    解题思路: if语句使用过程中,else总是匹配距离自己最近的且没有配对的if,因此x>=0具有两种情况x>0和x0;因此x<0时y保持0;x>=0&&x>0时y=1;x>=0&&x0时y=-1。

    流程图:

    c语言谭浩强课后习题答案

    答案:

    C语言程序设计第五版

    8. 给出一百分制成绩,要求输出成绩等级’A’、‘B’、‘C’、‘D’、‘E’。 90分以上为’A’,8089分为’B’,7079分为’C’ ,60~69分为’D’ ,60分以下为’E’。

    解题思路: 根据不同的阶段成绩区间作为成绩的判断条件,属于哪个区间则输出对应等级即可

    答案:

    #include <stdio.h>
    int main()
    {
    	int score;
    	printf("enter score:");
    	scanf_s("%d", &score);
    	if (score >= 90) {
    		printf("A\n");
    	}else if (score >= 80 && score < 90) {
    		printf("B\n");
    	}else if (score >= 70 && score < 80) {
    		printf("C\n");
    	}else if (score >= 60 && score < 70) {
    		printf("D\n");
    	}else {
    		printf("E\n");
    	}
    	system("pause");
    	return 0;
    }
    

    谭浩强第五版课后习题答案

    9. 给一个不多于5位的正整数,要求:①求出它是几位数;②分别输出每一位数字;③按逆序输出各位数字,例如原数为321,应输出123。

    ①求出它是几位数;

    解题思路: 大于10000就是5位,否则大于1000就是四位,否则大于100是三位…

    答案:

    #include <stdio.h>
    int main()
    {
    	int num;
    	printf("enter num:");
    	scanf_s("%d", &num);
    	if (num > 99999 || num < 0) {
    		printf("请输入0~99999之间的正数\n");
    		return -1;
    	}
    	if (num >= 10000) {
    		printf("5\n");
    	}else if (num >= 1000) {
    		printf("4\n");
    	}else if (num >= 100) {
    		printf("3\n");
    	}else if (num >= 10) {
    		printf("2\n");
    	}else {
    		printf("1\n");
    	}
    	system("pause");
    	return 0;
    }
    

    C语言程序设计第五版课后答案

    ②分别输出每一位数字;

    解题思路: 99999除以10000则输出9;9999除以1000则输出9,…

    答案:

    #include <stdio.h>
    int main()
    {
    	int num;
    	printf("enter num:");
    	scanf_s("%d", &num);
    	if (num > 99999 || num < 0) {
    		printf("请输入0~99999之间的数字\n");
    		return -1;
    	}
    	if (num / 10000 > 0) {//取出万位数字
    		printf("%d ", num / 10000);
    	}
    	if (num%10000 >= 1000) {//取余10000则可以取出低四位的数据,除以1000则得到千位的数字
    		printf("%d ", (num % 10000) / 1000);
    	}
    	if (num%1000 >= 100) {//取余1000则可以取出低三位的数据,除以100则得到百位的数字
    		printf("%d ", (num % 1000) / 100);
    	}
    	if (num%100 >= 10) {//取余100则可以取出低两位的数据,除以10则得到十位的数字
    		printf("%d ", (num % 100) / 10);
    	}
    	if (num%10 >= 0) {//取余10则取出个位数字
    		printf("%d ", num % 10);
    	}
    	printf("\n");
    	system("pause");
    	return 0;
    }
    

    第八题答案

    ③按逆序输出各位数字,例如原数为321,应输出123。

    解题思路: 思路与第二题相同,只不过将整个过程逆序即可

    答案:

    #include <stdio.h>
    int main()
    {
    	int num;
    	printf("enter num:");
    	scanf_s("%d", &num);
    	if (num > 99999 || num < 0) {
    		printf("请输入0~99999之间的数字\n");
    		return -1;
    	}
    	if (num % 10 >= 0) {
    		printf("%d ", num % 10);
    	}
    	if (num % 100 >= 10) {
    		printf("%d ", (num % 100) / 10);
    	}
    	if (num % 1000 >= 100) {
    		printf("%d ", (num % 1000) / 100);
    	}
    	if (num % 10000 >= 1000) {
    		printf("%d ", (num % 10000) / 1000);
    	}
    	if (num / 10000 > 0) {
    		printf("%d ", num / 10000);
    	}
    	printf("\n");
    	system("pause");
    	return 0;
    }
    

    C语言程序设计第五版习题答案

    10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7. 5%;200000<I≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提成;400000<<I≤600000元时,高于400000元的部分按3%提成;600000<1≤1000000时,高于600000元的部分按1.5%提成;I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。要求:(1) 使用if语句编写程序。(2) 使用switch语句编写程序。

    (1) 使用if语句编写程序。

    解题思路: 先将每一档的最大奖金算出来,在某一个区间时,则那小于这一档的奖金加上多出部分的奖金即可,例如:

    先列出100000档的奖金是10000,则180000就是10000 + (180000-100000) * 0.075;

    列出200000档的奖金是第一档加上多出100000部分的7.5%得到17500,则300000就是17500 + (300000-200000)*0.05;

    答案:

    #include <stdio.h>
    int main()
    {
    	double I, salary = 0;
    	printf("enter performance:");
    	scanf_s("%lf", &I);
    	if (I < 0) {
    		printf("请输入一个正数\n");
    		system("pause");
    		return -1;
    	}
    	double salary1 = 100000 * 0.1;//10万的奖金
    	double salary2 = (200000 - 100000) * 0.075 + salary1;//20万的奖金
    	double salary3 = (400000 - 200000) * 0.05 + salary2;//40万的奖金
    	double salary4 = (600000 - 400000) * 0.03 + salary3;//60万的奖金
    	double salary5 = (1000000 - 600000) * 0.015 + salary4;//100万的奖金
    	if (I <= 100000) {
    		salary = I * 0.1;//小于100000按10%提成
    	}else if (I > 100000 && I <= 200000) {
    		salary = salary1 + (I - 100000) * 0.075;//多出10万的按比例计算,加上10w的奖金
    	}else if (I > 200000 && I <= 400000) {
    		salary = salary2 + (I - 200000) * 0.05;//多出20万的按比例计算,加上20w的奖金
    	}else if (I > 400000 && I <= 600000) {
    		salary = salary3 + (I - 400000) * 0.03;//多出40万的按比例计算,加上40w的奖金
    	}else if (I > 600000 && I <= 1000000) {
    		salary = salary4 + (I - 600000) * 0.015;//多出60万的按比例计算,加上60w的奖金
    	}else if (I > 1000000){
    		salary = salary5 + (I - 1000000) * 0.01;//多出100万的按比例计算,加上100w的奖金
    	}
    	printf("salary:%f\n", salary);
    	system("pause");
    	return 0;
    }
    

    C语言程序设计第五版课后答案谭浩强

    (2) 使用switch语句编写程序。

    解题思路: 与第一题思路没有太大差别,区别在于switch语句的case子句中需要是一个常量整数,并且switch中若子句中没有break将循序向下执行,直到遇到break才会跳出switch语句,如果这时候将利润除以10w,则得到09的数字,其中0表示小于10w,1表示介于1020w,2、3表示介于2040w,4、5表示介于4060w,6、7、8、9表示介于60~100w,否则就是大于100w

    答案:

    #include <stdio.h>
    int main()
    {
    	double I, salary = 0;
    	printf("enter performance:");
    	scanf_s("%lf", &I);
    	if (I < 0) {
    		printf("请输入一个正数\n");
    		system("pause");
    		return -1;
    	}
    	double salary1 = 100000 * 0.1;//大于100000时0~100000的奖金
    	double salary2 = (200000 - 100000) * 0.075 + salary1;//大于200000时0~20万的奖金
    	double salary3 = (400000 - 200000) * 0.05 + salary2;//大于400000时0~40万的奖金
    	double salary4 = (600000 - 400000) * 0.03 + salary3;//大于600000时0~60万的奖金
    	double salary5 = (1000000 - 600000) * 0.015 + salary4;//大于1000000时0~100万的奖金
    	int grade = I / 100000;
    	switch(grade) {
    		case 0:
    			salary = I * 0.1; break;
    		case 1:
    			salary = salary1 + (I - 100000) * 0.075; break;
    		case 2://会顺序执行到下一个breakcase 3:
    			salary = salary2 + (I - 200000) * 0.05; break;
    		case 4:
    		case 5:
    			salary = salary3 + (I - 400000) * 0.03; break;
    		case 6:
    		case 7:
    		case 8:
    		case 9:
    			salary = salary4 + (I - 600000) * 0.015; break;
    		default:
    			salary = salary5 + (I - 1000000) * 0.01; break;
    	}
    	printf("salary:%f\n", salary);
    	system("pause");
    	return 0;
    }
    

    c语言谭浩强课后答案

    11. 输入4个整数,要求按由小到大的顺序输出。

    解题思路: 四个数中先找到最小的,剩下的三个数中找到第二小的,剩下的两个数中找到第三小的。

    答案:

    #include <stdio.h>
    int main()
    {
    	int a, b, c, d;
    	int max_num;
    	scanf_s("%d %d %d %d", &a, &b, &c, &d);
    	int tmp;
    	//找到最小的数
    	if (a > b) {
    		tmp = a; a = b; b = tmp; // a>b两个数据交换,则给a存储小的b
    	}
    	if (a > c) {
    		tmp = a; a = c; c = tmp;
    	}
    	if (a > d) {
    		tmp = a; a = d; d = tmp;
    	}
    	//找到第二小的数,不需要和最小的数比较
    	if (b > c) {
    		tmp = b; b = c; c = tmp;
    	}
    	if (b > d) {
    		tmp = b; b = d; d = tmp;
    	}
    	//找到第三小的数据,不需要和第一和第二小比较
    	if (c > d) {
    		tmp = c; c = d; d = tmp;
    	}
    	printf("%d %d %d %d\n", a, b, c, d);
    	system("pause");
    	return 0;
    }
    

    c语言程序设计第五版第11题答案

    12. 有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

    第12题

    解题思路: 塔的半径为1m,则x坐标小于-3或者大于3,以及y坐标大于3或者小于-3则都是0m的建筑;其余则判断输入的坐标是否在各个圆塔的圆形范围内。该点到各个圆心的距离是否大于1,小于则是10m建筑,否则为0m建筑。

    math.h中提供了fabs(double)求一个浮点数的绝对值,输入x,y坐标

    fabs(fabs(x) - 2)得到输入坐标距离圆心的横轴距离;

    fabs(fabs(y) - 2)得到舒服坐标距离圆心的纵轴距离;

    三角形两个直角边长平方相加,然后开平方根得到第三边长,若大于1,则不再圆塔范围内。

    答案:

    #include <stdio.h>
    #include <math.h>
    void main()
    {
    	int h;
    	double x, y, m, n, r;
    	printf("Please input a coordinate (x,y):");
    	scanf_s("%lf,%lf", &x, &y);
    	if (fabs(x) > 3 || fabs(y) > 3) {
    		h = 0;
    		printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h);
    		return 0;
    	}
    	m = fabs(x) - 2; n = fabs(y) - 2;
    	r = sqrt(m * m + n * n);
    	if (r > 1)
    		h = 0;
    	else
    		h = 10;
    	printf("The height of the coordinate(%f,%f):h=%d\n", x, y, h);
    	system("pause");
    	return 0;
    }
    

    C语言程序设计第五版谭浩强课后习题答案

    更多相关文章

    C语言程序设计第五版 谭浩强 第五章 课后习题 答案

    展开全文
  • 谭浩强 C语言程序设计第五版 第六章 习题 答案 有问题可以在下方留言哦 1.用筛选法求100以内的素数。 #include <stdio.h> #include <math.h> int main() { int i,j,a[100],b[100]; for (i=1;i<=...
  • 1.写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。 #include&lt;stdio.h&gt; void main(void) { int maxgy(int x,int y);... ...
  • C语言程序设计第四版谭浩强课后习题答案 完整版下载地址:http://download.csdn.net/download/xw791488540/3778054?utm_source=blogseo第一章 程序设计和C语言 【第15页】 1-5 #include
  • C程序设计第五版 谭浩强 清华大学出版社 课后答案 习题解析 微信扫描小程序二维码查看答案 第一章 程序设计C语言 第二章 算法—程序的灵魂 第三章 最简单的C程序设计—顺序程序设计 第四章 选择结构程序设计 第...
  • 练习5-1 求m到n之和(10 分)本题要求实现一个计算m~n(m&lt;n)之间所有整数的和的简单函数。...裁判测试程序样例:#include &lt;stdio.h&gt; int sum(int m, int n); int main() { ...
  • 自己练习时手写,难免会有些疏忽遗漏等各种各样问题,错误之处还请指出 但这些代码确实已通过编译,实现了书上的输出结果,还希望能给抱有期待之人作为个小参考 后续章节慢慢更新中 2.1 #include &...
  • 从键盘任意输入一个整数m,若m不是...例如,用户输入90时,程序输出90=2×3×3×5;用户输入17时,程序输出“It is a prime number”。 #include &lt;stdio.h&gt; #include &lt;math.h&gt; int isP...
  • 说明:第5周第1题对应了C语言编程100题-1.1,以此类推 C语言编程100题-1.1 C语言编程100题-1.2 C语言编程100题-1.3 C语言编程100题-1.4 C语言编程100题-1.5 C语言编程100题-1.6 C语言编程100题-1.7 C语言编程100题-...
  • 练习2-3 输出倒三角图案 //运用函数来实现倒金字塔 #include&lt;stdio.h&gt; int main(){ for(int i=0;i&lt;4;i++){ for(int j=0;j&lt;i;j++) { printf("... if(j==4-i-1)...
  • 1.调用了math.h里的pow函数 #include&amp;amp;lt;stdio.h&amp;amp;gt; #include&amp;amp;lt;math.h&amp;amp;gt; main() { int i; double r=0.07,p; for(i=1;i&amp;...
  • 链接:https://pan.baidu.com/s/1OEvyn1E6IkDUdPbzX0SJNQ 密码:lll7 本书为完整版,以下为内容截图:
  • C语言程序设计教程》张敏霞、孙丽凤主编课后习题答案点此下载 下载后用Winrar解压缩。 http://www.qdacc.net/ 奇货可居网 会计理论与实务经验互动交流学习平台
  • 绪论 单元测试 1、单选题: 计算机能够直接识别的语言是()。 选项: A:汇编语言 B:机器语言 C:高级语言 答案: 【机器语言】 ...答案: 【C语言不是结构化程序设计语言】 2、单选题: 下列关于C语言程序...
1 2 3 4 5 ... 20
收藏数 37,049
精华内容 14,819
关键字:

c语言程序设计答案