目录
第一个已经输出过一次:
第二个:
编程实现:程序功能是用起泡法对数组中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
使用起泡排序算法对数组中的元素进行从大到小的排序,可以遵循以下步骤:
- 遍历数组,比较相邻的两个元素。
- 如果前一个元素小于后一个元素,则交换它们的位置。
- 重复上述步骤,直到没有更多的元素需要交换为止。
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行的元素 }
第四个:
编程实现,输入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; // 计算当前列的平均值并存储
}
为啥子都能报错?我那个乖乖。
🍐🎼下面这一段也是一大堆错误;🍐🎼🍐🎼
好吧,报错才是常态 ;
sum[3]+= arr1[i][j];
这一行中的sum[3]
是不正确的,因为数组sum
的索引是从 0 到 2(共 3 个元素),所以应该使用sum[j]
来累加对应列的和。
avg[3] = sum[j] / 3;
这一行同样存在索引越界的问题,因为avg
数组(虽然没有给出其定义,但假设它存在且足够大)的索引也应该是从 0 到 2。所以应该使用avg[j]
来存储对应列的平均值。
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门课程成绩。同时,声明了三个双精度浮点数组max
、min
和sum
,用于存储每门课程的最大值、最小值和总和。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写的有点复杂
变量声明:
arr[10][10]
:一个10x10的二维整数数组,用于存储计算得到的值。m
:一个整数,用于表示用户希望生成的二维数组的大小(行数和列数)。i
和j
:用于循环的整数变量。用户输入:
- 程序首先提示用户输入一个值(
m
),这个值应该是一个整数,并且应该在2到9之间(包括2和9)。输入验证:
- 使用
if
语句检查用户输入的m
值是否在2到9的范围内。- 如果
m
的值不在这个范围内,程序将打印一条错误消息,并通过return 1;
结束程序。填充二维数组:
- 使用两个嵌套的
for
循环遍历二维数组的每一个元素。- 对于每一个元素
arr[i][j]
,将其设置为(i + 1) * (j + 1)
的值。这里,i
是行索引(从0开始),j
是列索引(从0开始),所以(i + 1)
和(j + 1)
确保了我们从1开始计算,而不是从0开始。
还有两套赶死了干了