1.
给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。
输入格式:
输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。
输出格式:
每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。
输入样例1:
4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1
输出样例1:
9 2 3
5 3 2
5 3 4
输入样例2:
3 5
1 1 1 1 1
9 3 9 9 1
1 5 3 5 1
输出样例2:
None 3 5
(代码截图+运行结果截图):
#include <stdio.h>
int main() {
int num1, num2, i, j, k, h, arr[100][100] = { 0 },count=0,arr1[100],l,n,m;
scanf("%d %d", &num1, &num2);
for (i = 0; i < num1; i++) {
for (k = 0; k < num2; k++) {
scanf("%d", &arr[i][k]);
}
}
for (j = 1; j < num1 - 1; j++) {
for (h = 1; h < num2 - 1; h++) {
if (arr[j][h] > arr[j - 1][h] && arr[j][h] > arr[j][h- 1] && arr[j][h] > arr[j][h+1] && arr[j][h] > arr[j+1][h]) {
printf("%d %d %d\n", arr[j][h], j + 1, h + 1);
count++;
}
}
}
if (count == 0)printf("None %d %d\n", num1, num2);
}
2.
本题要求编写程序,将一个给定的 n×n 方阵转置(行列互换)后输出。
输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
输出转置后的n行n列矩阵,每个数占4位。
输入样例:
3
1 2 3
4 5 6
7 8 9
输出样例:
1 4 7
2 5 8
3 6 9
(代码截图+运行结果截图):
#include <stdio.h>
int main() {
int num, i, k, g, h, f;
int arr[10][10] = { 0 };
scanf("%d", &num);
for (i = 0; i < num; i++) {
for (k = 0; k < num; k++) {
scanf("%d", &arr[i][k]);
}
}
int arr2[10][10];
for (g = 0; g < num; g++) {
for (f = 0; f < num; f++) {
arr2[f][g] = arr[g][f];
}
}
// Print the modified array
for (k = 0; k < num; k++) {
for (f = 0; f < num; f++) {
printf("%4d ", arr2[k][f]);
}
printf("\n");
}
return 0;
}
3.
请使用指针的方法编写程序,程序的功能是从键盘输入10个数,求其最大值和最小值的差。
输入格式:
输入10个整数,每个整数之间用空格分隔。
输出格式:
同样例。
输入样例:
1 2 3 4 5 6 7 8 9 10
输出样例:
difference value = 9
(代码截图+运行结果截图):
#include <stdio.h>
int main()
{
int a[10],i,*p=a;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
int max,min;
max=min=*p;
for(i=0;i<10;i++)
{
if(*(p+i)>max)
{
max=*(p+i);
}
if(*(p+i)<min)
{
min=*(p+i);
}
}
printf("difference value = %d",max-min);
return 0;
}
4.
读入n个整数,调用max_min()函数求这n个数中的最大值和最小值。
输入格式:
输入有两行:
第一行是n值;
第二行是n个数。
输出格式:
输出最大值和最小值。
输入样例:
在这里给出一组输入。例如:
5
8 9 12 0 3
输出样例:
在这里给出相应的输出。例如:
max = 12
min = 0
(代码截图+运行结果截图):
#include <stdio.h>
#include <stdlib.h>
void max_min(int array[],int len,int *max,int *min){
*max=array[0];
*min=array[0];
int i;
for(i=1;i<len;i++){
if(array[i]>*max)*max=array[i];
if(array[i]<*min)*min=array[i];
}
}
int main(){
int num,i,arr[10];
scanf("%d",&num);
for(i=0;i<num;i++){
scanf("%d",&arr[i]);
}
int max_value;
int min_value;
max_min(arr,num,&max_value,&min_value);
printf("max=%d\n",max_value);
printf("min=%d\n",min_value);
}
5.
有一个整数数组L,有N个元素,请找出数组中和为S的两个不相等的元素,并将这两个数按从小到大顺序输出,如果有多对数字满足要求,输出第一对即可,如果不存在满足条件的数对,输出Not found。
输入格式:
输入为一组整数,第一行是整数N(0<N<=100),为数组元素的个数。
第二行是n个整数,是数组的N个元素。
第三行是S,为题目中指定的和值。
输出格式:
如果存在满足条件的数对,请输出第一对整数即可(按数组中的前后顺序输出),否则输出“Not found”。
输入样例1
5
7 5 2 10 4
9
输出样例1
2 7
输入样例2
8
2 3 5 7 10 13 20 25
43
输出样例2
Not found
输入样例3
8
12 13 15 17 10 13 10 25
20
输出样例3
Not found
(代码截图+运行结果截图):
#include <stdio.h>
int main() {
int num,num2=0,i,k,j,a,b;
int arr[10]= { 0 };
scanf("%d", &num);
for (i = 0; i < num; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &num2);
for (k = 0; k < num; k++) {
for (j = k + 1; j < num; j++) {
if (arr[k] + arr[j] == num2&&arr[k]!=arr[j]) {
a = arr[k];
b = arr[j];
if (a < b) {
printf("%d %d", a, b);
}
else {
printf("%d %d", b, a);
}
return 0;//结束主函数
}
}
}
printf("Not found");
return 0;
}
实验结果分析
第一小题 (不少于20字):
这个程序的功能是在一个二维数组中查找局部最大值。首先,程序会要求用户输入两个整数,这两个整数分别代表了二维数组的行数和列数。然后,用户需要逐行输入数组的元素值。接下来,程序会遍历数组中的每一个元素,检查它是否是局部最大值。如果某个元素大于其上、下、左、右四个相邻元素,那么它就是一个局部最大值。程序会将所有找到的局部最大值的数值以及它们在数组中的位置输出到屏幕上。
第二小题 (不少于20字):
这段代码的作用是将一个二维数组进行转置,即行变为列,列变为行。
代码中首先通过 scanf 函数读取一个整数 num,表示二维数组的大小。然后使用两个 for 循环读取二维数组的元素,并将其存储在 arr 数组中。
接着,定义一个新的二维数组 arr2,用于存储转置后的数组。使用两个 for 循环遍历 arr 数组,将其转置后存储在 arr2 数组中。
最后,使用两个 for 循环遍历 arr2 数组,将其打印出来。
第三小题 (不少于20字):
这代码的作用是从用户输入的十个整数中找到最大值和最小值,然后计算它们之间的差值并打印出来。
首先,定义了一个整型数组 a,以及一个指针变量 p,指向数组 a 的首地址。
然后,通过 for 循环,从用户输入中读取十个整数,并存储在数组 a 中。
接下来,使用两个变量 max 和 min 分别初始化为数组中的第一个元素 *p,然后通过遍历数组 a,逐个比较数组元素的值,更新 max 和 min 的值,以找到数组中的最大值和最小值。
最后,计算最大值和最小值之间的差值,并使用 printf 函数打印出来。
第四小题 (不少于20字):
主函数开始执行,首先使用 scanf 函数读取一个整数 num,表示用户输入的整数个数。
定义一个整数数组 arr,用来存储用户输入的整数。
使用 for 循环,从用户输入中读取 num 个整数,并将它们存储在数组 arr 中。
调用 max_min 函数,传入数组 arr、数组长度 num 以及两个指针变量 max_value 和 min_value。
在 max_min 函数中,首先将 max 和 min 的值初始化为数组的第一个元素,即 array[0]。
通过 for 循环遍历数组,依次比较每个元素与当前的最大值和最小值,更新 max 和 min 的值,以找到整个数组中的最大值和最小值。
max_min 函数执行完毕,将找到的最大值和最小值分别存储在 max_value 和 min_value 中。
回到主函数,使用 printf 函数打印出找到的最大值和最小值。
第五小题 (不少于20字):
主函数开始执行,首先使用 scanf 函数读取一个整数 num,表示用户输入的整数个数。
定义一个整数数组 arr,用来存储用户输入的整数。
使用 for 循环,从用户输入中读取 num 个整数,并将它们存储在数组 arr 中。
使用 scanf 函数读取一个整数 num2,表示用户输入的目标值。
进入嵌套的两层 for 循环,其中外层循环变量 k 从 0 开始逐渐增加,内层循环变量 j 从 k+1 开始逐渐增加,这样可以避免重复计算。
在内层循环中,通过判断 arr[k] + arr[j] 是否等于 num2 以及 arr[k] 是否不等于 arr[j],来确定是否找到满足条件的两个数。
如果找到满足条件的两个数,将它们分别存储在变量 a 和 b 中,并通过 printf 函数输出它们。然后通过 return 0 终止程序的执行。
如果没有找到满足条件的两个数,内层循环结束后,外层循环会继续执行,直到所有可能的组合都被尝试过。
在外层循环结束后,如果仍然没有找到满足条件的两个数,则通过 printf 函数输出"Not found"。
最后通过 return 0 终止程序的执行。
六、实验总结 (不少于50字):
没什么好说的吧,这次差不多是循环案列的升级版,学习到很多不同的案列,自已对循环的掌握又提升了,指针还不是很擅长,得去学习