数组有关注意注意事项

一维数组

1.关于输入并打印十个同学的分数

  1. #include <stdio.h>
    int main()
    {
    	int score[10];//定义分数
    	for(int i=0;i>10;i++)
    	{
    		scanf("%d",&score[i]);
    	}
    	printf("%d",score[i]);
    	return 0;
    }
    
    

    这段代码有几个问题,导致它不能正确执行预期的功能:

  2. 循环条件错误:循环条件 for(int i=0; i>10; i++) 永远不会为真,因为 i 从 0 开始,而 0 不大于 10。所以循环体中的代码永远不会执行。正确的条件应该是 i < 10

  3. 数组越界访问:在 for 循环结束后,i 的值将是 11(因为 i 在循环中没有达到 10 所以不会停止,但循环条件错误导致循环不会执行)。然后,在 printf 语句中尝试访问 score[i],这实际上是在访问数组之外的内存位置,因为数组 score 的有效索引是 0 到 9

  4. 逻辑不完整:即使修正了循环条件,程序也只会打印最后一个输入的分数(如果输入了分数的话),这可能不是你想要的。你可能想要打印所有输入的分数

#include <stdio.h>  
  
int main()  
{  
    int score[10]; // 定义分数  
    for(int i = 0; i < 10; i++) // 修正循环条件  
    {  
        scanf("%d", &score[i]); // 输入分数  
    }  
    // 如果你想打印所有分数,可以使用另一个循环  
    for(int i = 0; i < 10; i++)  
    {  
        printf("%d ", score[i]); // 打印分数,并在每个分数后添加一个空格  
    }  //这个输出分数在循环内
    printf("\n"); // 打印换行符,使输出更整洁 注意是在循环外 ,而且有没有都可以
如果是在循环内部则会打印出一列
    return 0;  
}

2.计算高于平均数的人数

错误代码:

​
#include <stdio.h>
int main()
{
	int score[10];
	int totalScore=0;
	int average;
	for(int i=0;i<10;i++){
		scanf("%d",&score[i]);
		int totalScore += score[i];//不用加int了因为已经初始化过了,/ 去掉前面的int关键字,因为它已经是int类型的变量了  
		
	}
	average=totalScore/10;
	printf("%d",average);
	for(int i=0;i<10;i++)
	{
		if(average<score[i]);//if后面不用加; 去掉后面的分号,它会导致if语句体为空
		{	int sum += i;}}//sum 不用加int,因为是累加索引值而不是一个变量
		printf("%d",sum);
	
	return 0;
	
  }

​
  1. for循环中,您尝试累加totalScore,但是您忘记了在totalScore变量名前加上+=操作符。

  2. 在计算平均分average时,您正确地将totalScore除以了10。

  3. 在第二个for循环中,您尝试找出比平均分高的分数的数量,但是您有几个逻辑错误:

    • if语句后面的分号导致int sum += i;永远不会执行。
    • 您应该初始化sum变量。
    • 您应该在if语句中包含sum += 1;而不是sum += i;,因为您想要累加的是比平均分高的分数的数量,而不是它们的索引值。
  4. scanf函数用于从用户那里读取输入,但是您的代码没有包含提示用户输入的指令。。这句话的意思是,他要我在scanf之前加一个prinf,但是不加也可以。例子如下:

    ​
    #include <stdio.h>
    
    int main()
    {
        int num;
        printf("请输入一个整数:");//他要我加这个
        scanf("%d", &num);
        printf("您输入的整数是:%d\n", num);
    
        return 0;
    }
    
    ​

正确代码: 

#include <stdio.h>  

int main()  
{  
	int score[3];  
	int totalScore = 0;  
	int average;  
	int sum = 0;  // 声明sum变量,用于计算有多少个分数高于平均分  
	
	for(int i = 0; i < 3; i++)  
	{  
		scanf("%d", &score[i]);  
		totalScore += score[i];  // 累加输入的分数
	}  
	
	average = totalScore / 3;  // 计算平均分
	printf("Average: %d\n", average);  
	
	for(int i = 0; i < 3; i++)  
	{  
		if(average < score[i])  // 检查每个分数是否高于平均分
		{  
			sum += 1;  // 如果是,则累加计数器
		}  
	}  
	
	printf("Number of scores above average: %d\n", sum);  // 打印高于平均分的分数的数量
	
	return 0;  
}

什么是累加索引值和声明变量:

1. **声明变量**:
   声明变量是指在程序中创建一个变量,并给它分配一定的内存空间和类型。变量声明定义了变量的名称、类型以及(可选的)初始值。声明变量的一般形式是:
   ```c
   type variable_name;例如:int age=18;
   ```
   或者包括初始值:
   ```c
   type variable_name = initial_value;
   ```
   其中`type`是变量的数据类型,比如`int`、`float`、`double`等,`variable_name`是变量的名称。

2. **累加索引值**:
   累加索引值通常出现在数组处理或字符串处理中,指的是将索引值与某个数值相加。在数组中,索引值用于指定数组中元素的位置。累加索引值可能用于多种情况,例如:
   - 改变数组元素的值:`array[index] += value;` 这会将`value`加到数组索引`index`处的元素上。
   - 计算数组元素的总和:在一个循环中,可以使用累加来计算数组所有元素的总和。

在您之前的代码示例中,`int sum += i;`实际上是错误的,因为它看起来像是在声明一个变量`sum`并试图同时给它赋值,这是不被允许的。正确的累加操作应该是使用`+=`操作符来累加索引值,像这样:
```c
sum += 1; // 正确的累加操作,增加sum的值,需要之前先声明好,用的时候这样用
```
这里,`sum`是一个已经声明的变量,而`1`是被加到`sum`上的值。

总结来说,声明变量是在程序中定义一个变量并分配内存,而累加索引值是一个操作,它改变了一个已经声明的变量的值。在编写代码时,需要注意不要将这两个概念混淆。

二维数组

1对每一行元素进行操作

正确代码:

#include <stdio.h>
int main()
{
	int arr[3][4];
	int i = 0;
	for(i=0;i<3;i++){//二维数组是大循环套小循环有两个循环
	
		for(int j=0;j<4;j++){
			arr[i][j]=i;//一定要加分号,一开始忘记加了,而且一定要有这一步这一步作用是,把每一行,赋值为行数减一,
			//得出最后结果为000011112222,也就是说这个是对某一行元素进行操作
		
	printf("%d ",arr[i][j]);//这个应该包括在循环里面否则没有用会显示错误,在%d后面加了一个空格,使得打印出来的每个元素空开
		}
	printf("\n");//一定要有这个,这个是在大的循环里面,如果在小循环里面则会打印成一列,如果在循环外面则没有用,还是打印成一行;
	}
	
	return 0;
  }

结果为第一行全是0
第二行是1
第三行是2

2.每一行元素操作

错误代码如下:

#include <stdio.h>
int main()
{
	int arr[3][4];
	for(int i = 0;i<3;i++){{//这里不对
		for(int j=0;j<4;j++)
			arr[i][j]=i;
	}printf("%d",arr[i][j]);
		
	}return 0;}

 首先,你的内部 for 循环后面多了一个左大括号 {,这会导致编译错误,因为编译器会期待一个与第一个左大括号 { 对应的右大括号 }。其次,你在两个 for 循环的外面直接使用了 arr[i][j] 进行打印,但是这时候 i 和 j 已经超出了它们的循环范围,这会导致未定义的行为(通常是垃圾值)。

#include <stdio.h>  
  
int main()  
{  
    int arr[3][4];  
    for(int i = 0; i < 3; i++) {  
        for(int j = 0; j < 4; j++) {  //这里应该加括号我上面加错了
            arr[i][j] = i; // 将当前行号赋值给数组元素  
            printf("%d ", arr[i][j]); // 打印当前元素的值  
        }  
        printf("\n"); // 每行结束后打印一个换行符  
    }  
    return 0;  
}

结果如下:

0 0 0 0
1 1 1 1
2 2 2 2 

如果想把每一行元素都变为4

#include <stdio.h>  
  
int main()  
{  
    int arr[3][4];  
    for(int i = 0; i < 3; i++) {  
        for(int j = 0; j < 4; j++) {  
            arr[i][j] = 4; // 将4赋值给当前元素  
            printf("%d ", arr[i][j]); // 打印当前元素的值  
        }  
        printf("\n"); // 每行结束后打印一个换行符  
    }  
    return 0;  
}

 输出即为

4 4 4 4 
4 4 4 4 
4 4 4 4 

3.对指定某一行元素操作

错误代码:

#include<stdio.h>
int main()
{
	int arr[3][4];
	for(int i= 0;i<3;i++)
	{
		arr[0][4]=10;
		printf("%d",arr[i][4]);
		
		}
	printf("%d\n");
	}
return 0;
  }*/
  1. 数组索引越界arr[0][4]尝试访问数组第二维的第五个元素,这是越界的,因为数组arr的大小是3行4列,第二维的有效索引范围是0到3。

  2. 循环内赋值:在for循环内部,您试图将arr[0][4]设置为10,但由于索引越界,这将导致未定义行为。

  3. 循环内打印printf("%d", arr[i][4]);同样因为索引越界,将导致未定义行为。

  4. 最后的打印语句printf("%d\n");没有指定变量,这将导致编译错误。

正确代码:

#include<stdio.h>

int main()
{
	int arr[3][4]={0};//一定要初始化
	// 设置第一行第一列的元素为10
	arr[0][0] = 10;
	
	// 遍历数组并打印每个元素
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 4; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n"); // 每行结束后换行,注意在小循环外大循环内,如果在循环外则没有用
	}
	
	return 0;
}

4. 对某个元素操作

#include <stdio.h>

int main()
{
	int arr[3][4] = {0}; // 初始化所有元素为0
	arr[0][0] = 10;     // 将第一行第一列的元素设置为10
	printf("%d", arr[0][0]); // 打印第一行第一列的元素
	return 0;
  }

这样只会打印一个元素10,其他什么都没,连0 也没

这种的:

#include <stdio.h>

int main()
{
	int arr[3][4] = {0}; // 初始化所有元素为0
	arr[0][0] = 10;     // 将第一行第一列的元素设置为10
	
	// 遍历并打印数组的所有元素
	for(int i = 0; i < 3; i++) {
		for(int j = 0; j < 4; j++) {
			printf("%d ", arr[i][j]); // 打印当前元素
		}
		printf("\n"); // 每打印完一行后换行
	}
	
	return 0;
}

这样才会打印整个元素,长这样

10 0 0 0

0 0 0 0

0 0 0 0 

注意:错误代码如下

错误代码
#include <stdio.h>
int main()
{
	int arr[3][4]={0};
	arr[0][4]=10;//这里有问题!
	printf("%d",arr[0][4]);
	return 0;
}
数组的索引越界了。数组arr的索引范围应该是从arr[0][0]到arr[2][3]。尝试访问arr[0][4]会导致未定义行为,这通常是程序崩溃的原因。

此外,即使没有越界错误,printf("%d", arr[0][4]);这一行也会因为数组越界而产生未定义行为。

对第二行第二列元素进行打印 

要打印出第二行第二列的元素并将其设置为10,你需要先对数组的相应位置进行赋值,然后使用`printf`来打印它。下面是修改后的代码示例:

#include <stdio.h>

int main()
{
    int arr[3][4] = {0}; // 初始化所有元素为0
    arr[1][1] = 10;     // 将第二行第二列的元素设置为10(注意数组索引从0开始)

    // 打印第二行第二列的元素
    printf("%d\n", arr[1][1]);

    return 0;
}


 

在这段代码中,数组`arr`的第二行第二列元素(`arr[1][1]`,因为索引是从0开始的)被赋值为10。然后,程序使用`printf`函数打印出这个特定元素的值。由于只有一行`printf`,程序只会输出一个数字,即10,后面跟着换行符`\n`。

当你运行这段程序时,输出将会是:

,,,
10
,,,这个,代表没有

如果你想要打印整个数组,并且特别指出第二行第二列的元素为10,你可以使用以下代码:```c

#include <stdio.h>

int main()
{
    int arr[3][4] = {0}; // 初始化所有元素为0
    arr[1][1] = 10;    // 将第二行第二列的元素设置为10

    // 遍历并打印数组的所有元素
    for(int i = 0; i < 3; i++) {
        for(int j = 0; j < 4; j++) {
            if (i == 1 && j == 1) {
                // 特别指出第二行第二列的元素
                printf("10 ");
            } else {
                // 打印其他元素
                printf("%d ", arr[i][j]);
            }
        }
        printf("\n"); // 每打印完一行后换行
    }

    return 0;
}

这段代码会输出整个数组,并且特别指出第二行第二列的元素为10:
0 0 0 0
0 10 0 0
0 0 0 0
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值