实验1:在主函数中输入num个字符串,写一个函数,从传入的num个字符串中找出最长的一个字符串,并通过形参指针max传回该串地址,在主函数中输出。(注意:用****作为结束输入的标志。)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 定义一个函数,该函数接受一个二维字符数组、
//一个整数(表示数组中的字符串数量)和一个指向字符的指针。
// 函数的目的是找到数组中最长的字符串,并将其地址赋值给指针。
char* fun(char(*a)[81], int num, char* max)
{
int i;
max = a[0]; // 将max初始化为数组中的第一个字符串。
for (i = 0; i < num; i++) // 遍历数组中的每一个字符串。
{
if (strlen(max) < strlen(a[i]))
// 如果当前最长的字符串长度小于当前遍历到的字符串长度,
{ // 则更新max为当前字符串。
max = a[i];
}
}
return max; // 返回最长的字符串的地址。
}
int main()
{
char ss[10][81], * ps = NULL; // 定义一个二维字符数组和一个指向字符的指针。
char s[3][81], * p = NULL; // 定义另一个二维字符数组和一个指向字符的指针。
int i = 0, n;
// 使用gets_s函数从用户那里获取字符串,直到输入"****"为止。
//gets_s是一个非标准的函数,通常不建议使用,因为它可能导致缓冲区溢出。建议使用fgets代替。
gets_s(ss[i]); // 读取第一个字符串。
while (!strcmp(ss[i], "****") == 0) // 当输入的不是"****"时,继续读取下一个字符串。
{
i++;
gets_s(ss[i]); // 读取下一个字符串。
}
n = i; // 记录已输入的字符串数量。
ps = fun(ss, n, ps); // 调用fun函数找到最长的字符串。
printf("\n最长字符串=%s\n", ps); // 打印最长的字符串。
}
- 使用
gets_s
:如注释所述,gets_s
是一个非标准的函数,并且在很多实现中都不推荐使用,因为它可能导致缓冲区溢出。建议使用fgets
代替。例如,可以用fgets(ss[i], sizeof(ss[i]), stdin)
代替gets_s(ss[i])
。- 未检查数组越界:在调用
fun
函数之前,没有检查是否有可能访问到超出数组边界的内存。虽然在这个特定的例子中可能不会出现问题,但这是一个不好的编程习惯,可能会导致未定义的行为。- 代码可读性:变量命名和注释可以更加清晰和详细,以帮助其他开发者更好地理解代码的功能和目的。
实验2:n个人围成一圈,顺序排号,从第1个人开始报数(从1到3报数),凡是报到3的人退出圈子,问最后留下的人的序号和名字。主程序中输入n和每个人的序号名字,输出最后结果。处理过程用子函数实现。
#include <stdio.h>
#include <stdlib.h>
//定义一个结构体存储人的序号和名字
typedef struct {
int number;
char name[50];
} Person;
int main() {
int n;
printf("请输入人数:");
scanf("%d", &n); //从控制台读取用户输入的人数并存储在n中
Person* people = (Person*)malloc(n * sizeof(Person)); //动态分配内存,用于存储n个Person结构体。
for (int i = 0; i < n; i++) {
printf("请输入第%d个人的序号和名字:", i + 1);
scanf("%d %s", &people[i].number, people[i].name);
}
int count = 0; //定义一个计数器变量count,初始化为0。
int index = 0; //定义一个索引变量index,初始化为0。
while (count < n -1) {
index = index % n; //通过取模运算更新index的值
count++;
}
printf("最后留下的人序号:%d\n", people[index].number);
printf("最后留下的人名字:%s\n", people[index].name);
free(people);
return 0;
}
实验3:定义一个5*5的矩阵(二维数组),赋上初值,通过调用函数实现:将数组中的最大值放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下依次从小到大存放),在主函数中输出变换后的数组。
#include <stdio.h>
// 函数声明
void findMinMax(int arr[5][5], int* min, int* max);
void swap(int* a, int* b);
int main() {
// 定义并初始化二维数组
int matrix[5][5] = { {1, 2, 3, 4, 5},
{6, 7, 8, 9, 10},
{11, 12, 13, 14, 15},
{16, 17, 18, 19, 20},
{21, 22, 23, 24, 25} };
// 调用函数找到最小值和最大值
int min, max;
findMinMax(matrix, &min, &max);
// 将最大值放在中心位置
matrix[2][2] = max;
// 将最小值放置在四个角落
matrix[0][0] = min;
matrix[0][4] = min;
matrix[4][0] = min;
matrix[4][4] = min;
// 输出变换后的数组
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
return 0;
}
// 找到二维数组中的最小值和最大值
void findMinMax(int arr[5][5], int* min, int* max) {
*min = arr[0][0];
*max = arr[0][0];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (arr[i][j] < *min) {
*min = arr[i][j];
}
if (arr[i][j] > *max) {
*max = arr[i][j];
}
}
}
}
思路解析:
- 初始化与输入:首先,我们定义并初始化了一个5x5的二维数组。然后,我们调用
findMinMax
函数来找到这个数组中的最小值和最大值。- 寻找最小值和最大值:在
findMinMax
函数中,我们使用两个指针min
和max
来分别存储找到的最小值和最大值。我们遍历整个数组,并使用条件语句来更新这两个指针的值。这样,当我们遍历完整个数组后,min
和max
就分别指向了数组中的最小值和最大值。- 放置最小值和最大值:在主函数中,我们首先将最大值放在了二维数组的中心位置。然后,我们将最小值放在了四个角落。这样做的目的是使整个二维数组在视觉上看起来更有趣和更有组织性。
- 输出:最后,我们通过双重循环遍历整个二维数组,并使用
printf
函数将每个元素打印到控制台上。这样,用户就可以看到变换后的二维数组了。