跳转至

期末必做题


1

计算薪水总额

已知某公司有一批销售员工,其底薪为 2000 元,员工销售额与提成比例如下:

  • 当销售额 ≤ 3000 时,没有提成;

  • 当 3000 < 销售额 ≤ 7000 时,提成 10%;

  • 当 7000 < 销售额 ≤ 10000 时,提成 15%;
  • 当销售额 > 10000 时,提成 20%。

编程实现: 输入一个整数表示员工的销售额,计算出其薪水总额(单精度浮点型数据)并输出。

注意:薪水= 底薪 + 销售额 * 提成;薪水总额保留两位小数。

1.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>

int main() {
    int a;
    float b;
    scanf("%d", &a);
    if (a <= 3000)
    {
        b = 2000;
        printf("%.2f", b);
    }
    else if (a > 3000 && a <= 7000)
    {
        b = 2000 + a * 0.1;
        printf("%.2f", b);
    }
    else if (a > 7000 && a <= 10000)
    {
        b = 2000 + a * 0.15;
        printf("%.2f", b);
    }
    else if (a > 10000)
    {
        b = 2000 + a * 0.2;
        printf("%.2f", b);
    }
    return 0;
}

1.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

int main () {
    int sales;
    scanf("%d", &sales);
    int salary = 2000;
    float percent;
    if (sales <= 3000) {
        percent = 0;
    } else if (sales <= 7000) {
        percent = 0.1;
    } else if (sales <= 10000) {
        percent = 0.15;
    } else {
        percent = 0.2;
    }

    float income = salary + (sales * percent);
    printf("%0.2f", income);

    return 0;
}

2

判断成绩的等级

以下为某学校以成绩划分等级的规则:

Text Only
1
2
3
4
5
6
成绩等于 100 分,S级;
成绩在 90 ~ 99 分,A级;
成绩在 80 ~ 89 分,B级;
成绩在 70 ~ 79 分,C级;
成绩在 60 ~ 69 分,D级;
成绩在 0 ~ 59 分,E级;

编程实现: 输入一个成绩(整数),判断该成绩位于什么等级,并将等级打印输出。

2.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main() {
    int num;
    scanf("%d", &num);

    if (num==100) {
        printf("S");
    }
    if (90 <= num && num <= 99) {
        printf("A");
    }
    if (80 <= num && num <= 89) {
        printf("B");
    }
    if (70 <= num && num <= 79) {
        printf("C");
    }
    if (60 <= num && num <= 69) {
        printf("D");
    }
    if (0 <= num && num <= 59) {
        printf("E");
    }

    return 0;
}

2.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main () {
    int grade;
    scanf("%d", &grade);
    if (grade == 100) {
        printf("S");
    } else if (grade <= 99 && grade >= 90) {
        printf("A");
    } else if (grade <= 89 && grade >= 80) {
        printf("B");
    } else if (grade <= 79 && grade >= 70) {
        printf("C");
    } else if (grade <= 69 && grade >= 60) {
        printf("D");
    } else if (grade <= 59 && grade >= 0) {
        printf("E");
    } 
    return 0;
}

3

输出商品信息

已知四种商品的编号,名称及其单价为:

编号 名称 单价
1 薯片(crisps) 3.0 元/公斤
2 爆米花(popcorn) 2.5 元/公斤
3 巧克力(chocolate) 4.0 元/公斤
4 可乐(cola) 3.5 元/份

编程实现: 输入一个商品的编号,输出其英文名称和单价,当输入不存在的编号时,输出none

3.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>

int main() {
    int number;

    scanf("%d", &number);

    switch (number) {
        case 1:
            printf("crisps: ");
            printf("3.0\n");
            break;
        case 2:
            printf("popcorn: ");
            printf("2.5\n");
            break;
        case 3:
            printf("chocolate: ");
            printf("4.0\n");
            break;
        case 4:
            printf("cola: ");
            printf("3.5\n");
            break;
        default:
            printf("none\n");
            break;
    }

    return 0;
}

3.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main () {
    int number;
    scanf("%d", &number);
    if (number == 1) {
        printf("crisps: 3.0");
    } else if (number == 2) {
        printf("popcorn: 2.5");
    } else if (number == 3) {
        printf("chocolate: 4.0");
    } else if (number == 4) {
        printf("cola: 3.5");
    } else {
        printf("none");
    }
    return 0;
}

4

任务描述

请你编写程序:现在老师想知道一班的等级,即给出一百分制成绩,要求输出该班成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90 分以上为‘A’,80~89 分为‘B’,70~79 分为‘C’,60~69 分为‘D’,60 分以下为‘E’。

实现思路

  • 使用多个 if...else... 语句判断输入的成绩 score 符合上面的哪种情况,根据情况不同,计算出不同的结果。

4.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
    int score;

    scanf("%d", &score);

    if (score >= 90 && score <= 100) {
        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 if (score >= 0 && score < 60) {
        printf("成绩等级:E\n");
    } else {
        printf("请输入有效的成绩(0-100)。\n");
    }

    return 0;
}

4.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main()
{
    double score;
    char grade;
    scanf("%lf", &score);
    while (score > 100 || score < 0) {
        printf("error\n");
        scanf("%lf", &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';
    }
    printf("%c\n", grade);
    return 0;
}

5

输出三个数中的最大数

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

5.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
    double weight1, weight2, weight3;
    scanf("%lf %lf %lf", &weight1, &weight2, &weight3);

    if (weight1 > weight2 && weight1 > weight3) {
        printf("%.2lf\n", weight1);
    } else if (weight2 > weight1 && weight2 > weight3) {
        printf("%.2lf\n", weight2);
    } else if (weight3 > weight1 && weight3 > weight2) {
        printf("%.2lf\n", weight3);
    } else {
        printf("无法确定最重的羊,可能有两只或三只羊的体重相同。\n");
    }

    return 0;
}

5.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// 参考答案一
#include <stdio.h>

int main()
{
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    if (a < b) {
        if (b < c) {
            printf("%d\n", c);
        }
        else {
            printf("%d\n", b);
        }
    }
    else if (a < c) {
        printf("%d\n", c);
    }
    else {
        printf("%d\n", a);
    }

    return 0;
}

/* 参考答案二

#include <stdio.h>

int main()
{
    int a, b, c, temp, max;
    scanf("%d %d %d", &a, &b, &c);
    temp = (a > b) ? a : b;
    max = (temp > c) ? temp : c;
    printf("%d\n", max);
    return 0;
}
*/

6

兑换人名币

用 100 元人民币兑换 10 元、5 元和 1 元的纸币(每一张都要有)共 50 张。

用穷举法列出每种方案各兑换多少张纸币。

6.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main() {
    for (int a = 0; a <= 50; a++) {
        for (int b = 0; b <= 50; b++) {
            int c = 50 - a - b;
            if (c >= 1 && a * 10 + b * 5 + c == 100) {
                printf("10元: %d, 5元: %d, 1元: %d\n", a, b, c);
            }
        }
    }
    return 0;
}

6.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main () {
    for (int i = 10; i <= 100; i += 10) {
        for (int j = 5; j <= 100 - i; j += 5) {
            int k = 100 - i - j;
            if ((i / 10 + j / 5 + k) == 50 && i + j + k == 100) {
                printf("10元: %d, 5元: %d, 1元: %d\n", i / 10, j / 5, k);
            }
        }
    }
    return 0;
}

7

任务描述

小明想拥有一个简易计算器来计算课后题四则运算,请你来编写程序:输入操作数一number1、操作符operator和操作数二number2, 求该表达式的值.

注意: 除法算式输出时,输出浮点数,其他算式输出整数。若除数为 0, 则输出The divsior is 0.

实现思路

  • 使用多个 switch... 语句判断输入的操作符operator,符合上面的哪种情况,根据情况不同,计算出不同的结果.

7.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>

int main() {
    double number1, number2;
    char operator;
    double result;

    scanf("%lf", &number1);
    scanf(" %c", &operator);
    scanf("%lf", &number2);

    switch (operator) {
        case '+':
            result = number1 + number2;
            printf("%d\n", (int)result);
            break;
        case '-':
            result = number1 - number2;
            printf("%d\n", (int)result);
            break;
        case '*':
            result = number1 * number2;
            printf("%d\n", (int)result);
            break;
        case '/':
            if (number2 == 0) {
                printf("The divsior is 0\n");
            } else {
                result = number1 / number2;
                printf("%.6lf\n", result);
            }
            break;
        default:
            printf("无效的操作符\n");
            break;
    }

    return 0;
}

7.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main()
{
  int x, y;
  char flag;
  scanf("%d %c %d", &x, &flag, &y);
  switch (flag)
  {
  case '+':
    printf("%d\n", x + y);
    break;
  case '-':
    printf("%d\n", x - y);
    break;
  case '*':
    printf("%d\n", x * y);
    break;
  case '/':
    if (y == 0)
    {
      printf("The divsior is 0");
      break;
    }
    printf("%f\n", (float)x / (float)y);
    break;
  }
  return 0;
}

8

打印数字

编程实现: 从键盘输入两个正整数,第一个正整数 n 表示行数,第二个正整数 m 表示每一行最大的数。请用循环在屏幕上打印一个 n 行 m 列的数字矩形。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>

int main() {
    int a, num;
    scanf("%d", &a);
    scanf("%d", &num);
    for (int i = 1; i <= a; i++)
    {
        for (int j = 1; j <= num; j++)
        {
            printf("%d ", j);
        }
        printf("\n");
    }
    return 0;
}

9

打印矩形

请用程序实现: 从键盘输入两个正整数,分别表示行和列,请用循环在屏幕上打印一个 n 行 m 列的星号矩形。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main () {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

10

统计公倍数

请用程序实现: 输入两个正整数n1, n2,统计1000(含)以内有多少个n1n2的公倍数,并将统计结果输出。

输入格式

在一行中输入两个大于 0 的整数,中间用空格分隔。

10.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main()
{
    int n1, n2;
    int sum = 0;
    scanf("%d %d", &n1, &n2);
    for (int i = 0; i <= 1000; i++)
    {
        if (i % n1 == 0 && i % n2 == 0)
        {
            sum++;
        }
    }
    printf("%d", sum - 1);
    return 0;
}

10.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main () {
  int n1, n2;
  scanf("%d %d", &n1, &n2);
  int i, count = 0;
  for (i = 1; i <= 1000; i++) {
    if (i % n1 == 0 && i % n2 == 0) {
      count += 1;
    }
  }
  printf("%d", count);
  return 0;
}

11

水仙花数

”水仙花数“是指一个三位数,其各位数字立方和等于该数本身。例如153 = 1³ + 5³ + 3³,所以153是一个水仙花数。

编程实现: 请输入一个三位数,找出100 ~ num(含)中的所有水仙花数,并将找出的水仙花数输出。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main() {
    int num;
    int a, b, c;
    scanf("%d", &num);
    for (int i = 100; i <= num; i++) {
        a = i % 10;
        b = (i / 10) % 10;
        c = i / 100;
        if (a * a * a + b * b * b + c * c * c == i) {
            printf("%d\n", i);
        }

    }
    return 0;
}

12

阶乘

编程实现: 输入一个正整数,计算并输出它的阶乘。

注意:结果以单精度浮点型数据输出,保留 2 位小数。n!=1×2×3×…×n。

12.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    float factorial = 1.0;
    for (int i = 1; i <= n; i++) {
        factorial *= i;
    }
    printf("%.2f\n", factorial);
    return 0;
}

12.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>

int main () {
    int num;
    scanf("%d", &num);
    float sum = 1.0;
    for (int i = 1; i < num + 1; i++) {
        sum = sum * i;
    }
    printf("%.2f", sum);
    return 0;
}

13

将数组首尾互换后输出

编程实现:将一个数组{11,9,8,2,1,0}首尾互换后输出。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#define N 6

void conv(int a[]) {
    int temp;

    for (int i = 0; i < N / 2; i++) {
        temp = a[i];
        a[i] = a[N - i - 1];
        a[N - i - 1] = temp;
    }
}

int main() {
    int a[N] = { 11,9,8,2,1,0 }, i;
    conv(a);

    for (i = 0; i < N; i++) {
        printf("%4d", a[i]);
    }

    return 0;
}

14

求矩阵主对角线元素之和

编程实现:求一个5*5整型矩阵主对角线元素之和。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#define N 5

int sum(int a[N][N]) {
    int s = 0;
    int i;

    for (i = 0; i < N; i++)
        s = s + a[i][i];
    return s;
}

int main() {
    int a[N][N], s;
    int i, j;

    printf("请输入N*N个元素:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            scanf("%d", &a[i][j]);
    }

    s = sum(a);
    printf("主对角线元素之和为%d\n", s);

    return 0;
}

15

统计多行文字的字符个数

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

注意,使用二维数组模拟文章的三行文字,并于键盘输入三行文字的内容。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int 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++) {
        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++;
        }
    }
    printf("upper case: %d\n", upp);
    printf("lower case: %d\n", low);
    printf("digit     : %d\n", dig);
    printf("space     : %d\n", spa);
    printf("other     : %d\n", oth);
}

16

冒泡排序之升序

请用程序实现: 输入10个整数, 对这10个整数进行冒泡排序, 使其按照从小到大的顺序排列, 并将排列后的结果输出.

16.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main() {
    int arr[10] = { 0 };
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }
    for (int j = 0; j < 9; j++) {
        for (int i = 0; i < 9 - j; i++) {
            if (arr[i] > arr[i + 1]) {
                int tmp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmp;
            }
        }
    }
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }

    return 0;
}

16.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#define N 10

void Input(int b[N]) {
    //输入函数
    int i;
    printf("请输入%d个整数:\n",N);
    for(i=0; i<N; i++) {
        scanf("%d",&b[i]);
    }
}

void BubbleSort(int b[N]) {
    //冒泡排序函数
    int i,j,t;
    for(i=0; i<N-1; i++) {
        //外层循环控制趟数
        for(j=0; j<N-1-i; j++) {
            //内层循环控制每趟的比较次数
            if(b[j]>b[j+1]) {
                t=b[j];
                b[j]=b[j+1];
                b[j+1]=t;
            }
        }
    }
}

void Print(int b[N]) {
    //输出函数
    int i;
    for(i=0; i<N; i++) {
        if(i%10==0)
            printf("\n");
        printf("%6d",b[i]);
    }
    printf("\n");
}

int main() {
    int a[N];
    Input(a);
    printf("排序前:");
    Print(a);
    BubbleSort (a);
    printf("排序后:");
    Print(a);
    return 0;
}

17

杨辉三角

任务要求

杨辉三角,又称贾宪三角形、帕斯卡三角形,是二项式系数在三角形中的一种几何排列。其中前10行样式如下:

Text Only
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
1  
1   1 
1   2   1
1   3   3   1
1   4   6   4   1
1   5  10  10   5   1
1   6  15  20  15   6   1
1   7  21  35  35  21   7   1
1   8  28  56  70  56  28   8   1
1   9  36  84 126 126  84  36   9   1

编写程序,输入一个整数 number,通过二维数组的方式输出杨辉三角的第 number 行。

实现思路

  • 定义一个100*100的数组
  • for循环遍历并定义第i行的第i个元素以及第i行的第1个元素都为1
  • 当长度大于2时,执行如下算法
Text Only
1
2
for (j = 1; j <= i-1; j++)
   arr[i][j] = arr[i-1][j-1] + arr[i-1][j];

17.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>

int main()
{
    int arr[100][100] = {0};
    for (int i = 0; i < 100; i++)
    {
        arr[i][i] = 1;
        arr[i][0] = 1;
        if (i > 1)
        {
            for (int j = 1; j <= i - 1; j++) {
                arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
            }
        }
    }

    int number;
    scanf("%d", &number);
    for (int i = 0; i < number; i++)
    {
        printf("%d ", arr[number - 1][i]);
    }

    return 0;
}

17.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main()
{
    int length, arr[100][100], i, j;

    scanf("%d", &length);

    for (i = 0; i < length; i++){
        arr[i][i] = 1;
        arr[i][0] = 1;
    }

    if (length > 2) {
        for (i = 2; i < length; i++)
            for (j = 1; j <= i-1; j++)
                arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
    }

    for (i = 0; i < length; i++) {
        printf("%6d", arr[length-1][i]);
    }

    printf("\n");

    return 0;
}

18

统计字符个数

请用程序实现: 输入一个长度不超过100的字符串string,分别统计出这个字符串包含的英文字母、空格、数字和其他字符的个数。

提示: 如果'A' <= char <= 'Z',则char是一个大写字母。

注意: C语言中,可以使用char string_name[num]保存字符串数据,其中num表示字符串的最大长度;可以使用gets(string_name)获取从键盘输入的字符串并将输入的字符串保存到变量string_name中,可以使用strlen(string_name)获取字符串string_name的长度。

18.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//关于此题的说明:使用的gets函数并不适用于所有编译环境,所以使用时要注意。
//注意引用头文件<string.h>
#include <stdio.h>
#include <string.h>

int main() {
    char string_name[101];

    int letter = 0, space = 0, number = 0, other = 0;
    //scanf("%s",&string);
    //string_name[101]={string};
    gets(string_name);

    int num = strlen(string_name);
    for (int i = 0; i < num; i++)
    {
        if (string_name[i] >= 'A' && string_name[i] <= 'Z')
        {
            letter++;
        }
        else if (string_name[i] >= 'a' && string_name[i] <= 'z')
        {
            letter++;
        }
        else if (string_name[i] >= '0' && string_name[i] <= '9')
        {
            number++;
        }
        else if (string_name[i] == ' ')
        {
            space++;
        }
        else
        {
            other++;
        }
    }
    printf("letter:%d\nspace:%d\nnumber:%d\nother:%d\n", letter, space, number, other);
    return 0;
}

18.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>

int main () {
  char string[100];
  gets(string);
  int char_num = 0, space_num = 0, number_num = 0, other_num = 0;
  for (int i = 0; i < strlen(string); i++) {
    if (('a' <= string[i] && string[i] <= 'z')||('A' <= string[i] && string[i] <= 'Z')) {
      char_num += 1;
    } else if (string[i] == ' ') {
      space_num += 1;
    } else if ('0' <= string[i] && string[i] <= '9') {
      number_num += 1;
    } else {
      other_num += 1;
    }
  }
  printf("letter: %d\n", char_num);
  printf("space: %d\n", space_num);
  printf("number: %d\n", number_num);
  printf("other: %d\n", other_num);
  return 0;
}

19

小写字母转换为密码

编写一个程序,输入一个小写字母,并将它转换为密码。转换规则:将 ‘a’变成’Z’,将 ‘b’变成’Y’,将 ‘c’变成’X’…。

19.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>

int main() {
    char low;

    // 输入小写字母
    scanf(" %c", &low);

    // 转换为密码
    char password = 'Z' - (low - 'a');

    // 输出密码
    printf("%c\n", password);

    return 0;
}
C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

char fun(char c);

int main() {
    char ch;
    scanf("%c", &ch);
    ch = fun(ch);
    printf("%c", ch);
    return 0;
}

char fun(char c) {
    return ('Z' - (c - 'a'));
}

19.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

char fun(char c);

int main() {
    char c;
    printf("请输入一个小写字母:");
    scanf("%c",&c);
    c=fun(c);
    printf("%c\n",c);
    return 0;
}

char fun(char c) {
    char c1;
    c1='z'-(c-'a')-32;
    return c1;
}

20

连接两字符串的函数

在函数中将两个字符串string1, string2连接成一个字符串string

函数定义

Text Only
1
int concatenate (char string1[], char string2[], char string[]);

参数说明

参数 string1、string2、string 均是字符串,在函数中将 string1 和 string2 连接为一个字符串 string,且 string1 在 string2 前。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int concatenate(char string1[], char string2[], char string[]) {
    int i, j;
    for (i = 0; string1[i] != '\0'; i++) {
        string[i] = string1[i];
    }
    for (j = 0; string2[j] != '\0'; j++) {
        string[i + j] = string2[j];
    }
    string[i + j] = '\0'
}

int main() {
    char string1[100], string2[100], string[100];

    //scanf("%s", string1);
    //scanf("%s", string2);

    //fgets(string1, sizeof(string1), stdin);
    //fgets(string2, sizeof(string2), stdin);

    gets(string1);
    gets(string2);

    concatenate(string1, string2, string);
    printf("%s\n", string);
    return 0;
}

21

反序存放字符串的函数

在函数中将字符串按反序存放。

函数定义

Text Only
1
int inverse (char str[]);

参数说明

参数 str 是字符串,在函数中需要将该字符串进行反序存放。

21.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <string.h>

// 函数声明
void inverse(char str[]);

int main() {
    char inputString[100];

    // 输入字符串
    fgets(inputString, sizeof(inputString), stdin);

    // 调用函数反序存放字符串
    inverse(inputString);

    // 输出结果
    printf(" %s\n", inputString);

    return 0;
}

// 反序存放字符串的函数
void inverse(char str[]) {
    int length = strlen(str);

    // 使用两个指针进行反序交换
    int start = 0;
    int end = length - 1;

    while (start < end) {
        // 交换字符
        char temp = str[start];
        str[start] = str[end];
        str[end] = temp;

        // 移动指针
        start++;
        end--;
    }
}

21.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>

int inverse (char str[]) {
    char t;
    int i, j;
    for (i = 0, j = strlen(str); i < strlen(str) / 2; i++, j--) {
        t = str[i];
        str[i] = str[j - 1];
        str[j - 1] = t;
    }
}

int main () {
    char str[100];
    scanf("%s", str);
    inverse(str);
    printf("%s\n", str);
    return 0;
}

22

判断素数的函数

编程实现: 请完善函数isPrimeisPrime函数的功能是判断一个数是否为素数,如果是素数,则输出Yes,不是素数则输出No

注意:请不要修改 main 函数中的代码。

参数说明

  • 参数 num 是整数,在函数中需要判断该数是否为素数。

22.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>

// 函数声明
void isPrime(int num);

int main() {
    int num;

    // 输入整数
    scanf("%d", &num);

    // 调用函数判断素数
    isPrime(num);

    return 0;
}

// 判断素数的函数
void isPrime(int num) {
    if (num < 2) {
        printf("No\n"); // 小于2的数不是素数
        return;
    }

    zfor (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            printf("No\n"); // 能够被整除,不是素数
            return;
        }
    }

    printf("Yes\n"); // 没有找到能够整除的因子,是素数
}

22.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int isPrime (int num) {
    if (num < 2) {
        printf("No\n");
    }
    else if (num == 2 || num == 3) {
        printf("Yes\n");
    }
    else {
        int flag = 1, i;
        for (i = 2; i <= num / 2 && flag == 1; i++)
            if (num % i == 0)
                flag = 0;
        if (flag)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

int main () {
    int num = 11;
    isPrime(num);
    return 0;
}

23

计算年龄

有 n 个人围坐在一起,问第 n 个人多大年纪,他说比第 n-1 个人大 2 岁;问第 n-1 个人,他说比第 n-2 个人大 2 岁;…………,以此类推,问第 2 个人,他说比第 1 个人大 2 岁。第 1 个人说自己 10 岁。

编程实现: 请完善函数ageage函数的功能是用递归法计算并输出第 n 个人的年龄。

注意:请不要修改 main 函数中的代码。

参数说明

  • n,整数,表示人数。
C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>

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

int main () {
    int n;
    scanf("%d", &n);
    int ages = age(n);
    printf("%d\n", ages);
    return 0;
}

24

最小公倍数

编程实现: 请完善函数common_multiplecommon_multiple函数的功能是计算并返回两个整数的最小公倍数。

注意:请不要修改 main 函数中的代码。

参数说明

  • number1, number2, 两个整数。

24.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>

// 函数声明
int common_multiple(int number1, int number2);

int main() {
    int number1, number2;

    // 输入两个整数
    scanf("%d %d", &number1, &number2);

    // 调用函数计算最小公倍数
    int result = common_multiple(number1, number2);

    // 输出结果
    printf("%d\n", result);

    return 0;
}

// 计算最小公倍数的函数
int common_multiple(int number1, int number2) {
    int max = (number1 > number2) ? number1 : number2;

    while (1) {
        if (max % number1 == 0 && max % number2 == 0) {
            return max;
        }
        max++;
    }
}

24.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int common_multiple (int number1, int number2) {
    int multiple;
    for (multiple = 1; ; multiple++) {
        if (multiple % number1 == 0 && multiple % number2 == 0) {
            break;
        }
    }
    return multiple;
}

int main () {
    int multiple, number1 = 24, number2 = 16;
    multiple = common_multiple(number1, number2);
    printf("%d", multiple);
    return 0;
}

25

使用指针实现字符串复制

编程实现:编写函数void StrCopy(char ps1, char ps2),其功能:把字符串ps2的内容复制到字符串ps1中,要求不能使用strcpy函数。主函数输入两个字符串和调用StrCopy函数输出复制后ps1的字符串。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#define N 30

void StrCopy(char* ps1, char* ps2) {
    while (*ps2) {
        *ps1++ = *ps2++;
    }
    *ps1 = '\0';
}

int main() {
    char str1[N], str2[N];

    fgets(str1, N, stdin);
    fgets(str2, N, stdin);
    //  scanf("%s%s", str1, str2);

    StrCopy(str1, str2);
    printf("复制后的字符串为:\n");
    //  puts(str1);
    printf("%s", str1);

    return 0;
}

26

使用指针实现删除数组中指定元素

编程实现:编写一个函数void Delete(int *a,int i),用于实现删除数组a中第i个元素。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#define N 10

void Delete(int* a, int i) {
    for (; i < N - 1; i++) {
        *(a + i) = *(a + i + 1);
    }
}

int main() {
    int a[N], i, n;

    printf("请输入%d个整数:", N);
    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }

    printf("请输入删除数组中第几个元素:");
    scanf("%d", &n);

    Delete(a, n);

    printf("删除数组中第%d个元素后的数据为:\n", n);
    for (i = 0; i < N - 1; i++) {
        printf("%d ", a[i]);
    }

    printf("\n");
    return 0;
}

27

用指针求平均成绩

编程实现: 请完善函数averageaverage函数的功能是计算成绩数组中的平均成绩,并将平均成绩返回。

注意:请不要修改 main 函数中的代码。

参数说明

  • n,整型,表示成绩数组的长度。
  • score,整型指针,表示保存成绩的数组。
C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

double average (int n, int *score) {
    double ave = 0;
    for (int i = 0; i < n; i++) {
        ave = ave + score[i];
    }
    ave = ave / n;
    return ave;
}

int main () {
    int n = 10, score[10] = {88, 99, 76, 78, 89, 93, 95, 86, 92, 85};
    double ave_score;
    ave_score = average(n, score);
    printf("%f\n", ave_score);
    return 0;
}

28

用指针对数组元素排序

编程实现: 请完善函数sortsort函数的功能是使用指针对数组元素进行由小到大排序。

注意:请不要修改 main 函数中的代码。

参数说明

  • n,整型,表示数组长度。
  • p,整型指针,表示需要排序的数组。
C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>

void sort(int n, int* p) {
    int i, j, t;
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if  (p[j] > p[j + 1]) {
                t = p[j];
                p[j] = p[j + 1];
                p[j + 1] = t;
            }
        }
    }
}

int main() {
    int arr[10], i;
    for (i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }

    sort(10, arr);

    printf("排序后:");
    for (i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

29

用指针对两个数进行交换

编程实现: 请完善函数exchangeexchange函数的功能是用指针对两个整数进行交换。

注意:请不要修改 main 函数中的代码。

参数说明

  • p,整型指针,存储待交换的数字一。
  • q,整型指针,存储待交换的数字二。
C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>

void exchange (int *p,int *q) {
    int t;
    t=*p;
    *p=*q;
    *q=t;
}

int main() {
    int a,b;
    scanf("%d %d",&a,&b);
    exchange(&a,&b);
    printf("交换后:%d %d\n",a,b);
    return 0;
}

30

简单的图书借阅程序

编程实现:简单的图书借阅程序。假定图书信息包括:编号、书名、价格、借阅人姓名、是否已借出标记。程序功能:根据输入的图书编号,查找库中是否有此图书,若无此图书,输出相应信息表示没有此书;若有,再查看是否已被借出,若没有被借出,则输入借阅人姓名并将此书标记为借出,若已被借出,输出相应信息表示已被借出。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<stdio.h>
#include<string.h>
#define N 3
typedef struct BookList { //书的结构体
    char num[20];//图书编号
    char name[20];//书名
    int price;//书的价格
    char person[20];//借阅人
    int yes;//判断书是否已经借出,1没有借出,0已借出
} Book;
void bookborrow(Book *b,int n,char *bh) {
    //简单的图书借阅程序
    int i,flag=0;//0:要借阅的图书不存在,1:要借阅的图书存在
    for(i=0; i<n; i++,b++)
        if(strcmp(b->num,bh)==0) {
            flag=1;
            break;
        }
    if (flag)
        if(b->yes==1) {
            printf("此书可借!\n ");
        } else
            printf("此书已被借出!\n ");
    else
        printf("没有此图书!\n ");
}
/* 其它参考写法
void bookborrow(Book b[], int n, char* num) {
    int flag = 0; //0:要借阅的图书不存在,1:要借阅的图书存在
    for (int i = 0; i < n; i++) {
        if (strcmp(b[i].num, num) == 0) {
            flag = 1;
            if (b[i].yes == 1) {
                printf("此书可借!\n");
            } else {
                printf("此书已被借出!\n");
            }
            break;
        }
    }
    if (!flag) {
        printf("没有此图书!\n");
    }
}
*/
int main() {
    Book b[N]= {{"J001","C语言程序设计",28,"Mary",0},{"J002","JAVA程序设计",35,"",1},{"T001","数据结构",26,"",1}};
    char bh[20];
    printf("请输入要借阅的图书编号:\n");
    gets(bh);
    bookborrow(b,N,bh);
    return 0;
}

31

读取标准输入并赋值给结构体

用函数实现,读取标准输入并赋值给结构体。

函数定义

Text Only
1
void input_person(person *p);

函数说明

input_person函数的功能是,将读取的标准输入赋值给结构体。

31.1

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

struct person {
    char name[24];
    int age;
};

void input_person(struct person* p) {
    // TODO:请编写代码,将标准输入的信息读入 person 的 `p` 中
    fgets(p->name, 25, stdin);
    scanf("%d", &p->age);
}

int main() {
    struct person p = { "", 0 };
    input_person(&p);
    printf("姓名:%s\n", p.name);
    printf("年龄:%d\n", p.age);
    return 0;
}

31.2

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <string.h>

typedef struct {
    char name[50];
    int age;
} person;

void input_person(person *p) {
    printf("请输入姓名: ");
    fgets(p->name, sizeof(p->name), stdin); // 读取姓名,包括换行符
    p->name[strcspn(p->name, "\n")] = '\0'; // 去掉末尾的换行符

    printf("请输入年龄: ");
    scanf("%d", &(p->age)); // 读取年龄
    getchar(); // 消耗掉输入缓冲区中的换行符
}

int main() {
    person p;
    input_person(&p);

    printf("姓名: %s\n", p.name);
    printf("年龄: %d\n", p.age);

    return 0;
}

32

以下程序的功能是将文件file1.c的内容输出到屏幕上并复制到文件file2.c 中,请填入适当内容。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include<stdio.h>
int main() {
    FILE  *fp1,*fp2;
    //FILE _____;
    char ch;
    fp1=fopen("file1.c","r");
    fp2=fopen("file2.c","w");
    while((ch=fgetc(fp1))!=EOF) {
        putchar(ch);
        //putchar(_____);
        fputc(ch,fp2)
        //fputc(_____)
    }
    fclose(fp1);
    fclose(fp2);
    return 0;
}

33

下面程序从一个二进制文件中读入结构体数据,并把结构体数据显示在终端屏幕上。请填入适当内容。

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include<stdio.h>

struct rec {
    int num;
    float total;
};

int main() {
    FILE* f;
    if ((f = fopen("bin.dat", "rb")) == NULL);
    {
        printf("cannot open\n");
        exit(0);
    }
    reout(f);
    fclose(f);
    return 0;
}

void reout(FILE* f) {
//void reout(_____) {
    struct rec r;
    fread(&r, sizeof(struct rec), 1, f);    
    //fread(&r,_____, 1, f);
    while (!feof(f)) {
        printf("%df,%f\n", r.num, r.total);
        //printf("%df,%f\n", _____);
        fread(&r, sizeof(struct rec), 1, f);
        //fread(&r,_____, 1, f);
    }
}

34

下述程序向文件输出的结果是

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
void WriteStr1(char *fn,char *str,char *rw) {
    FILE *fp;
    fp=fopen(fn,rw);
    fputs(str,fp);
    fclose(fp);
}

void WriteStr2(char *fn,char *str,char *rw) {
    FILE *fp;
    fp=fopen(fn,rw);
    rewind(fp);
    fputs(str,fp);
    fclose(fp);
}

int main() {
    WriteStr1("t1.dat","start","w");
    WriteStr2("t1.dat","end","a");
    return 0;
}

startend

35

**以下程序输出的结果是 **

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>
int main() {
    FILE *fp;
    int i=20,j=30,k=40,n=50;
    fp=fopen("d1.dat","w");
    fprintf(fp,"%d %d\n",i,j);
    fprintf(fp,"%d %d\n",k,n);
    fclose(fp);
    fp=fopen("d1.dat","r");
    fseek(fp,4,0);
    fscanf(fp,"%d%d",&k,&n);
    printf("%d,%d\n",k,n);
    fclose(fp);
    return 0;
}

0,40

36

程序运行后的输出结果是

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int main() {
    FILE *fp;
    int  i, k, n;
    fp=fopen("data.dat", "w+");
    for(i=1; i<6; i++) {
        fprintf(fp,"%d",i);
        if(i%3==0)  fprintf(fp,"%c",'\n');
    }
    rewind(fp);
    fscanf(fp,"%d%d",&k,&n);
    printf("%d %d\n", k,n);
    fclose(fp);
    return 0;
}

123 45

37

下述程序输出的结果是

C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
int main( ) {
    FILE *fp;
    int i,a[4]= {1,2,3,4},b;
    fp=fopen("data.dat","wb");
    for(i=0; i<4; i++)
        fwrite(&a[i],sizeof(int),1,fp);
    fclose(fp);
    fp=fopen("data.dat","rb");
    fseek(fp,-2*sizeof(i),SEEK_END);
    fread(&b,sizeof(int),1,fp);
    fclose(fp);
    printf("%d\n",b) ;
    return 0;
}

3