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;浅层特征提取、深层特征提取和高质量图像重建模块。 现阶段问…

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思想…

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

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

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;使卖家能…

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

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

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…

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

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

论jenkins的使用方法(初步)

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 目录 &#x1f4d1;什么是持续集成&…

1-1、Java概述

语雀原文链接 文章目录 1、Java发展2、Java体系结构3、Java特点 1、Java发展 1990年&#xff0c;Sun公司(Stanford University Network,斯坦福大学网络公司)詹姆斯高斯林推出的一门语言最开始注册的名字oak语言(橡树)&#xff0c;重名了被迫改成Java2009年Sun公司被甲骨文Ora…

logstash插件简单介绍

logstash插件 输入插件(input) Input&#xff1a;输入插件。 Input plugins | Logstash Reference [8.11] | Elastic 所有输入插件都支持的配置选项 SettingInput typeRequiredDefaultDescriptionadd_fieldhashNo{}添加一个字段到一个事件codeccodecNoplain用于输入数据的…

鼠标光标不见了怎么办?速速get这4个方法!

“非常奇怪&#xff0c;我的鼠标光标用着用着就不见了&#xff0c;这是为什么呢&#xff1f;有什么方法可以解决这个问题吗&#xff1f;” 在电脑使用过程中&#xff0c;有时候会遇到鼠标光标突然消失的情况&#xff0c;这无疑会给我们日常操作带来很大的不便。那么&#xff0c…

使用Python提取PDF文件中指定页面的内容

在日常工作和学习中&#xff0c;我们经常需要从PDF文件中提取特定页面的内容。在本篇文章中&#xff0c;我们将介绍如何使用Python编程语言和两个强大的库——pymupdf和wxPython&#xff0c;来实现这个任务。 1. 准备工作 首先&#xff0c;确保你已经安装了以下两个Python库&…

【办公软件】Outlook启动一直显示“正在启动”的解决方法

早上打开电脑Outlook2016以后&#xff0c;半个多小时了&#xff0c;一直显示这个界面&#xff1a; 解决办法 按WIN R键打开“运行”&#xff0c;输入如下命令&#xff1a; outlook.exe /safe 然后点击“确定” 这样就进入了Outlook的安全模式。 点击“文件”->“选项”-…

nbcio-vue下载安装后运行报错,diagram-js没有安装

更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 根据…

047:vue加载循环倒计时 示例

第047个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…