c语言实验七
2023-12-18 05:54:59
实验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
)用于存储转置后的矩阵,另一个(原矩阵)用于存储用户输入的矩阵。通过两个嵌套循环,实现了矩阵的转置操作。
文章来源:https://blog.csdn.net/nanshenchao/article/details/135047352
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!