1.6 C语言之数组概述

1.6 C语言之数组概述

  • 一、数组
  • 二、练习

一、数组

所谓数组,就是内存中一片连续的空间,可以用来存储一组同类型的数据
在这里插入图片描述
数组有下标,从0开始,可以理解为是给数组中的元素编号,便于后续寻址访问
我们来编写一个程序,统计所有输入中,0-9这几个数字出现的次数
先定义一个数组,数组总共有10个元素,用于存放0-9的出现次数,而0-9可以使用数组的下标表示

#include <stdio.h>

// 编写一个程序,统计所有输入中,0-9这几个数字出现的次数
main()
{
	int c;
	int ndigit[10]; // 声明数组
	// 初始化数组,将数组中所有元素都置为0
	for (int i = 0; i < 10;++i)
		ndigit[i] = 0; // 在每次执行的时候,可以把ndigit[i]理解成一个int变量

	while ((c = getchar()) != EOF)
	{
		if (c >= '0' && c <= '9')
			// 如果输入的是0-9的数字,则给对应下标的元素加1,比如,输入'2', 那么对应 ndigit[2-0]
			++ndigit[c - '0'];
	}
	// 打印输出数组
	printf("0-9数组元素\n");
	for (int i = 0; i < 10;++i)
		printf("数字:%d 输入的次数: %d\n", i, ndigit[i]);
}
  • int ndigit[10]; 将变量ndigit声明为由10个整型数构成的数组。在C语言中,数组下标总是从0开始,因此该数组的10个元素分别是
    ndigit[0], ndigit[1], ndigit[2], …, ndigit[9]
  • 数组下标可以是任何整型表达式,包括整型变量(i)以及整型常量,比如c - ‘0’就是一个整型表达式,如果输入的字符是’0’-‘9’,那么对应的整数值也是0-9,刚好满足数组的下标取值

二、练习

  1. 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些
    注意:长度为3的单词有3个;长度为5的单词有5个,直方图体现每个长度的数量即可
    水平方向:
#include <stdio.h>
#define OUT_WORD 1 // 不在单词中,遇到空格、换行符、制表符,state设置成 OUT_WORD
#define IN_WORD 0  // 在单词中,遇到单词的第一个字符时,state设置成 IN_WORD
#define MAX_WORD 10  /* max length of a word*/
#define MAX_HIST 15


//  编写一个程序,打印输入中单词长度的直方图。
main()
{
	int c, nc, state;
	int len;                 /* length of each bar */
	int maxValue;            /* maximum value for wl[] */
	int ovflow;              /* number of overflow words */
	int wl[MAX_WORD];        /* world length counters */
	state = OUT_WORD; // 初始值,不在单词中
	nc = 0;                  /* number of chars in a word */
	ovflow = 0;              /* number of words >= MAX_WORD */

	// 初始化数组
	for (int i = 0; i < MAX_WORD;++i)
		wl[i] = 0;
	// 输入字符,统计
	while ((c = getchar()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t') {
			state = OUT_WORD;
			if (nc > 0)
				if (nc < MAX_WORD)
					++wl[nc];  // 统计小于最大单词长度限制的单词长度
				else
					++ovflow;  // 超出最大单词长度限制的单词的数量
			nc = 0; // 单词长度置0,下一个单词重新计数
		}
		else if (state == OUT_WORD) {
			state = IN_WORD;
			nc = 1;
		}
		else
			++nc;
	}
	maxValue = 0; // 找出所有单词中最大长度
	for (int i = 0; i < MAX_WORD;++i)
	{
		if (wl[i] >= maxValue) {
			maxValue = wl[i];
		}
	}

	for (int i = 0; i < MAX_WORD;++i)
	{
		printf("%5d - %5d", i, wl[i]);
		if (wl[i] > 0) {
		    // 计算len, len对应直方图的长度,wl[i] * MAX_HIST / maxValue 
			// 这个公式可以保证单词长度数量最多的直方图最大是15,其他数量的长度则按比例取,
			// 比如数量最多的单词长度是5,总共有3个,那么len = 3 * 15/3; 而长度为1的单词有1个,则len = 1*15/3
			if ((len = wl[i] * MAX_HIST / maxValue) <= 0)
				len = 1;
		}
		else
			len = 0;

		while (len > 0) {
			putchar('*');
			--len;
		}

		putchar('\n');
	}
	if (ovflow > 0)
		printf("There are %d words >= %d\n", ovflow, MAX_WORD);
}

在这里插入图片描述

垂直方向:

#include <stdio.h>
#define OUT_WORD 1 // 不在单词中,遇到空格、换行符、制表符,state设置成 OUT_WORD
#define IN_WORD 0  // 在单词中,遇到单词的第一个字符时,state设置成 IN_WORD
#define MAX_WORD 10  /* max length of a word*/
#define MAX_HIST 15


//  编写一个程序,打印输入中单词长度的直方图。
main()
{
	int c, nc, state;
	int maxValue;            /* maximum value for wl[] */
	int ovflow;              /* number of overflow words */
	int wl[MAX_WORD];        /* world length counters */
	state = OUT_WORD; // 初始值,不在单词中
	nc = 0;                  /* number of chars in a word */
	ovflow = 0;              /* number of words >= MAX_WORD */

	// 初始化数组
	for (int i = 0; i < MAX_WORD;++i)
		wl[i] = 0;
	// 输入字符,统计
	while ((c = getchar()) != EOF)
	{
		if (c == ' ' || c == '\n' || c == '\t') {
			state = OUT_WORD;
			if (nc > 0)
				if (nc < MAX_WORD)
					++wl[nc];  // 统计小于最大单词长度限制的单词长度
				else
					++ovflow;  // 超出最大单词长度限制的单词的数量
			nc = 0; // 单词长度置0,下一个单词重新计数
		}
		else if (state == OUT_WORD) {
			state = IN_WORD;
			nc = 1;
		}
		else
			++nc;
	}
	maxValue = 0; // 找出所有单词中最大长度
	for (int i = 1; i < MAX_WORD;++i)
	{
		if (wl[i] >= maxValue) {
			maxValue = wl[i];
		}
	}

	// 从上往下一行一行打印
	for (int i = MAX_HIST; i > 0; --i) {
		// 每行,从左往右打印,如果需要打印则打印'   *', 如果不需要打印,则打印"    ";
		for (int j = 1; j < MAX_WORD;++j) {
			if (wl[j] * MAX_HIST / maxValue >= i)
				printf("   *");
			else 
				printf("    ");
		}
		putchar('\n');
	}
	for (int i = 1; i < MAX_WORD;++i)
		printf("%4d", i);
	printf("\n");
	for (int i = 1; i < MAX_WORD;++i)
		printf("%4d", wl[i]);
	printf("\n");
	if (ovflow > 0)
		printf("There are %d words >= %d\n", ovflow, MAX_WORD);
}

在这里插入图片描述

  1. 编写一个程序,打印输入中各个字符出现频度的直方图
#include <stdio.h>
#define MAX_CHAR 128  /* max number of chars*/
#define MAX_HIST 15
// 编写一个程序,打印输入中各个字符出现频度的直方图
main()
{
	int c, len, max;
	int chars[MAX_CHAR];
	for (int i = 0; i < MAX_CHAR; ++i)
		chars[i] = 0;

	while ((c = getchar()) != EOF) {
		if (c > 0 && c < MAX_CHAR) {
			++chars[c];
		}
	}
	max = 0;
	for (int i = 0; i < MAX_CHAR; i++) {
		if (chars[i] >= max)
			max = chars[i];
	}
	for (int i = 0; i < MAX_CHAR; i++) {
		printf("%d-%d", i, chars[i]);
		len = chars[i] * MAX_HIST / max;
		while (len > 0) {
			putchar('*');
			--len;
		}
		putchar('\n');
	}
}

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

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

相关文章

Linux基本指令(前篇)

目录 1.ls指令 2.pwd指令 3.cd 指令 4.touch指令 5.mkdir指令&#xff08;重要&#xff09; 6.rmdir指令 && rm 指令&#xff08;重要&#xff09; 7.man指令&#xff08;重要&#xff09; 1.ls指令 ls 选项 目录或文件 对于目录&#xff0c;该命令列出该目录下的所…

解决Linux Visual Studio Code显示字体有问题/Liunx下Visual Studio Code更换字体

01、具体问题 在Linux下VsCode控制台与代码区显示异常&#xff0c;如下图所示&#xff1a; 代码显示 终端显示 02、解决方案 下载字体 [rootlocalhost mhzzj]$ cd /usr/share/fonts # 进入目录 [rootlocalhost fonts]$ sudo yum install git # 下载字体 [rootlocalhost fo…

Linux:Ubuntu系统安装软件

本次以安装vim为例 sudo apt-get remove vim //卸载vim sudo apt-get install vim //安装vim sudo apt-cache show vim //获取vim软件信息安装时间较长。 安装完成后&#xff0c;执行下第三条指令&#xff0c;测试下是否安装成功即可。

C3 多媒体查询

文章目录 前言CSS3 多媒体查询CSS2 多媒体类型CSS3 多媒体查询浏览器支持多媒体查询语法CSS3 多媒体类型多媒体查询简单实例 媒体类型媒体功能更多实例后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;CSS &#x1f431;‍&#x1f453;博…

MFC添加窗体菜单栏和消息响应

在资源视图右键,添加资源,选择Menu,新建 添加的菜单在资源菜单的Menu目录下 双击直接编辑输入菜单 之后在要添加菜单的窗体的属性Menu里面填写菜单的ID就可以了 如何给菜单添加点击响应? OnCommand是MFC中的一个消息处理函数,用于处理在窗口或控件被激活时发出的WM_CO…

Multi-Modal Meta Continual Learning

⊙ \odot ⊙denotes the modulation operator&#xff0c;Cont. is the continuum data 辅助信息 作者未提供代码

macos安装小软件 cmake

一&#xff0c;cmake下载主页 Download CMake 二&#xff0c;下载&#xff0c;解压&#xff0c;配置&#xff0c;编译&#xff0c;安装 0. 假设macos中已经存在了 clang和make工具 1. 通过网页下载最新的稳定版 cmake***.tar.gz 源代码 2. tar zxf cmake***.tar 3. cd cmake***…

循环队列的实现(附完整代码)

题目解读 本题是要求我们设计一个循环的队列&#xff0c;循环队列要有以下功能&#xff1a; 1.获取队首元素&#xff0c;若队列为空返回-1 2.获取队尾元素&#xff0c;若队列为空&#xff0c;则返回-1 3.插入元素&#xff0c;插入成功返回真 4.删除元素&#xff0c;删除成功返回…

我的第一个Arduino点灯程序

我简直难以相信&#xff0c;什么都不用配置&#xff0c;就这么几行代码&#xff0c;就可以blink了 void setup() {// Set up the built-in LED pin as an output:pinMode(PA1, OUTPUT); }void loop() {digitalWrite(PA1,!digitalRead(PA1));// Turn the LED from off to on, o…

ASP产品通过网络安全专用产品安全认证

什么是网络安全专用产品安全检测&#xff1f; 网络安全专用产品安全检测是指对网络关键设备和网络安全专用产品进行安全性评估和检测&#xff0c;以确保其符合相关标准和法规的要求&#xff0c;能够有效地抵御网络攻击和威胁。该检测由具备资格的机构进行&#xff0c;采用认证…

Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法

一、漏洞说明 Windows server 2012R2远程桌面服务SSL加密默认是开启的,且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷,当开启远程桌面服务,使用漏洞扫描工具扫描,发现存在SSL/TSL漏洞。远程主机支持的SSL加密算法提供了中等强度的加密算法,目前,使用密钥长度大于等于5…

个体卫生室电子处方操作流程,私人诊所用什么电子处方系统软件,佳易王诊所电子处方软件配方模板如何设置

个体卫生室电子处方操作流程&#xff0c;私人诊所用什么电子处方系统软件&#xff0c;佳易王诊所电子处方软件配方模板如何设置 1、一般电子处方系统的操作流程为&#xff1a;由医师使用软件开电子处方&#xff0c;打印后核对信息医师签字&#xff0c;然后由药剂师审核单据&am…

4.25每日一题(通过被积函数和积分区域(不等式)选正确的坐标系求二重积分)

一、正确画出积分区域&#xff1b;通过积分区域和被积函数选择方法 二、如何根据被积函数和积分区域正确选择通过极坐标还是根据直角坐标方程计算&#xff1a; &#xff08;1&#xff09;适合极坐标的积分区域&#xff1a;圆或者部分圆 &#xff08;2&#xff09;适合极坐标的…

不要再往下翻了,你要的女宝穿搭我都有哦

分享女儿的睡衣穿搭 清新自然的浪漫紫 一眼就击中了我的心巴 软糯亲肤上身体验感超赞 轻松自在无束缚 防风又保暖&#xff0c;居家外出都可哦

LeetCode二叉树小题目

Q1将有序数组转换为二叉搜索树 题目大致意思就是从一个数组建立平衡的二叉搜索树。由于数组以及进行了升序处理&#xff0c;我们只要考虑好怎么做到平衡的。平衡意味着左右子树的高度差不能大于1。由此我们可以想着是否能用类似二分递归来解决。 如果left>right,直接返回nul…

数据结构与算法编程题22

交换二叉树每个结点的左孩子和右孩子 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define STR_SIZE 1024 typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }BiTN…

【设计模式-2.1】创建型——单例模式

说明&#xff1a;设计模式根据用途分为创建型、结构性和行为型。创建型模式主要用于描述如何创建对象&#xff0c;本文介绍创建型中的单例模式。 饿汉式单例 单例模式是比较常见的一种设计模式&#xff0c;旨在确保对象的唯一性&#xff0c;什么时候去使用这个对象都是同一个…

基于IDEA+SpringBoot+微服务开发的P2P平台项目

基于springboot的社区养老医疗综合服务平台 项目介绍&#x1f481;&#x1f3fb; 项目名称&#xff1a;基于P2P的金融项目 一个基于P2P&#xff08;点对点&#xff09;模式的金融服务平台&#xff0c;致力于提供透明、高效、安全的金融服务。我们的目标是连接借款人与投资者&am…

【LM、LLM】浅尝二叉树在前馈神经网络上的应用

前言 随着大模型的发展&#xff0c;模型参数量暴涨&#xff0c;以Transformer的为组成成分的隐藏神经元数量增长的越来越多。因此&#xff0c;降低前馈层的推理成本逐渐进入视野。前段时间看到本文介绍的相关工作还是MNIST数据集上的实验&#xff0c;现在这个工作推进到BERT上…