5/11后面部分:+顺序排序+元素交换+计算每门课程的各种成绩+存放规律的数据 注意:一味的复制肯定要出问题,第2个的最后一部分有修改,注意观察

目录

第一个已经输出过一次:

第二个:

编程实现:程序功能是用起泡法对数组中n个元素按从大到小的顺序进行排序。

​编辑的确出现了一些问题哦:

 ​编辑目前是可以运行,但AI不给我们通过:

 最后还是我的代码获胜:

进行一些注释: 

第三个:

编程实现:将a所指4×3矩阵中第k(k=2)行的元素与第0行元素交换。

第四个:

编程实现,输入5位学生的三门课程的考试成绩,将成绩存放在5行三列的二维数组中,计算每门课程的平均成绩、最高分与最低分。

排了最大值:

排了最小值:

好吧,报错才是常态 ;

第5个:

两个循环模块中间只是操作不同。弄得看了一大会。​编辑

给一下解释:

 最后得到这样的结果:代码

 运行结果:

进行一波解释吧,AI写的有点复杂

变量声明:

用户输入:

输入验证:

填充二维数组:


第一个已经输出过一次:

插入排序,搞起来,一路狂奔,数组插入-CSDN博客

第二个:

编程实现:程序功能是用起泡法对数组中n个元素按从大到小的顺序进行排序。

程序运行结果:排序前的数据:   12 34 4 7 9 6 8 3 53 -1

排序后的数据:   53 34 12 9 8 7 6 4 3 -1

 使用起泡排序算法对数组中的元素进行从大到小的排序,可以遵循以下步骤:

  1. 遍历数组,比较相邻的两个元素。
  2. 如果前一个元素小于后一个元素,则交换它们的位置。
  3. 重复上述步骤,直到没有更多的元素需要交换为止。

 void bubbleSort(int arr[], int n) {  
    int i, j, temp;  
    for (i = 0; i < n - 1; i++) {  
        for (j = 0; j < n - i - 1; j++) {  
            if (arr[j] < arr[j + 1]) {  
                // 交换 arr[j] 和 arr[j + 1]  
                temp = arr[j];  
                arr[j] = arr[j + 1];  
                arr[j + 1] = temp;  
            }  
        }  
    }  
}  

 有些复杂,还是慢慢来:

的确出现了一些问题哦:

在内层循环的条件中,j < i - 1 应该是 j < 9(或j < i) 因为想在每次外层循环迭代时,都检查当前元素arr1[i]与它前面的所有元素。使用j < i - 1实际上会导致最后一次外层循环时内层循环不执行,虽然在这个特定情况下不影响最终结果,但这是一个逻辑上的不一致。

 目前是可以运行,但AI不给我们通过:

 内层循环应该是 j < i - 1 而不是 j < i。当进行起泡排序时,我们需要将当前元素 arr1[i] 与它前面的所有元素 arr1[j](其中 j 从 0 到 i - 1)进行比较。如果 arr1[i] 比 arr1[j] 小,则交换它们的位置。使用 j < i 会导致不必要的比较,并且当 i 是最后一个元素时,会产生数组越界的错误。

   for (int i = 1; i < 10; i++) { // 外层循环从第二个元素开始  
        for (int j = 0; j < i; j++) { // 内层循环比较当前元素与它前面包括它自己的所有元素

 最后还是我的代码获胜:

#include<stdio.h>
int main()
{
	int arr1[10] = { 12,34,4,7,9,6,8,3,53,-1 };
	for (int i = 1; i <10; i++)
	for (int j = 0; j < i ; j++)
	{
		if (arr1[i]<arr1[j])
		{
			int t = arr1[i]; arr1[i] = arr1[j]; arr1[j] = t;
		}
	}
	printf("排序完成的数组为:");
	for (int i = 0; i < 10; i++)
	{
		printf("%d  ", arr1[i]);
	}
	return 0;
}

进行一些注释: 

提供的代码的中文注释:

c
#include<stdio.h>  // 引入标准输入输出库,用于printf等函数  
  
int main()  // 主函数入口  
{  
    int arr1[10] = { 12,34,4,7,9,6,8,3,53,-1 };  // 定义一个包含10个整数的数组arr1,并初始化  
  
    // 外层循环,从数组的第二个元素开始(i=1),到最后一个元素的前一个位置(i<10)  
    for (int i = 1; i < 10; i++)  
    {  
        // 内层循环,从数组的第一个元素开始(j=0),到当前外层循环元素的前一个位置(j<i)  
        for (int j = 0; j < i; j++)  
        {  
            // 如果当前外层循环的元素arr1[i]小于内层循环的元素arr1[j]  
            if (arr1[i] < arr1[j])  
            {  
                // 交换arr1[i]和arr1[j]的值,确保大的数在前面,小的数在后面  
                int t = arr1[i];  // 使用临时变量t保存arr1[i]的值  
                arr1[i] = arr1[j];  // 将arr1[j]的值赋给arr1[i]  
                arr1[j] = t;  // 将保存在t中的arr1[i]的原值赋给arr1[j]  
            }  
        }  
    }  
  
    // 打印排序完成的数组  
    printf("排序完成的数组为:");  
  
    // 遍历数组并打印每个元素  
    for (int i = 0; i < 10; i++)  
    {  
        printf("%d  ", arr1[i]);  // 打印数组元素,并在每个元素后添加一个空格  
    }  
  
    return 0;  // 主函数返回0,表示程序正常结束  
}
这段代码实现了起泡排序算法,用于对数组arr1进行从大到小的排序。外层循环遍历数组的每个元素,内层循环则用于比较当前元素与其前面的所有元素,并根据比较结果交换位置。最终,数组将以从大到小的顺序排列,并通过循环打印出排序后的结果。

注意⚠️注意⚠️注意⚠️注意⚠️

今天早上打开来才发现有问题, 真实情况,还好,当时没有发进去,排序的顺序排反了:】

以下是修正过的:

 改了一下符号,换了一下赋值顺序;⬆️

第三个:

编程实现:将a所指4×3矩阵中第k(k=2)行的元素与第0行元素交换。

测试数据: 1   2   3

           4   5   6

           7   8   9

          10  11  12

程序运行结果:

The array before moving:

    1   2   3

    4   5   6

    7   8   9

    10  11  12

The array after moving:

    7   8   9

    4   5   6

    1   2   3

    10  11  12

第3个的一部分

第1阶段的输出:

用一个简单的交换:

	for ( j = 0; j < 3; j++)
	{
		 int t= arr1[0][j];
		  arr1[0][j] = arr1[2][j];
		  arr1[2][j] = t;
	}

for (int j = 0; j < 3; j++) { int t = arr1[0][j]; // 保存第0行的元素 arr1[0][j] = arr1[2][j]; // 第0行元素替换为第k行(第3行)对应元素 arr1[2][j] = t; // 第k行(第3行)元素替换为之前第0行的元素 }

 代码如下

#include<stdio.h>
int main()
{
	int arr1[4][3] = { {1,2,3},{4,5,6},{7,8,9},{10,11,12} };
	printf("The array before moving:\n");
	int i=0, j=0;
	for (int i = 0; i <4; i++)
	{
		for (int j = 0; j <3; j++)
		printf("%5d", arr1[i][j]);
		printf("\n");
	}
	for ( j = 0; j < 3; j++)
	{
		 int t= arr1[0][j];
		  arr1[0][j] = arr1[2][j];
		  arr1[2][j] = t;
	}
	printf("The array after moving:\n");
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 3; j++)
			printf("%5d", arr1[i][j]);
		printf("\n");
	}
	return 0;
}

第四个:

编程实现,输入5位学生的三门课程的考试成绩,将成绩存放在5行三列的二维数组中,计算每门课程的平均成绩、最高分与最低分。

输入测试数据: 45  87  90

76  84  84

71  85  97

56  67  89

82  65  56

程序运行结果:每门课程的最高分

   82.00   87.00   97.00

每门课程的最低分

   45.00   65.00   56.00

每门课程的平均成绩

   66.00   77.60   83.20

进行一个数组排序,先来一个列排序:

排了最大值:

	for (int j = 0; j < 3; j++)
	{
		max[j] = arr1[0][j];
	}
	for (int i = 1; i < 5; i++)
	{

		for (int j = 0; j < 3; j++)
		{
			if (max[j] < arr1[i][j])
			{
				 max[j] = arr1[i][j];
			}
		}
	}

排了最小值:

	for (int j = 0; j < 3; j++)
	{
		min[j] = arr1[0][j];
	}
	for (int i = 1; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (min[j] > arr1[i][j])
			{
				min[j] = arr1[i][j];
			}
		}
	}

 OK,干了半个小时,也没搞出多少东西来;

后面再加一个平均。

然后这里现先一个补充,求数组列的平均值⬇️

   for (int col = 0; col < COLS; col++) {  
        double sum = 0.0;  
        for (int row = 0; row < ROWS; row++) {  
            sum += matrix[row][col]; // 累加当前列的所有元素  
        }  
        averages[col] = sum / ROWS; // 计算当前列的平均值并存储  
    }  

 为啥子都能报错?我那个乖乖。

🍐🎼下面这一段也是一大堆错误;🍐🎼🍐🎼

好吧,报错才是常态 ;

  1. sum[3]+= arr1[i][j]; 这一行中的 sum[3] 是不正确的,因为数组 sum 的索引是从 0 到 2(共 3 个元素),所以应该使用 sum[j] 来累加对应列的和。

  2. avg[3] = sum[j] / 3; 这一行同样存在索引越界的问题,因为 avg 数组(虽然没有给出其定义,但假设它存在且足够大)的索引也应该是从 0 到 2。所以应该使用 avg[j] 来存储对应列的平均值。

  3.  printf 语句没有换行,所以所有的平均值会打印在同一行。如果希望每门课程的平均分都打印在新的一行,应该在打印后添加一个换行符 \n

 改:

double max[3] = {0.0}, min[3] = {1e9}, avg[3], sum[3] = {0.0}; // 初始化max为0,min为一个较大的数

 虽然已经出炉了,但是在VS上面好像有时候会报错

#include<stdio.h>
int main()
{
	int arr1[5][3] ;
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			scanf("%d", &arr1[i][j]);
		}
	}
	double max[3] = { 0.0 }, min[3] = { 0.0 }, avg[3] = { 0.0 }, sum[3] = { 0.0 };
	for (int j = 0; j < 3; j++)//最大
	{
		max[j] = arr1[0][j];
	}
	for (int i = 1; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (max[j] < arr1[i][j])
			{
				 max[j] = arr1[i][j];
			}
		}
	}
	for (int j = 0; j < 3; j++)//最小
	{
		min[j] = arr1[0][j];
	}
	for (int i = 1; i < 5; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (min[j] > arr1[i][j])
			{
				min[j] = arr1[i][j];
			}
		}
	}
	for (int i = 0; i < 5; i++)//avg
	{
		for ( int j = 0; j < 3; j++)
		sum[j]+= arr1[i][j];
	}
	for ( int j = 0; j < 3; j++)
	{
		avg[j] = sum[j] / 5;
	}
	printf("每门课程的最高分为:");
	for ( int j = 0; j < 3; j++) 
	{
		printf("%.2lf  ", max[j]);
	}
	printf("\n");
	printf("每门课程的最低分为:");
	for (int j = 0; j < 3; j++)
	{
		printf("%.2lf  ", min[j]);
	}
	printf("\n");
	printf("每门课程的平均分为:");
	for (int j = 0; j < 3; j++)
	{
		printf("%.2lf   ", avg[j]);
	}
	return 0;
}

 结果很是OK

因为学的不是那么太多。,所以弄的有点太复杂了

Ai这个在VS上面就不会报错;他在每一处都进行double转换

你们只要加上之一句话就肯定不会出错。

本来打算让Ai来简化这个过程。

但是他好像把最大和最小的放在一起来处理。

 更简单的合并在这里:

int arr1[5][3];
double max[3], min[3], sum[3] = {0}, avg[3];

这里声明了一个5x3的整数数组arr1,用于存储5个学生的3门课程成绩。同时,声明了三个双精度浮点数组maxminsum,用于存储每门课程的最大值、最小值和总和。sum数组被初始化为0。另外,声明了一个双精度浮点数组avg用于存储每门课程的平均值。

输入和计算最大值、最小值、总和

for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
scanf("%d", &arr1[i][j]);
sum[j] += arr1[i][j];
if (arr1[i][j] > max[j]) max[j] = arr1[i][j];
if (arr1[i][j] < min[j]) min[j] = arr1[i][j];
}
}

这个嵌套循环首先通过scanf函数从用户处获取输入,然后将这些输入值存储到arr1数组中。同时,对于每门课程(即每个j),它计算该门课程的总和(sum[j])、最大值(max[j])和最小值(min[j])。

计算平均值

for (int j = 0; j < 3; j++) {
avg[j] = sum[j] / 5.0;
}

这个循环计算每门课程的平均值,并将结果存储到avg数组中。

输出结果

printf("Maximum scores for each course: %.2lf %.2lf %.2lf\n", max[0], max[1], max[2]);
printf("Minimum scores for each course: %.2lf %.2lf %.2lf\n", min[0], min[1], min[2]);
printf("Average scores for each course: %.2lf %.2lf %.2lf\n", avg[0], avg[1], avg[2]);

这些printf语句用于输出每门课程的最大值、最小值和平均值。

第5个:

编程实现:根据输入的m值(2≤m≤9),在m行m列的二维数组中存放如下所示规律的数据。(建议定义二维数组时,行的长度和列的长度可以定义成10以上就可以)

输入测试数据: 2

程序运行结果:

                 1     2

                 2     4

输入测试数据: 4

程序运行结果:

         1   2   3   4

         2   4   6   8

         3   6   9   12

         4   8   12  16

输入测试数据: 9

程序运行结果:

1    2    3    4    5    6    7    8    9

2    4    6    8   10   12   14   16   18

3    6    9   12   15   18   21   24   27

4    8   12   16   20   24   28   32   36

5   10   15   20   25   30   35   40   45

6   12   18   24   30   36   42   48   54

7   14   21   28   35   42   49   56   63

8   16   24   32   40   48   56   64   72

9   18   27   36   45   54   63   72   81

两个循环模块中间只是操作不同。弄得看了一大会。

给一下解释:

第一个for循环块:

for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = (i + 1) * (j + 1); // 计算当前元素的值
}
}

这个循环块会填充整个二维数组arr。对于每一行i和每一列j,它都会计算(i + 1) * (j + 1)的值,并将这个值存储在arr[i][j]。所以,整个m x m的数组都会被正确地按照规律填充。

第二个for循环块:

for (i = 0; i < m; i++) {
for (j = 0; j < i; j++) {
arr[i][j] = (i + 1) * (j + 1);
}
}

这个循环块只会填充二维数组arr的上三角部分(包括对角线)。注意内层循环的条件是j < i,这意味着对于每一行i,它只会填充从arr[i][0]arr[i][i-1]的元素。因此,数组的下三角部分(不包括对角线)将不会被填充,它们将保持未初始化的状态(通常是0或垃圾值)。

简而言之,第一个循环块填充整个数组,而第二个循环块只填充数组的上三角部分。

 最后得到这样的结果:代码

#include<stdio.h>
int main()
{
	int arr[10][10];
	int m, i, j;
	printf("请输入值:\n");
	scanf("%d", &m);
	for ( i = 0; i < m; i++)
	{
		for (j = 0; j < m; j++) 
		{
			arr[i][j] = (i + 1) * (j + 1);
		}
	}
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%3d", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

 运行结果:

 中间加上一句这个也挺好的;

进行一波解释吧,AI写的有点复杂

  1. 变量声明

    • arr[10][10]:一个10x10的二维整数数组,用于存储计算得到的值。
    • m:一个整数,用于表示用户希望生成的二维数组的大小(行数和列数)。
    • i 和 j:用于循环的整数变量。
  2. 用户输入

    • 程序首先提示用户输入一个值(m),这个值应该是一个整数,并且应该在2到9之间(包括2和9)。
  3. 输入验证

    • 使用if语句检查用户输入的m值是否在2到9的范围内。
    • 如果m的值不在这个范围内,程序将打印一条错误消息,并通过return 1;结束程序。
  4. 填充二维数组

    • 使用两个嵌套的for循环遍历二维数组的每一个元素。
    • 对于每一个元素arr[i][j],将其设置为(i + 1) * (j + 1)的值。这里,i是行索引(从0开始),j是列索引(从0开始),所以(i + 1)(j + 1)确保了我们从1开始计算,而不是从0开始。

 还有两套赶死了干了

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值