c语言实验七

实验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函数来计算奇数和和偶数和。最后,代码打印了这两个值。

思路
该代码的思路是通过对数组中的每个元素进行分类(奇数或偶数),然后分别累加到对应的变量中,从而得到奇数之和和偶数之和。这是一种基本的数组操作方法,用于对数组中的数据进行分类并计算总和。

注意事项

  1. 在调用fun函数时,需要使用&操作符获取oddeven的地址,以便将计算结果返回到这些变量中。这是因为fun函数需要修改oddeven的值。
  2. 在计算数组大小时,使用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;
}

解释思路

  1. 首先,程序定义了一个findMaxScore函数,该函数接受学生的分数和学号数组,以及学生人数作为参数。这个函数通过遍历所有学生的分数,找出最高分数及其对应的学号。
  2. main函数中,程序首先声明了存储学生成绩和学号的数组,以及一个变量用于存储学生人数。然后,程序询问用户输入学生人数、每个学生的成绩和学号。这些信息分别被存储在相应的数组中。
  3. 在收集了所有必要的信息后,程序调用findMaxScore函数,该函数将找出最高分数及其对应的学号。这些信息被存储在maxScoremaxID变量中。
  4. 最后,程序打印出找到的最高分数和对应学号。

 实验3:

  1. 输入一个字符串,内有数字和非数字字符,例如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,表示程序正常结束  
}

 

以下是上述代码的思路分析:

  1. 首先,通过malloc动态分配内存,创建了一个二维数组temp,它的行数等于原矩阵的列数,列数等于原矩阵的行数。
  2. 使用两个嵌套循环,将原矩阵的数据复制到temp中,实现矩阵的转置。
  3. 再次使用两个嵌套循环,将temp中的数据复制回原矩阵。
  4. 最后,逐行释放temp中的内存,然后再释放temp本身的内存。

这个思路的核心是利用了两个二维数组,其中一个(temp)用于存储转置后的矩阵,另一个(原矩阵)用于存储用户输入的矩阵。通过两个嵌套循环,实现了矩阵的转置操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6学习(一):变量声明的方式对比:var,let,const

前言 在let和const出现之前,js可以使用var为变量命令,如果是函数也可以用function命名,甚至你可以直接不用任何关键字命名 var a 1function fn() { }b 2console.log(a)console.log(fn)console.log(b) 结果如下 var的特性 1.window环境下,var在最外层定义的变量会直接赋值给…

【JVM从入门到实战】(八)垃圾回收(1)

内存泄漏&#xff1a;指的是不再使用的对象在系统中未被回收&#xff0c;内存泄漏的积累可能会导致内存溢出 什么是垃圾回收 Java中为了简化对象的释放&#xff0c;引入了自动的垃圾回收&#xff08;Garbage Collection简称GC&#xff09;机制。通过垃 圾回收器来对不再使用的…

力扣刷题-二叉树-平衡二叉树

110 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 返回 true 。 给定二叉树 [1…

音画欣赏|《红尘入戏》

《红尘入戏》 46X68cm 陈可之2023年绘 《秋月》 【宋】朱熹 清溪流过碧山头&#xff0c;空水澄鲜一色秋。 隔断红尘三十里&#xff0c;白云红叶两悠悠。 《白日偶无客青山长对门》其四 【宋】韩淲 人生等戏剧&#xff0c;衮衮徒区区。 老身其回头&#xff0c;今有古非无。 -…

Kafka相关知识

一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多生产者、多订阅者&#xff0c;基于zookeeper协 调的分布式日志系统(也可以当做MQ系统)&#xff0c;常见可以用于webynginx日志、访问日志&#xff0c;消息服务等等&…

Arma3/武装突袭3东风战役最后一关游戏无法保存的解决办法

Arma3这个游戏玩进去还是非常有可玩性的&#xff0c;可是在玩过了它本体自带的东风系列战役后&#xff0c;在最精髓的最后一关——game over这个关卡&#xff0c;却有个非常头疼的问题。 逃跑其实是非常简单的&#xff0c;但是想要无伤环游全岛确十分困难&#xff0c;因为这关卡…

游戏运行中突然掉线是什么原因导致的

游戏平稳运行的原因只有一个&#xff0c;掉线的原因各有个的不同。这些不同的原因有常见&#xff0c;也有不常见的。但不管出于什么原因的掉线&#xff0c;带来的损失又是相同的。 首先最常见的原因就是攻击造成的 像CC&#xff0c;DDOS。CC会造成服务器资源的浪费&…

超详细教程:使用React实现动态轮播图

前言 轮播组件是常见的一种方式&#xff0c;用来展示图像、信息或者是广告。我们可以使用React来创建一个轮播组件&#xff0c;并且利用其中的State和effect Hook来创建一款动态的、可以自动播放的轮播组件。 效果 轮播组件会展示一个平铺的图片列表。在图片列表下方是一组小…

Missing artifact org.wltea.analyzer:ik-analyzer:jar:5.0

没有找到【org.wltea.analyzer】 找到了【org.wltea.ik-analyzer】 https://github.com/wks/ik-analyzer https://github.com/wks/ik-analyzer.git https://code.google.com/archive/p/ik-analyzer/downloads?page2 C:\Users\Administrator\Desktop\ik-analyzer-master>m…

【Hive_03】单行函数、聚合函数、窗口函数、自定义函数、炸裂函数

1、函数简介2、单行函数2.1 算术运算函数2.2 数值函数2.3 字符串函数&#xff08;1&#xff09;substring 截取字符串&#xff08;2&#xff09;replace 替换&#xff08;3&#xff09;regexp_replace 正则替换&#xff08;4&#xff09;regexp 正则匹配&#xff08;5&#xff…

机器学习---模型评估

1、混淆矩阵 对以上混淆矩阵的解释&#xff1a; P&#xff1a;样本数据中的正例数。 N&#xff1a;样本数据中的负例数。 Y&#xff1a;通过模型预测出来的正例数。 N&#xff1a;通过模型预测出来的负例数。 True Positives:真阳性&#xff0c;表示实际是正样本预测成正样…

自然语言处理阅读第二弹

HuggingFace 镜像网站模型库 NLP中的自回归模型和自编码模型 自回归&#xff1a;根据上文内容预测下一个可能的单词&#xff0c;或者根据下文预测上一个可能的单词。只能利用上文或者下文的信息&#xff0c;不能同时利用上文和下文的信息。自编码&#xff1a;对输入的句子随…

解决Qt UI界面卡顿的优化方法

以下是一些常见的Qt界面卡顿优化方法: 使用多线程:将耗时操作放在后台线程中执行,避免阻塞主线程。减少界面刷新频率:只在必要时进行界面更新,避免频繁的重绘。使用异步加载:对于大量数据的加载,可以采用异步加载的方式,逐步显示数据,减少界面卡顿感。减少布局计算量:…

7.26 SpringBoot项目实战【还书】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 本文是项目实战 业务接口 的最后一篇,上文 曾说过【还书】的 入口是【我的借阅记录】,因为【还书】是基于一次借阅记录而言,另外在4.2 数据库设计 曾分析过【还书】的业务场景,需要执行两步操作: 更新【借阅记…

后端低代码平台探索总结

业务需求快速变化的背景 我们在对业务需求进行梳理后&#xff0c;在进行程序设计时&#xff0c;对于将来可能发生变化的常量、变量、阀值、开关、条件、公式等等&#xff0c;可能会配置在环境变量或数字字典来支持可配置。但是需求变化往往会更加复杂、更加不可预测&#xff0…

鸿蒙开发之用户隐私权限申请

一、简介 鸿蒙开发过程中可用于请求的权限一共有两种&#xff1a;normal和system_basic。以下内容摘自官网&#xff1a; normal权限 normal 权限允许应用访问超出默认规则外的普通系统资源。这些系统资源的开放&#xff08;包括数据和功能&#xff09;对用户隐私以及其他应用带…

C# 命令行参数解析库示例

写在前面 在日常开发中&#xff0c;我们经常会用到命令行参数&#xff0c;比如cmd下的各种指令&#xff1b;还有C#的控制台类型的项目&#xff0c;在默认入口Main函数中&#xff0c;那个args参数&#xff0c;就是有系统传入到程序进程的命令行参数&#xff1b;在传入的参数相对…

STM32/STM8资源节约主义设计方式

STM32/STM8资源节约主义设计方式 在小资源芯片进行代码设计时&#xff0c;如STM32C0系列&#xff0c;STM8系列&#xff0c;因为官方库本身要包含各种场景应用特征的支持&#xff0c;所以会有一些冗余的代码占用更多FLASH空间。当需要实现资源占用最简化设计方式时&#xff0c;…

剑指offer A + B

剑指offer A B 题目 输入两个整数&#xff0c;求这两个整数的和是多少。 输入格式 输入两个整数A,B&#xff0c;用空格隔开&#xff0c;0≤A,B≤10的8次幂 输出格式 输出一个整数&#xff0c;表示这两个数的和 样例输入&#xff1a; 3 4样例输出&#xff1a; 7参考答…

SQL基础:表的基本操作

上一节中&#xff0c;我们进行了学习环境的搭建。这一节我们来学习一下表的基本操作。 表是关系型数据库的基本组成部分&#xff0c;所有的数据都以表的形式进行组织。而表又由列构成&#xff0c;所以我们要先说明一下列。 列 列列名列的数据类型。列名一般用于描述所存储的…