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循环对数组进行挨个赋值,再进行数组的遍历就可以使用了。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用23种设计模式打造一个cocos creator的游戏框架----(三)外观模式模式

1、模式标准 模式名称&#xff1a;外观模式 模式分类&#xff1a;结构型 模式意图&#xff1a;为一组复杂的子系统提供了一个统一的简单接口。这个统一接口位于所有子系统之上&#xff0c;使用户可以更方便地使用整个系统。 结构图&#xff1a; 适用于&#xff1a; 当你想为…

基于Java SSM框架实现毕业生就业信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现毕业生就业信息管理系统演示 摘要 目前高校毕&#xff0c;毕业生就业工作意义尤为重大但形势又特别严峻。党中央和国务院高度重视高校毕业生就业工作&#xff0c;及时作出了一系列决策部署&#xff0c;多措并举拓展就业渠道&#xff0c;千方百计帮助高校…

iOS(swiftui)——系统悬浮窗( 可在其他应用上显示,可实时更新内容)

因为ios系统对权限的限制是比较严格的,ios系统本身是不支持全局悬浮窗(可在其他app上显示)。在iphone14及之后的iPhone机型中提供了一个叫 灵动岛的功能,可以在手机上方可以添加一个悬浮窗显示内容并实时更新,但这个功能有很多局限性 如:需要iPhone14及之后的机型且系统…

CTF 7

信息收集 存活主机探测 arp-scan -l 端口探测 nmap -sT --min-rate 10000 -p- 192.168.0.5 服务版本等信息 nmap -sT -sV -sC -O -p22,80,137,138,139,901,5900,8080,10000 192.168.0.5Starting Nmap 7.94 ( https://nmap.org ) at 2023-11-02 21:23 CST Stats: 0:01:30 elaps…

基于vue开发-创建登录页

我们使用vue创建完成项目后就开始我们的项目页面开发&#xff0c;如有不清楚怎么操作的可以看博主的前一篇文档 使用vue UI安装路由插件-CSDN博客 在src/views文件夹中创建一个登录页面 在此之前&#xff0c;我们可以先安装一个插件、element、vant、iview等等&#xff0c;可…

vue中shift+alt+f格式化防止格式掉其它内容

好处就是使得提交记录干净&#xff0c;否则修改一两行代码&#xff0c;习惯性按了一下格式化快捷键&#xff0c;遍地飘红&#xff0c;下次找修改就费时间 1.点击设置图标-设置 2.点击这个转成配置文件 {"extensions.ignoreRecommendations": true,"[vue]":…

Stable Diffusion AI绘画系列【17】:绘本童话风格场景

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

使用 Kubernetes Agent Server 实现 GitOps

目录 温习 GitOps 极狐GitLab Kubernetes Agent 极狐GitLab GitOps workflow 极狐GitLab KAS 的配置 创建极狐GitLab agent 创建 agent token Kubernetes 上安装 agent&#xff08;agentk&#xff09; 极狐GitLab GitOps workflow 实践 写在最后 温习 GitOps GitOps …

课题学习(十五)----阅读《测斜仪旋转姿态测量信号处理方法》论文

一、 论文内容 1.1 摘要 为准确测量旋转钻井时的钻具姿态&#xff0c;提出了一种新的信号处理方法。测斜仪旋转时&#xff0c;垂直于其旋转轴方向加速度计的输出信号中重力加速度信号分量具有周期性特征&#xff0c;以及非周期性离心加速度分量频率低于重力加速度信号分量频率…

渲染(iOS渲染过程解析)

渲染 渲染原理 一个硬核硬件科普视频 CPU和GPU CPU&#xff08;Central Processing Unit&#xff09;&#xff1a;现代计算机整个系统的运算核心、控制核心&#xff0c;适合串行计算。GPU&#xff08;Graphics Processing Unit&#xff09;&#xff1a;可进行绘图运算工作的…

系列四、过滤器简介

一、简介 1.1、概述 过滤器作为JavaWEB的三大组件&#xff08;Servlet程序、Filter过滤器、Listener监听器&#xff09;&#xff0c;它的主要功能是用来拦截请求的&#xff0c;当客户端要访问某个资源时&#xff0c;先来到配置好的过滤器&#xff0c;过滤器可以在用户访问某个…

Docker架构、镜像操作和容器操作

一、docker基本管理和概念 1、概念 docker&#xff1a;开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机” docker的容器技术可用在一台主机上轻松到达为任何应用创建一个轻量级到的&#xff0c;可移植的&#xff0c;自给自足的容器 dock…

基于remix+metamask+ganache的智能合约部署调用

在我们部署合约时为了让它更接近真实区块链去中心化体验&#xff0c;我们需要调用小狐狸&#xff08;Metamask&#xff09;来进行真实交易&#xff0c;而metamask里没有内置虚拟测试币&#xff0c;我们需要进行调用Ganache来添加带有虚拟测试币的账号。以上就是三者的关系&…

编程实战:类C语法的编译型脚本解释器(十)编译表达式

系列入口&#xff1a;编程实战&#xff1a;类C语法的编译型脚本解释器&#xff08;九&#xff09;编译语句 本文介绍表达式的编译。 一、代码概览 表达式的编译就是不断获取下一个标识符&#xff0c;直到遇到不属于表达式的东西。 完整代码如下&#xff1a; Expression* GetExp…

Java+Swing: (jframe自定义图标和居中显示) 整理1

package com.test;import javax.swing.*; import java.awt.*; import java.net.URL;/*** Author&#xff1a;xiexu* Date&#xff1a;2023/12/3 19:13*/ public class JframeTest {JFrame jFrame;JButton jButton;public JframeTest() {// 容器组件&#xff08;jframe, jpanel,…

深圳冬季穿搭造型

深圳冬季穿搭造型 今天是2023年11月17日&#xff0c;北方在11月初就降下了大雪&#xff0c;那是我的老家&#xff0c;无比怀念。 而在深圳&#xff0c;冬天是体会不到那份冷冽的寒冷的&#xff0c;所以在深圳&#xff0c;每天的晚上&#xff0c;我都会出去散步&#xff0c;昨…

Kubernetes Service控制器详解以及切换为ipvs代理模式

文章目录 一、Service 存在的意义二、Pod与Service的关系三、Service定义与创建四、Service三种常用类型五、Service代理模式六、切换Service代理模式七、service总体工作流程八、kube-proxy ipvs和iptables的异同九、Service DNS名称 一、Service 存在的意义 service的引入主…

推荐10款App安全测试工具

移动互联网时代&#xff0c;我们的生活和工作深受 App 影响。伴随移动 App 的广泛应用&#xff0c;App 安全日益重要。本文介绍了 App 开发可能用到的安全测试工具。 当今&#xff0c; 全球移动用户大约超过37亿。 Google Play 上大约有 220 万个 App&#xff0c; 苹果App Sto…

二极管是什么

二极管 电子元器件百科 文章目录 二极管前言一、二极管是什么二、二极管的类别三、二极管的应用实例四、二极管的作用原理总结前言 二极管是一种重要的电子器件,通过其整流行为和管理方向的特性,可以在电路中实现电流控制和电压整流等功能。 一、二极管是什么 二极管是一种…

idea__SpringBoot微服务03——yaml(新注解)(新的依赖)

yaml 一、数据格式二、注入配置文件&#xff08;yaml注入&#xff09;&#xff08;新注解ConfigurationProperties&#xff09;三、注入配置文件&#xff08;properties注入&#xff09;&#xff08;新注解PropertySource&#xff09;四、yaml配置文件占位符${}五 、yaml跟prop…