实验1:下列程序的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给了数组中数据的个数,利用指针odd返回奇数之和,利用指针even返回偶数之和。例如:数组中的值依次为:1,9,2,3,11,6;则利用指针odd返回奇数之和24;利用指针even返回偶数之和8。请在下面空白处将实现这一功能的函数完善,并且调试运行出结果。
#include <stdio.h>//fun函数用于计算数组中所有奇数之和与所有偶数之和
void fun(int* a, int n, int* odd, int* even) {//初始化奇数之和为0*odd = 0;//初始化偶数之和为0*even = 0;//遍历数组for (int i = 0; i < n; i++) {//如果当前元素是偶数if (a[i] % 2 == 0) {//增加偶数和*even += a[i];}else {//奇数*odd += a[i];}}
}int main() {int a[6] = { 1,9,2,3,11,6 };//计算数组的大小int i, n = sizeof(a) / sizeof(a[0]);int odd, even;//打印原始数据printf("原始数据是:\n");//遍历数组并打印每个元素for (i = 0; i < n; i++) {printf("%d ",a[i]);}printf("\n\n");//通过fun函数计算奇数和偶数之和,并通过指针传递给odd与even变量fun(a, n, &odd, &even);printf("奇数之和:%d\n",odd);printf("偶数之和:%d\n",even);return 0;
}
分析:
该代码首先定义了一个fun
函数,该函数通过遍历数组并检查每个元素是奇数还是偶数,来分别计算奇数之和和偶数之和。然后,在main
函数中,代码初始化了数组、计算了数组的大小,并调用了fun
函数来计算奇数和和偶数和。最后,代码打印了这两个值。思路:
该代码的思路是通过对数组中的每个元素进行分类(奇数或偶数),然后分别累加到对应的变量中,从而得到奇数之和和偶数之和。这是一种基本的数组操作方法,用于对数组中的数据进行分类并计算总和。注意事项:
- 在调用
fun
函数时,需要使用&
操作符获取odd
和even
的地址,以便将计算结果返回到这些变量中。这是因为fun
函数需要修改odd
和even
的值。- 在计算数组大小时,使用
sizeof(a) / sizeof(a[0])
是一种常见的方法。这是因为sizeof(a)
返回整个数组所占用的字节大小,而sizeof(a[0])
返回数组中一个元素的字节大小。因此,将两者相除可以得到数组中元素的个数。
实验2:假设每班人数最多不超过30人,具体人数由键盘输入,试编程打印最高分及其学号。
要求:用一维数组和指针变量作函数参数,编程打印某班一门课成绩的最高分和学号。请编写相应的程序代码,并调试运行出正确结果。
#include <stdio.h>
#define MAX_STUDENTS 30//定义一个函数,用于找到最高分数及其对应的学号
void findMaxScore(int* scores, int* studentID, int numStudents,int* maxScore, int* maxID){*maxScore = scores[0]; // 初始化最高分为第一个学生的成绩*maxID = studentID[0]; // 初始化最高分对应的学号为第一个学生的学号//遍历所有学生的分数,找到最高分数及其对应的学号for (int i = 1; i < numStudents; i++) {if (scores[i] > *maxScore) {*maxScore = scores[i]; // 更新最高分*maxID = studentID[i]; // 更新最高分对应的学号}}
}int main() {int scores[MAX_STUDENTS]; //学生成绩的数组int studentID[MAX_STUDENTS];//学生学号的数组int numStudents;//学生人数//用户输入学生的人数printf("请输入班级中的学生人数:");scanf("%d", &numStudents);//用户输入每个学生的成绩printf("请输入每个学生的成绩:\n");for (int i = 0; i < numStudents; i++) {scanf("%d", &scores[i]);}//用户输入每个学生的学号printf("请输入每个学生的学号:\n");for (int i = 0; i < numStudents; i++) {scanf("%d", &studentID[i]);}int maxScore, maxID; //最高分数和对应学号的变量//调用函数,找出最高分数及其对应的学号findMaxScore(scores, studentID, numStudents, &maxScore, &maxID);printf("最高分:%d\n", maxScore);printf("对应学号:%d\n", maxID);return 0;
}
解释思路:
- 首先,程序定义了一个
findMaxScore
函数,该函数接受学生的分数和学号数组,以及学生人数作为参数。这个函数通过遍历所有学生的分数,找出最高分数及其对应的学号。- 在
main
函数中,程序首先声明了存储学生成绩和学号的数组,以及一个变量用于存储学生人数。然后,程序询问用户输入学生人数、每个学生的成绩和学号。这些信息分别被存储在相应的数组中。- 在收集了所有必要的信息后,程序调用
findMaxScore
函数,该函数将找出最高分数及其对应的学号。这些信息被存储在maxScore
和maxID
变量中。- 最后,程序打印出找到的最高分数和对应学号。
实验3:
-
输入一个字符串,内有数字和非数字字符,例如A123X456 17960? 302tab5876 ,将其中连续的数字作为一个整数,依次存放在一个数组m中,例如,123放在m[0],456放在m[1]...,并统计共有多少个整数,输出这些数。
#include <stdio.h>
#include <string.h> //字符串处理函数
#include <ctype.h> //字符类别测试函数//定义extractIntegers函数,用于从字符串中提取整数
int extractIntegers(char* str, int* m) {int count = 0; // 统计整数的个数// 遍历字符串中的每个字符for (int i = 0; i < strlen(str); i++) {//使用isdigit函数检查当前字符是否为数字if (isdigit(str[i])) { // 如果当前字符是数字int num = 0; // 用于存储提取到的数字// 提取连续的数字 while (isdigit(str[i])) {num = num * 10 + (str[i] - '0'); // 将字符转换为数字并累加i++; // 继续下一个字符}m[count] = num; // 将提取到的数字存入数组中count++; // 整数个数加1}}return count;
}int main() {char str[100];int m[100];printf("请输入一个字符串:");gets_s(str);int count = extractIntegers(str, m);printf("共有%d个整数,它们分别是:", count);for (int i = 0; i < count; i++) {printf("%d ", m[i]);}printf("\n");return 0;
}
分析思路:
这段代码的逻辑比较清晰。首先,它定义了一个 extractIntegers
函数,该函数通过遍历输入字符串中的每个字符来提取整数。然后,在 main
函数中,程序提示用户输入一个字符串,并调用 extractIntegers
函数来提取其中的整数。最后,程序输出提取到的整数及其个数。代码使用了 isdigit
函数来判断字符是否为数字,以及 gets_s
函数来安全地读取用户输入。整体而言,代码结构清晰,逻辑严密。
isdigit
是一个 C 语言标准库函数,用于检查给定的字符是否是数字字符(0-9)。它属于 <ctype.h>
头文件。
函数的定义如下:
int isdigit(int c); |
如果 c
是一个数字字符(0-9),则 isdigit(c)
返回非零值(通常是 1
)。否则,返回 0
。
例如:
#include <stdio.h>
#include <ctype.h> int main() { char c1 = '5'; char c2 = 'a'; if (isdigit(c1)) { printf("%c is a digit\n", c1); } else { printf("%c is not a digit\n", c1); } if (isdigit(c2)) { printf("%c is a digit\n", c2); } else { printf("%c is not a digit\n", c2); } return 0;
}
输出
5 is a digit | |
a is not a digit |
实验4:矩阵转置;
要求:从主程序中输入一个3*5的整形矩阵,调用一个函数,将此矩阵转置,用指针作为函数的形参,在主程序中输出转置后的矩阵。
// 引入标准输入输出库和标准库
#include <stdio.h>
#include <stdlib.h> // 定义矩阵转置函数,输入是一个二维整数指针和行数与列数
void transposeMatrix(int** matrix, int rows, int cols) {// 动态分配一个二维指针,用于存储转置后的矩阵 int** temp = (int**)malloc(cols * sizeof(int*));// 为每一列分配内存 for (int i = 0; i < cols; i++) {temp[i] = (int*)malloc(rows * sizeof(int));}// 转置矩阵:将原矩阵的[i][j]元素复制到temp的[j][i] for (int i = 0; i < cols; i++) {for (int j = 0; j < rows; j++) {temp[i][j] = matrix[j][i];}}// 将temp中的数据复制回原矩阵,完成转置操作 for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {matrix[i][j] = temp[j][i];}}// 释放temp所占用的内存 for (int i = 0; i < cols; i++) {free(temp[i]);}free(temp);
}// 主函数
int main() {// 输入矩阵的行数和列数 int rows, cols;printf("请输入矩阵的行数和列数:\n");scanf("%d %d", &rows, &cols);// 动态分配一个二维指针,用于存储输入的矩阵 int** matrix = (int**)malloc(rows * sizeof(int*));// 为每一行分配内存 for (int i = 0; i < rows; i++) {matrix[i] = (int*)malloc(cols * sizeof(int));}// 输入一个整数矩阵 printf("请输入一个%d*%d的整数矩阵:\n", rows, cols);for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {scanf("%d", &matrix[i][j]);}}// 调用矩阵转置函数 transposeMatrix(matrix, rows, cols);// 输出转置后的矩阵 printf("转置后的矩阵为:\n");for (int i = 0; i < cols; i++) {for (int j = 0; j < rows; j++) {printf("%d ", matrix[j][i]);}printf("\n");}// 释放matrix所占用的内存 for (int i = 0; i < rows; i++) {free(matrix[i]);}free(matrix);return 0; // 主函数返回0,表示程序正常结束
}
以下是上述代码的思路分析:
- 首先,通过
malloc
动态分配内存,创建了一个二维数组temp
,它的行数等于原矩阵的列数,列数等于原矩阵的行数。- 使用两个嵌套循环,将原矩阵的数据复制到
temp
中,实现矩阵的转置。- 再次使用两个嵌套循环,将
temp
中的数据复制回原矩阵。- 最后,逐行释放
temp
中的内存,然后再释放temp
本身的内存。这个思路的核心是利用了两个二维数组,其中一个(
temp
)用于存储转置后的矩阵,另一个(原矩阵)用于存储用户输入的矩阵。通过两个嵌套循环,实现了矩阵的转置操作。