C语言之数组精讲(2)

目录

 数组的复制

输入数组元素的值

对数组的元素进行倒序排列

 使用数组进行成绩处理

对象式宏

数组元素的最大值和最小值

赋值表达式的判断

数组的元素个数

 结语


 数组的复制

我们把数组中的元素全部复制到另一个数组中。

#include<stdio.h>int main()
{int i;int a[5] = {1, 2, 3};int b[5];for(i = 0; i < 5; i++){b[i] = a[i] ;}puts("   a b");puts("   -------");for(i = 0; i < 5; i++){printf("%4d%4d\n", a[i], b[i]);}return 0;
}

程序中的第一个for语句,作用是把a中的全部元素一次赋值给b中的元素

同时遍历两个数组,从b[0] = a[0]到b[4] = a[4]

C语言不支持基本赋值运算符,下面语句是错误的 

b = a;//不能为数组赋值

 注意

不能使用基本赋值运算符对数组进行赋值。数组的赋值必须通过使用循环语句对所有元素进行一一赋值。

第二个for语句时同时遍历两个数组,并且显示它们的值。


输入数组元素的值

从键盘中输入数组元素的值,并且一一显示它们。

#include<stdio.h>int main()
{int i;int x[5];for(i = 0; i < 5; i++){printf("x[%d]:", i);//输入元素的值scanf("%d", &x[i]);}puts("……………………");for(i = 0; i < 5; i++){printf("x[%d]=%d \n", i, x[i]);//显示元素的值}return 0;
}

对数组的元素进行倒序排列

如果仅仅是按照顺序对数组内的元素赋值没有什么难度,接下来我们对数组的元素进行倒序排列。

我们创建5个元素的int类型的数组进行下列倒序排列

a[0]和a[4]交换;a[1]和a[3]交换;a[3]处在中间位置,顺序不发生改变

#include<stdio.h>int main()
{int i;int a[5];for(i = 0; i < 5; i++)//为数组元素赋值{printf("a[%d]:", i);scanf("%d", &a[i]);}for(i = 0; i < 2; i++)//进行倒序排列{int temp = a[i];a[i] = a[4 - i];//交换a[i] 和a[4 - i]的数值a[4 - i] = temp;}puts("进行倒序排列");for(i = 0; i < 5; i++){printf("[%d]=%d\n", i, a[i]);}return 0;
}

想要交换两个变量的值就必须引入一个中间变量来进行交换。

1.把a的值保存在temp中。

2.把b的值赋值给a。

3.把temp保存的值赋值给b。

不可以像下面一样进行赋值:

 a = b; b = a;这样a和b的值都会变为b的初始值。


 使用数组进行成绩处理

#include<stdio.h>int main()
{int i;int sum;//5名学生分数的总和int tensu[5];//5名学生的分数for(i = 0; i < 5; i++){printf("%2d号:", i + 1);scanf("%d", &tensu[i]);sum += tensu[i];}printf("总分:%5d\n", sum);printf("平均分:%5.1f\n", double(sum) / 5);return 0;
}

在这里我们仅仅是对5人的成绩进行运算,但是编写完程序后人数增加到8人呢?80人呢?800人呢?

在这里我们需要进行选择性替换(只替换需要替换的部分)


对象式宏

我们可以用对象式宏来解决上述问题

#include<stdio.h>#define NUMBER 10//学生人数int main()
{int i;int sum;//10名学生分数的总和int tensu[NUMBER];//10名学生的分数printf("请输入%d个学生的分数\n", NUMBER);for(i = 0; i < NUMBER; i++){printf("%2d号:", i + 1);scanf("%d", &tensu[i]);sum += tensu[i];}printf("总分:%5d\n", sum);printf("平均分:%5.1f\n", double(sum) / NUMBER);return 0;
}

该程序的关键部分是#define指令

#define a b   将该指令的a替换为b

在这里,a称为宏名。为了易于与变量名区分我们通常用大写字母来表示。

在本程序中,宏名为NUMBER,被替换为10. 

在程序中使用宏,不仅能在一个地方进行统一管理,而且通过为常量定义名称还可以使程序更加易读,如果再加上注释,效果更明显。

程序中的10等常量被称为幻数(不清楚具体表示什么值),引入对象式宏后就可以消除程序中的幻数了。另外使用宏可以提高程序的质量。

 注意

不要在程序中直接使用数值,最好通过宏的形式定义出它们的名称。定义宏的时候不要忘记加上注释!


数组元素的最大值和最小值

我们来求出分数大最大值和最小值,即数组元素的最大和最小值

#include<stdio.h>#define NUMBER 10//学生人数int main()
{int i;int tensu[NUMBER];//5名学生的分数int max, min;printf("请输入%d个学生的分数\n", NUMBER);for(i = 0; i < NUMBER; i++){printf("%2d号:", i + 1);scanf("%d", &tensu[i]);}min = max = tensu[0];for(i = 0; i < NUMBER; i++){if(tensu[i] > max)  max = tensu[i];if(tensu[i] < min)  min = tensu[i];}printf("最高分:%d", max);printf("最低分:%d", min);return 0;
}

赋值表达式的判断

对于数值类型的判断我们在前面的数据类型讲到过,现在我们来看看什么是赋值表达式的判断?

在赋值时的判断结果中,与赋值后做操作数的类型和值相同,例如int n=2.22判断结果为n=2.

对于上面求最大值、最小值中由于赋值运算符=,具有结合性,所以可以看为

min = (max = tensu[0])

例如tensu[0]=20,那么min和max和值都为20.

C语言经常使用这样的赋值方法,如a = b =0就可以把0同时赋值给a和b,但是对于初始值的声明并不适用。

比如,int a = b = 0;不可这样进行初始化

应该这样,int a = 0, b = 0;当然也可以分开声明。

 我们把上面求求最大值的流程来写出来:

求tensu[0]—tensu[4]的最大值:

max = tensu[0];

if(tensu[1] > max) max = tensu[1];

if(tensu[2] > max) max = tensu[2];

if(tensu[3] > max) max = tensu[3];

if(tensu[4] > max) max = tensu[4];

 对与求最小值的流程也是一样这里我们便不再赘述了。


数组的元素个数

虽然通过定义宏来变更数组元素个数十分简单,但是每次都需要进行更改重新编译后执行,因此我们可以定义出一个较大的数组,从开头取出我们需要的部分。我们来对求学生分数进行下更改

#include<stdio.h>#define NUMBER 80//人数上限int mian()
{int i, j;int sum;//学生人数int tensu[NUMBER];//学生分数int bunpu[11] = {0};printf("请输入学生人数");do{scanf("%d", &sum);       //选择学生的人数在复合的规定内if(sum < 1 || sum > NUMBER){printf("请输入1—%d的数", NUMBER);}}while(sum < 1 || sum > NUMBER);printf("请输入学生的人数:%d\n", sum);for(i = 0; i < sum; i++){printf("%2d号:", i + 1);do{scanf("%d", &tensu[sum]);     //输入学生成绩在1—100内if(tensu[sum] < 0 || tensu[sum] > 100){printf("\a请输入1—100内的数值:\n");}}while(tensu[sum] < 0 || tensu[sum] > 100);bunpu[tensu[i] / 10]++;}puts("-----分布图-----");printf("		100:");for(j = 0; j < bunpu[10]; j++)//100分的分布图{putchar('*');putchar('\n');}for(i = 9; i >= 0; i--){printf("%3d - %3d:", i * 10, i * 10 + 9);for(j = 0; j < bunpu[i]; j++)//不到100分的分布图{putchar('*');putchar('\n');}}return 0;
}

在本程序中,我们使用了int[11]数组bunpu来存放分数的分布。

求分布的表达式较为复杂,利用整数/整数舍去小数部分来进行递增的,如下

tensu[i] 为0—9时,bunpu[0]递增

tensu[i] 为10—19时,bunpu[1]递增

……………………………………

tensu[i] 为80—89时,bunpu[8]递增

tensu[i] 为90—99时,bunpu[9]递增

tensu[i] 为100时,bunpu[10]递增

通过上述循环,tensu[i]的分数就保存在数组bunpu中了。


 结语

数组就是我们向内存访问请求存放数据内存的地方,然后我们通过数组的声明为其确定类型、名称,再通过初始化后,通过进行下表运算符就可以对数组进行访问使用了,当然我们还可以不进行初始化,通过使用for循环对数组进行挨个赋值,再进行数组的遍历就可以使用了。

创建好数组后一般不能更改数组元素的个数,但是我们可以通过对象式宏来进行任意的对数组元素进行更改。

最后,天气渐冷,大家一定要做好保暖措施,锻炼身体,预防流感!

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

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

相关文章

SwinIR: Image Restoration Using Swin Transformer

SwinIR 简介 论文地址&#xff1a;SwinIR: Image Restoration Using Swin Transformer 代码&#xff1a;SwinIR ​ 本文提出了一个基于swin transformer的图像超分模型swinIR。其中SwinIR分为三部分&#xff1a;浅层特征提取、深层特征提取和高质量图像重建模块。 现阶段问…

WordPress如何通过header给页面发送原生HTTP头

在WordPress中&#xff0c;你可以使用header() 函数来发送原生HTTP头。这个函数通常在主题文件&#xff08;例如header.php&#xff09;或者插件中使用。以下是一个简单的例子&#xff0c;演示如何在WordPress中使用header() 函数发送原生HTTP头&#xff1a; <?php // 在主…

19.java程序设计-基于SpringBoot的博客管理系统的设计与实现

摘要 随着信息技术的迅速发展&#xff0c;博客作为一种重要的信息传播和交流工具&#xff0c;逐渐在互联网上占据重要地位。为了满足用户对个性化博客管理的需求&#xff0c;本研究设计并实现了一种基于Spring Boot框架的博客管理系统。 本系统通过采用前后端分离的架构&…

【算法题】密钥格式化 (js)

!](https://img-blog.csdnimg.cn/direct/bf9a3d781a8043c997593260c0a8306f.png) 第一部分的字符可以少于… const str "5F3Z-2e-9w"; const str1 "2-5g-3-J"; function solution(num, str) {const arr str.split("-");const head arr[0];…

【C++11(三)】智能指针详解--RAII思想循环引用问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. 为什么要有智能指针?3. RAII思想…

30.如何在Spring所有Bean创建完后做扩展?

如何在Spring所有Bean创建完后做扩展? 哪里才算所有的bean创建完了。 首先是所有的配置bean会注册成BeanDefinition 然后根据BeanDefinition进行循环调用一个一个的getBean进行生产。 循环完所有的BeanDefiniton,通过BeanFactory的getBean方法生成所有的Bean 这个循环结…

LightDB - 支持substring_index 函数[mysql兼容]

从 23.4 版本开始&#xff0c; LightDB 支持 mysql 的substring_index 函数。下面对这个函数进行介绍 substring_index(str, delim, count ) 这个函数用于从指定字符串str中返回到达分隔符delim出现次数(count)之前的子字符串。。具体见之后用例&#xff1a; mysql 中介绍&a…

【BUG】微信小程序image不会随着url动态变化

问题描述&#xff1a; 第一次打开界面&#xff0c;显示的是默认头像而不是用户头像&#xff0c;似乎image里面的src只要第一次有值就不会再更新了 解决 不要给src里面的变量设置初始值&#xff0c;而是直接赋空值

信息安全、网络安全和数据安全的相互关系

最近正在开展安全方面的相关工作&#xff0c;因此就对这些概念做了一些分析&#xff0c;参考各种介绍和书籍&#xff0c;结合自身的认识&#xff0c;总结起来如下&#xff0c;信息安全、网络安全、数据安全和基础设施安全的关系究竟是什么&#xff0c;信息安全概念最大&#xf…

DevOps搭建(七)-安装Jenkins详细步骤

这里我们用Docker进行安装 1、拉取Jenkins镜像 Jenkins download and deployment 选择LTS长期支持的版本,接着点击Docker链接进入 找到上面的版本,并copy拉取镜像的命令 docker pull jenkins/jenkins:2.426.1-lts 2、docker-compose安装Jenkins 首先创建安装目录/home/f…

STM32 cubeMX 呼吸灯实验

文章代码使用 HAL 库。 文章目录 一、1.PWM原理二、LED 原理图三、使用cubemx 配置 led四、PWM 相关函数五、PWM占空比占空比计算六、PWM 呼吸灯重要代码总结 呼吸灯 一、1.PWM原理 PWM全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种常…

拥有大量虾皮买家号有哪些好处

拥有众多Shopee买家账号&#xff0c;无疑是卖家们获取极大优势的一项策略。多账号的运用不仅有助于卖家在Shopee平台上获得更为丰富的流量&#xff0c;更能够在关键词排名和销售表现等方面为其带来显著提升。 首先&#xff0c;多个Shopee买家账号的灵活运用&#xff0c;使卖家能…

前后端(JAVA)实现AES对称加解密方式

文章目录 前后端&#xff08;JAVA&#xff09;实现AES对称加解密方式1 对称加密分类以及概括1.1 加密安全等级 DES < 3DES < AES < RC1.2 DES1.3 3DES1.4 AES1.5 RC 2 前后端实现AES对称加解密方式3 后端AES对称加解密&#xff08;ECB和CBC模式&#xff09;工具类4 前…

【Python百宝箱】从传感器到云端:深度解析Python在物联网中的多面应用

迈向智能未来&#xff1a;Python与物联网生态系统的完美融合 前言 随着物联网技术的不断发展&#xff0c;Python作为一种灵活且强大的编程语言&#xff0c;逐渐成为物联网开发的重要工具之一。本文将深入探讨物联网领域中常用的Python库和框架&#xff0c;涵盖了从轻量级通信…

JavaScript <有道翻译之数据解密‘23年12月06日版‘>--案例(三)

前言: 记得上半年还是去年,有道翻译还是直接返回明文数据;现在也跟着,用接口返回加密数据了; 娱乐一下,破他的密文数据... 成品效果图: js部分: 对于找他的密文数据有点费时,针对密文--->搜他地址和启动器不是特别容易,辗转多时(搜:descrypt/json.parse 结合使用更快),有图…

通讯录实现

下方是头文件的代码 #define _CRT_SECURE_NO_WARNINGS #include <assert.h> #include<stdio.h> #include<string.h> #include<stdlib.h>#define NAME_MAX 20 #define SEX_MAX 6 #define TELE_MAX 12 #define ADDR_MAX 30 #define MAX 100 #define D…

swing快速入门(四)

注释很详细&#xff0c;直接上代码 上一篇 增加内容 流式布局范例 import java.awt.*;public class swing_test_2{public static void main(String[] args){//创建一个窗口对象Frame framenew Frame("test");//设置窗口大小frame.setSize(800,800);//这里演示的是…

Gateway全局异常处理及请求响应监控

前言 我们在上一篇文章基于压测进行Feign调优完成的服务间调用的性能调优&#xff0c;此时我们也关注到一个问题&#xff0c;如果我们统一从网关调用服务&#xff0c;但是网关因为某些原因报错或者没有找到服务怎么办呢&#xff1f; 如下所示&#xff0c;笔者通过网关调用acc…

中小企业管理者如何培育团队精神?

某石油工程有限公司总经理曾提问&#xff1a;“作为中小企业的管理者如何才能更好的激发团队精神呢&#xff1f;” 每个企业都向往和号召团队精神&#xff0c;但是往往事与愿违。在各种羡慕嫉妒恨的情绪影响下&#xff0c;难免会产生一些落差&#xff0c;影响到团队精神。 所…

超声波清洗机会损伤物品吗?一文明白超声波清洗机有哪些优点

正确使用超声波清洗机且买对超声波清洗机是不会对清洗物品造成伤害的&#xff01; 一、超声波清洗机工作原理是如何的&#xff1f; 超声波清洗机的工作原理是利用超声波产生的空化振动来清洁物体。当超声波在清洗液中传播时&#xff0c;它会产生微小的气泡和振动&#xff0c;这…