2 Star 1 Fork 0

jiangminghui1 / cp-reports

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
report1.md 8.82 KB
一键复制 编辑 原始数据 按行查看 历史
jiangminghui1 提交于 2021-12-18 02:25 . update report1.md.

实验一:基本控制结构的应用

1. 实验目的与要求

(1)认识C语言开发环境,至少会使用一种开发环境进行编程;

(2)能运用标准输入输出函数对数据进行输入与输出;

(3)能灵活运用三种基本结构解决实际问题。

2. 实验内容

(1)标准输入/输出函数的使用;

(2)顺序结构程序设计;

(3)选择结构程序设计;

(4)循环结构程序设计;

(5)三种基本控制结构的综合应用。

问题1:计算班级平均分

某班级若干个学生参加测验。在得到本次测验的成绩(0 到 100 之间的整数)之后,确定该班级本次测验的平均分(保留两位小数)。

1. 问题陈述

设计一个求班级平均分的程序,运行一次可以处理任意数量的测验成绩,其中测验成绩是 0 到 100 之间的整数,班级平均分保留两位小数。

2. 输入、输出描述

-【输入】一个班若干学生的测验成绩

-【输出】该班级的平均成绩


I[一个班若干学生的测验成绩] --> P --> O[该班级的平均成绩]

3. 演算示例

为了处理任意多个数据,用 -1 作为输入结束的标记值。例如:输入 95, 96, 75, 74, 89 和 -1,程序将计算 95, 96, 75, 74 和 89 的平均值,-1 作为结束标记不计算平均值。

示例1:测验成绩为 75,94,97,88,70,64,83,89。

Enter grade, -1 to end: 75
Enter grade, -1 to end: 94
Enter grade, -1 to end: 97
Enter grade, -1 to end: 88
Enter grade, -1 to end: 70
Enter grade, -1 to end: 64
Enter grade, -1 to end: 83
Enter grade, -1 to end: 89
Enter grade, -1 to end: -1
Class average is 82.50

假如一开始就输入了 -1,则不会输入任何测验成绩,程序不会计算平均分,并提示没有输入测验成绩

示例2:没有任何测验成绩。

Enter grade, -1 to end: -1 No grades were entered

4.算法设计

算法总体描述:

Step 1. 初始化变量
Step 2. 输入测验成绩,求和并计数
Step 3. 计算并打印班级平均值 

算法完整描述:

// Step 1. 初始化变量 初始化总分 total 为 0 初始化计数器 counter 为 0

// Step 2. 输入测验成绩,求和并计数 输入第一个测验成绩 grade(也可能是结束标记值) WHILE 用户尚未输入结束标记值 DO 将测验成绩 grade 累加到总分 total 中 将计数器 counter 加 1 输入下一个测验成绩 grade(也可能是结束标记值) ENDWHILE

// Step 3. 计算并打印班级平均值 IF 计数器 counter 不等于 0 THEN 置平均值 average 为总分 total 除以 counter 打印平均分 ELSE 打印未输入测验成绩 "No grades were entered" ENDIF 程序代码:

/* 计算测验成绩的班级平均分 */

#include <stdio.h>

int main(void) { int total; // 输入成绩的和 int counter; // 输入成绩个数 int grade; // 测验成绩

float average; // 平均成绩

// 初始化阶段
total = 0; // 初始化总分 total
counter = 0; // 初始化计数器 counter

// 输入测验成绩,求和并计数
//   输入第一个测验成绩
printf("Enter grade, -1 to end: "); // 提示输入
scanf("%d", &grade); // 读取用户输入的测验成绩

//   当用户尚未输入结束标记值时重复做
while (grade != -1) {
    total = total + grade; // 将 grade 累加 total
    counter = counter + 1; // 将计数器 counter 加 1

    // 输入下一个测验成绩
    printf("Enter grade, -1 to end: "); // 提示输入
    scanf("%d", &grade); // 读取下一个测验成绩
}

// 计算并输出结果
if (counter != 0) { // 如果用户至少输入了一个测验成绩
    // 计算班级平均分
    average = (float)total / counter;
    // 显示班级平均分
    printf("Class average is %.2f\n", average);
} else { // 如果没有输入测验成绩,则输出提示信息
    printf("No grades were entered\n");
}

return 0;

}

5.测试

测试结果与两个演算示例一致,测试通过。

小结

  • 通过将特殊的输入数据作为结束标志,用循环解决了求任意个学生平均成绩的问题。
  • 本问题还运用了循环计数和累加求和的方法。
  • 在计算平均值时,务必确保输入成绩的数量不为零,因为零不能做除数。
  • 整数除法不保留小数部分,可以强制转换为 float 等浮点类型再进行计算以获得带小数的结果。

问题2:在n个整数中求最小值

设计一个求在一系列整数中的最小值的程序,运行一次可以找出此系列整数中最小值,在循环输入n个整 数,按 min = 最小值 格式输出整数中最小值。

1.问题陈述

在 n 个数中找到最小值。

2.输入,输出描述

  • 【输入】n个整数(n>0)

  • 【输出】n个整数中最小值

3.演算示例

示例1:n = 5, 5个整数:4 -2 -123 100 0

依次读入 5 个整数,逐个比较选出最小的数,这里是 -123。

先读入第一个数 4,假设其为最小值 min;然后依次读入剩下的数,每读入一个数 number 就与当前最 小值 min 相比较。如果 number 小于 min,则令 min 为 number。

程序运行过程如下:

Enter n: 5 
Enter 5 numbers: 4 -2 -123 100 0 
min = -123

4.算法设计

算法总体设计描述:

输入 n 个数并求出其中最小值 min 

输出 min

细化:

   // 输入 n 个数并求出其中最小值 min 
   输入 n 
   输入第一个数 number 
   min = number 
   FOR i = 2..n DO 
       Read number 
       IF number < min THEN 
           min = number 
       END IF 
   END FOR 

   输出 min

程序代码:


  // 求 n 个数的最小值

  #include <stdio.h>

  int main(void)
  {
     int n; // 数的个数
     int number;
     int min; // 最小值
    
     // 输入 n 个数并求出其中最小值 min

     printf("Enter n: ");
     scanf("%d", &n);
     printf("Enter %d numbers: ", n);

     scanf("%d", &number);

     min = number;  // 假设第一个数是最小值

     for (int i = 2; i <= n; i++) {

         scanf("%d", &number);

         if (number < min)

             min = number;
     }
    
    // 输出 min

    printf("min = %d\n", min);
    
    return 0;
 }

   

5.测试

测试结果与示例一致,测试通过。

小结

  • 本题目也可进行运用数组
  • 运用循环结构for和if语句判断基础知识
  • 注意输出格式,循环条件,判断数值

问题3:猴子吃桃问题

1. 问题陈述

设计一个已知最后一天桃子数求第一天摘桃子数的程序,运行一次可处理10天以内桃子数,其中测试可在1至10天之间,结果进行输出。

2. 输入,输出描述

  • 【输入】猴子吃桃子的天数

  • 【输出】猴子在第一天摘的桃子数

3.手动演算示例

实例1:N=1。显然,第一天摘的桃子数是1。

实例2:N=2。第2天,只剩1个桃子;所以,第1天,有4个桃子(吃一半加一个,剩下1个)。

实例3:N=3。第3天,只剩1个桃子;第2天,有4个桃子;所以,第1天有10个桃子(吃一半加一个,剩下4个)。

.......

总结一下规律,已知某天的桃子数为m,前一天桃子数2(m+1)

4.算法设计

算法描述:

输入天数 N

计算第一天所摘桃子数 m 

输出第一天桃子数 m

算法完整描述:


   输入天数 N

   // 计算第一天所摘桃子数 m

   m = 1  // 第 N 天桃子数

   FOR i = N-1 TO 1 DO

        m = 2(m+1)
   END FOR

   输出第一天桃子数 m

程序代码:

    // 求解猴子吃桃问题

#include <stdio.h>

int main(void)
{
    int N; // 总天数
    int m; // 桃子数
    int i;
    
    // 输入天数 N
    printf("Enter N: ");
    scanf("%d", &N);
    
    // 计算第一天所摘桃子数 m
    m = 1; // 第 N 天桃子数
    for (i = N-1; i >= 1; i--) {
        m = 2 * (m + 1);
    }
    
    // 输出第一天桃子数 m
    printf("Number of peachs in the first day is %d.\n", m);
    
    return 0;
}

5.测试

测试结果与手动演算示例一致,测试通过。

小结

  • 锻炼思维从后往前推导找出数学公式
  • 利用for循环,使题目更简洁清楚,同时正好掌握for循环知识。
  • 最后能准确注意到各个条件之间的关系。
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C
1
https://gitee.com/jiangminghui1/cp-reports.git
git@gitee.com:jiangminghui1/cp-reports.git
jiangminghui1
cp-reports
cp-reports
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891