《C语言程序教程》课后编程题

1.3编程题

1.试参考本章例题编写计算梯形面积的C语言程序,梯形的上底、下底和高分别用a、b、h表示,并用a=10,b=20,h=5测试所编写的程序。

#include <stdio.h>
int main(void) {     
    int a = 10, b = 20, h = 5;     
    printf("梯形的面积是:%d\n", (a + b) * h / 2);
    return 0;
}

2.编写程序显示如图所示的信息

3.4 编程题

1.编写程序实现从键盘输入两个十进制整型数据10和8给变量x和y,并按下列格式输出。
                                        x       y
                    十进制数        10      8
                    八进制数        12      10
                    十六进制数      A       8

#include <stdio.h>
int main()
{
    int x, y;
    scanf("%d%d", &x, &y);
    printf("\t\tx\ty\n");
    printf("十进制数\t%d\t%d\n", x, y);
    printf("八进制数\t%o\t%o\n", x, y);
    printf("十六进制数\t%X\t%X\n", x, y);
    return 0;
}

2.编写一个程序,输入一个大写英文字符(‘B’~‘Y’),输出它的前导字符、该字符本身及其后续字符。

 #include <stdio.h>
 int main()
 {
     char ch;
     printf("请输入一个大写英文字母");
     scanf("%c", &ch);
     printf("大写英文字母是%c\n", ch);
     printf("它的前导字符是%c\n", ch-1);
     printf("它的后导字符是%c\n", ch+1);
    return 0;
}

3.编写一个程序,输入一个3位正整数,要求反向输出对应的整数,如输入123,则输出321。编写程序并给出相应的程序流程图

#include <stdio.h>
int main()
{
    int n, a, b, c, ans;
    printf("请输入一个三位整数:\n");
    scanf("%d", &n);
    a = n / 100;
    b = (n - a * 100) / 10;
    c = n % 10;
    ans = c * 100 + b * 10 + a;
    printf("反向输出该整数:\n%d\n", ans);
    return 0;
}

4.某工种按小时计算工资,每月的劳动时间乘上每小时工资,再从总工资中扣除10%公积金,剩余的为应发工资。编写一个程序从键盘输入劳动时间和每小时工资,打印出应发工资数额。

#include <stdio.h>
int main()
{
    int m;
    double t, sum;
    scanf("%d%lf", &m, &t);
    sum = 0.9 * m * t;
    printf("%lf\n", sum);
    return 0;
}

5.编写程序,读入3个整数给变量a, b, c,然后交换它们的值,把a原来的值给b,把b原来的值给c,把c原来的值给a。

#include <stdio.h>
int main()
{
    int a, b, c, t;
    printf("请输入三个整数:\n");
    scanf("%d%d%d", &a, &b, &c);
    printf("交换前a=%d,b=%d,c=%d\n", a, b, c);
    t = a;
    a = c;
    c = b;
    b = t;
    printf("交换后a=%d,b=%d,c=%d\n", a, b, c);
    return 0; 
}

4.4 编程题

1.输入3个实型数值a、b、c,如果能用它们作为三角形的3条边形成一个三角形,则输出三角形的面积,并画出实现该算法的N-S流程图并编程实现。

#include <stdio.h>
#include <math.h>
int main()
{
    float a, b, c, area;
    scanf("%f,%f,%f", &a, &b, &c);
    if (a+b>c && a+c>b && b+c>a)
    {
        s=(a+b+c)/2;
        area=sqrt(s*(s-a)*(s-b)*(s-c));
        printf("%f", area);
    }
    return 0;
}

2.输入整数x、y,若x2+y2>1000,则输出x2+y2百位以上的数字,否则输出两数之和。

#include <stdio.h>
int main()
{
    int x, y;
    scanf("%d,%d", &x, &y);
    if (x*x + y*y > 1000)
        printf("%d\n", (x*x + y*y)/100);
    else 
        printf("%d\n", x+y);
    return 0;
}

3.对任意输入的x,用下式计算并输出y的值。

                                        

#include <stdio.h>
#include <math.h>
int main()
{
    float x, y;
    scanf("%f", &x);
    if (x < 2)
        y= x * x - sin(x);
    else if (x <= 2)
        y = pow(2, x) + 1;
    else 
        y = sqrt(x * x + x + 1);
    printf("%f\n", y);
    return 0;
}

4. 编写程序输入一个5位整数,判断它是不是回文数。回文数是指一个数从右到左和从左到右的对应数码相同,如12321是回文数,个位与万位相同,十位与千位相同。

#include <stdio.h>
int main()
{
    long ge, shi, qian, wan, x;
    scanf("%ld", &x);
    wan = x / 10000;
    qian = x % 10000 / 1000;
    shi = x % 100 / 10;
    ge = x % 10;
    if (ge == wan && shi == qian) // 个位等于万位并且十位等于千位
        printf("这个数是回文数\n")
    else 
        printf("这个数不是回文数\n");
    return 0;
}

5.编写程序用于计算某运输公司的运费。设每公里每吨货物的基本运费为p,货物重量为w,路程为s(单位为km),折扣为d,总费用计算公式为:f=p*w*s*(1-d)。
运费计算标准见表5。
表5 某运输公司运费计算标准

s<250

不打折

250<=s<500

折扣2%

500<=s<1000

折扣5%

1000<=s<2000

折扣8%

2000<=s<3000

折扣10%

s>3000

折扣15%

#include <stdio.h>
int main()
{
    float p, w, s, d, f;
    scanf("%f,%f,%f", p, s, w);
    if (s > 3000)
        d = 0.15;
    else if (s >= 2000)
        d = 0.1;
    else if (s >= 1000)
        d = 0.08;
    else if (s >= 500)
        d = 0.05;
    else if (s >= 250)
        d = 0.02;
    else 
        d = 0;
    f = p * w * s * (1-d);
    printf("%f", f);
    return 0;
}

6.编写程序实现产品保修额的计算。如果本公司的产品,则使用期在1年(含1年)以内,免收保修额;使用期在1年以上并且在8年以下(含8年),收取保修额50元;使用8年以上,收取保修额100元。如果不是本公司的产品,则一律收取保修额200元。根据用户输入的信息,计算保修额。
编程提示:是否是本公司产品的选项值(字符型)和使用年数(整型)由用户从键盘输入,然后系统开始判断。
输入输出样例:
是否是本公司产品(y/n):y
产品使用的年限:6
产品保修额是:50元

#include <stdio.h>
int main()
{
    int year, money;
    char x;
    printf("是否是本公司产品(y/n):");
    scanf("%c", &x);
    if (x == 'y' || 'Y');
    {
        printf("产品使用的年限:");
        scanf("%d", &year);
        if (year <= 1)
            money = 0;
        else if (year < 8)
            money = 50;
        else 
            money = 100;
        printf("产品保修额是:%d\n", money);
    }
    return 0;
}

7.编写程序实现银行ATM自动取款机的功能,取款机内只有100元和50元两种面值,要求支取金额都在2000(包含2000)元以内。该取款机将用户输入的金额按照人民币从大到小的面值进行折合计算。先算出最大可以出多少100元,剩下的再计算最多可以出多少50元。例如,用户要取款650元,则取款机应付出的钱的种类及个数为:6个100元、1个50元。如果用户输入的钱数不是50的倍数,显示“输入钱数必须是50的倍数”。
输入输出样例:
请输入取款额(≤2000):750
需支付100元:7张
需支付50元:1张
请输入取款额(≤2000):530
输入钱数必须是50的倍数!

#include <stdio.h>
int main()
{
    int money, num1, num2;
    printf("请输入取款额(≤2000):");
    scanf("%d", &money);
    if (money > 2000)
        printf("请输入取款额数≤2000!\n");
    else if (money % 50 == 0)
    {
        num1 = money / 100;
        num2 = (money - num1*100) / 50;
        printf("需支付100元:%d张\n", num1);
        printf("需支付50元:%d张\n", num2);
    }
    else 
        pritnf("输入钱数必须是50的倍数!\n");
    return 0;
}

5.4 编程题

1.用3种循环语句编写程序实现下列算式:
(1)1+2x2+3x3+…+100x100
(2)e=1+1/1!+1/2!+...+1/n!+...,当最后一项的值小于10-6时为止。(注:10的-6次方)

(1)
#include <stdio.h>
int main()
{
    int i;
    long s = 0;
    for (i = 1; i <= 100; i++)
        s += i*i;
    printf("%ld", s);
}


(2)
#include <stdio.h>
int main()
{
    int i = 1; 
    long p = 1;
    float s = 0;
    do
    {
        s += 1.0/p;
        p *= ++i;
    } while (1.0 / p > 1e-6)
    printf("%f", s);
    return 0;
}

2.编写程序求两个正整数的最大公约数。

#include <stdio.h>
int main()
{
    int a, b, m, n, t;
    scanf("%d,%d", &m, &n);
    if (m < n)
    {
        t = m;
        m = n;
        n = t;
    }
    a = m;
    b = n;
    t = m % n;
    while (t)
    {
        m = n;
        n = t;
        t = m % n;
    }
    printf("%d,%d", n, a*b/n);
    return 0;
}

3.编写程序求一个整数的任意次方的最后3位数,即求xy的最后3位数。(注:x的y次方)

#include <stdio.h>
int main()
{
    int x, y, s = 1;
    scanf("%d,%d", &x, &y);
    for ( ; y > 0; y--)
        s *= x;
    printf("%d,%d,%d\n", s%10, s/10%10, s/100%10);
    return 0;
}

4.百鸡问题。用100元钱买100只鸡,其中,公鸡每只5元,母鸡每只3元,小鸡每3只1元。编写程序输出各种买法。

#include <stdio.h>
int main()
{
    int x, y, z;
    for (x = 1; x < 20; x++)
        for (y = 1; y < 33; y++)
        {
            z = 100 - x - y;
            if (z >= 0 && (5 * x + 3 * y + z /3) - 100 < 1e -5)
                printf("x=%d,y=%d,z=%d\n", x, y, z);
        }
    return 0;
}

5.编写程序分别打印如下图形:

(a)
#include <stdio.h>
int main()
{
    int j, k;
    for (j = 1; j <= 4; j++)
    {
        for (k = 1; k <= 4-j; j++)
            printf(" ");
        printf("****");
        printf("\n");
    }
    return 0;
}

(b)
#include <stdio.h>
int main()
{
    itn j, k;
    for (j = 1; j <= 4; j++)
    {
        for (k = 1; k <= 2*j-1; k++)
            printf("*");
        printf("\n");
    }
    return 0;
}

6.请编写程序求100~999之间所有的水仙花数。水仙花数的含义是指这样的一个3位数,其各位数字的立方和等于该数本身。例如,371=33+73+13,所以371是一个水仙花数。(注:3的3次方,7的3次方,1的3次方)

#include <stdio.h>
int main()
{
    int i, j, k, n;
    printf("'water flower' number is:");
    for (n = 100; n < 1000; n++)
    {
        i = n/100; //分解出百位
        j = n/10%0; //分解出十位
        k = n%10; //分解出个位
        if (i*100 + j*10 + k == i*i*i + j*j*j + k*k*k)
            printf("%-5d", n);
    }
    pritnf("\n");
    return 0;
}

7.学校有近千名学生,在操场上排队,5人一行余2人,7人一行余3人,3人一行余1人,编写一个程序求该校的学生人数。

#include <stdio.h>
int main()
{
    int x;
    for (x = 1000; x >= 3; x--)
        if (x % 3 == 1 && x % 5 == 2 && x % 7 == 3)
        {
            printf("该校的学生人数是:%d人\n", x);
            break;
        }
    return 0;
}

8.小明今年12岁,他的母亲比他大20岁,他母亲在几年后将比他的年龄大一倍,编写一个程序计算出那时他们的年龄各多少?

#include <stdio.h>
int main()
{
    int x = 12, i = 1;
    while (1)
    {
        if ((x + 20 + i) == 2 * (x + i))
            break;
        i++;
    }
    printf("小明母亲在%d年后比小明的年龄大一倍\n", i)
    printf("那时小明年龄是:%d岁,小明母亲年龄是:%d岁\n", x+i, x+20+i);
    return 0;
}

6.3 编程题

1.编写程序计算下列公式中的f值,使用带参数的宏来实现

#include <stdio.h>
#define F(a) a*a+sqrt(3*a*a+2*a+1)
int main()
{
    float x, f;
    scanf("%f", &x);
    f = 4.5/F(exp(x))+F(cos(x))+F(sqrt(x))/F(x*x);
    printf("%f\n", f);
    return 0;
}

7.4 编程题

1.设数组a中的元素都为正整数,编程求其中偶数的和及奇数的和。

#include <stdio.h>
#define N 10
int main()
{
    int a[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, osum = 0, qsum = 0, j;
    for (j = 0; j < 10; j++)
        if ((j%2))
            qsum += a[j];
        else
            osum += a[j];
        printf("osum=%d, qsum=%d\n", osum, qsum);
        return 0;
}

2.有一个已排好序的数组,输入一个数,要求按原来排序的规律将它插入数组中,插入后数组仍然有序,请编程实现。

#include <stdio.h>
#define N 10
int main()
{
    int a[N] = {10, 20, 30, 40, 50, 60, 70, 80, 90}, j, k, x;
    scanf("%d", &x);
    for (j = 0; j < N; j++)
        if (x < a[j])
            break;
            for (k = N-1; k > j; k--)
                a[k] = a[k-1];
            a[j] = x;
            for (j = 0; j < N; j++)
                printf("%d ", a[j]);
    return 0;
}

3.编一个程序检查二维数组是否对称(即对所有的i和j,都有a[i][j]=a[j][i])。

#include <stdio.h>
#define M 3
int main()
{
    int a[M][M] = {{1,2,3},{2,4,5},{3,5,6}}, j, k, flag = 1;
    for (j = 0; j < M; j++)
        for (k = 0; k < M; k++)
            if (a[j][k] != a[k][j])
            {
                flag = 0;
                break;
            }
    if (flag)
        printf("ok");
    else
        printf("no");
    return 0;
}

4.编程比较两个字符串的大小(不用strcmp( )函数)。

#include <stdio.h>
#include <string.h>
int main()
{
    char c1[100], c2[100], j;
    gets(c1);
    gets(c2);
    for (j = 0; (c1[j]==c2[j])&&c1[j]&&c2[j]; j++);
    if (c1[j] > c2[j])
        printf("1\n");
    if (c1[j] < c2[j])
        printf("-1\n");
    if (c1[j] == c2[j])
        printf("0\n");
    return 0;
}

5.有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格及其他字符的个数。

8.4 编程题

1.按以下要求编写一个程序。定义3个变量用于存放输入的3个整数,另定义3个指向整型变量的指针变量,并利用它们实现将输入的3个整数按由小到大的顺序输出。

#include <stdio.h>
int main()
{  
    int n1, n2, n3, t;
    int *p1, *p2, *p3;
    printf("please input 3 number: n1, n2, n3:\n");
    scanf("%d%d%d", &n1, &n2, &n3);
    p1 = &n1;
    p2 = &n2;
    p3 = &n3;
    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("the sorted numbers are: %d %d %d\n", n1, n2, n3);
    return 0;
}

2.编程用指针实现将从键盘输入的N个数逆序输出。

 #include <stdio.h>
 #define N 3
 int main()
 {
    int a[N], *p = a;
    for( ; p-a<N; p++)
        scanf("%d", p);
    p = a + N - 1;
    for( ; p - a >= 0; p--)
        printf("%d ", *p);
    return 0;
}

3.编程用指针实现输入10个整数,将其中最小的数与第1个数对换,把最大的数与最后1个数对换。

#include <stdio.h>
int main()
{
    void input(int *);
    void output(int *);
    void chuli(int *);
    int a[10];
    input(a);
    chuli(a);
    output(a);
    return 0;
}
void input(int *a)
{
    int j;
    for (j = 0; j < 10; j++)
    scanf("%d", a + j);
 }
void chuli(int *a)
{
    int j, minl = 0, maxl = 0;
    for (j = 0; j < 10; j++)
    {
        if (a[maxl] < *(a+j))  maxl = j;
        if (a[minl] > *(a+j))  minl = j;
    }
    j = a[0];
    a[0] = a[minl];
    a[minl] = j;
    j = a[9];
    a[9] = a[maxl];
    a[maxl] = j;
}
void output(int *a)
{
    int j;
    for (j = 0; j < 10; j++)
    printf("%4d\n", *(a + j));
}

4.按下列要求输入和输出下列数据阵列,编程用指针实现。

输入阵列如下:

1    2    3    4

5    6    7    8

9    10    11    12

输出阵列如下:

12    11    10    9

8    7    6    5

4    3    2    1

#include <stdio.h>
#define M 3
#define N 4
int main()
{
    int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12}, k, j, *p = *a, t;
    for (k = 0, j = M*N-1; k < j; k++, j--)
    {
        t = *(p+k);
        *(p+k) = *(p+j);
        *(p+j) = t;
    }
    for (k = 0; k < M ;k++)
    {
        for (j = 0; j < N; j++)
            printf("%4d ", a[k][j]);
        printf("\n");
    }
    return 0;
}

5.编程用指针实现求一个字符串的长度(相当于strlen函数的功能)。

#include <stdio.h>
int main()
{
    int len, length(p);
    char *str[20];
    printf("please input a string:\n");
    scanf("%s", str);
    len = length(str);
    printf("the string has %d characters.\n",len);
}
int length(p)
char *p;
{
    int n = 0;
    while (*p != '\0')
    {
        n++;
        p++;
    }
    return n;
}

6.用指针数组操作将输入的5个字符串按由小到大的顺序排序输出。

#include "string.h"
#include "stdio.h"
int main()
{
    char *str1[5], ch[5][20], k, t, j, *c;
    void sort(char **);
    for (k = 0; k < 5; k++)
     {
         str1[k] = ch[k];
           gets(str1[k]);
     }
       for (k = 0; k < 7; k++)
       {
           t = k;
        for (j = k + 1; j < 5; j++)
             if (strcmp(*(str1+t), *(str1+j))>0)
                t = j;
            c = *(str1+t);
           *(str1+t) = *(str1+k);
           *(str1+k) = c;
    }
    for (k = 0; k < 5; k++)
         puts(str1[k]);
    return 0;
}

 9.4编程题

1.编写一个函数把字符串的小写字母转换成大写字母,其他字符不变。

void exchange() {
    char ch;
    while (!(ch = getchar()) != \n) {
        if (ch >= 'a' && ch <= 'z') {
            ch = ch -32;
            putchar(ch); 
        }
    }
}

2.编写一个函数求e=1+1/1!+1/2!+1/3!+...+1/n!+...

double expp(int n) {
    int fac = 1;
    double sum = 1;
    for (int k = 1; k <= n; k++) {
        fac *= k;
        sum += 1.0/fac;
    }
    return sum;
}

3.编写一个函数求一个整数的任意次方的最后3位数,即求x^{y}的最后3位数。

int xy3(int x, int y) {
    int k, num = 1;
    for (int k = 1; k <= y; k++) {
        num *= x;
    }
    num %= 1000;
    return num;
}

4.有5个人坐在一起,第5个人说他比第4个人大2岁,第4个人说他比第3个人大2岁,第3个人说他比第2个人大2岁,第2个人说他比第1个人大2岁,第1个人说他10岁,请编程求出第5个人多大。

int age(int n) {
    int c;
    if (n == 1) {
        c = 10;
    } else {
        c = age(n - 1) + 2;
    }
    return c;
}

5.编写函数,得到两个整数相除的商和余数。要求通过指针在函数间传递商和余数这两个数据。

#include <stdio.h>
void fun(int a, int b, int *c, int *d) {
    if (b) {
        *c = a / b;
        *d = a % b;
    }
}
int main(void) {
    int a, b, c, d;
    scanf("%d%d", &a, &b);
    fun(a, b, &c, &d);
    printf("%d %d", c, d);
    return 0;
}

6.编写一个程序,运行时输出命令行参数的个数及参数名。

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("argc = %d\n", argc);
    for (int k = 1; k < argc; k++) {
        printf("%s\n", argv[k]);
    }
}

10.3编程题

1.定义一个包含20个学生基本情况(包括学号、姓名、性别、C语言成绩)的结构体数组,编程实现下列功能:

(1)输入20个学生的学号、姓名、性别、C语言成绩;

(2)分别统计男、女生的人数,求出男、女生的平均成绩;

(3)按照学生的C语言成绩从高到低进行排序。

  • 13
    点赞
  • 161
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值