1.6 C语言之数组概述

1.6 C语言之数组概述

一、数组

所谓数组,就是内存中一片连续的空间,可以用来存储一组同类型的数据

数组有下标,从0开始,可以理解为是给数组中的元素编号,便于后续寻址访问

我们来编写一个程序,统计所有输入中,0-9这几个数字出现的次数

先定义一个数组,数组总共有10个元素,用于存放0-9的出现次数,而0-9可以使用数组的下标表示

c 复制代码
#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个,直方图体现每个长度的数量即可
    水平方向:
c 复制代码
#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);
}

垂直方向:

c 复制代码
#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. 编写一个程序,打印输入中各个字符出现频度的直方图
c 复制代码
#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');
	}
}
相关推荐
AI原吾4 分钟前
掌握Python-uinput:打造你的输入设备控制大师
开发语言·python·apython-uinput
机器视觉知识推荐、就业指导4 分钟前
Qt/C++事件过滤器与控件响应重写的使用、场景的不同
开发语言·数据库·c++·qt
毕设木哥6 分钟前
25届计算机专业毕设选题推荐-基于python的二手电子设备交易平台【源码+文档+讲解】
开发语言·python·计算机·django·毕业设计·课程设计·毕设
珞瑜·6 分钟前
Matlab R2024B软件安装教程
开发语言·matlab
weixin_455446177 分钟前
Python学习的主要知识框架
开发语言·python·学习
孤寂大仙v12 分钟前
【C++】STL----list常见用法
开发语言·c++·list
她似晚风般温柔7891 小时前
Uniapp + Vue3 + Vite +Uview + Pinia 分商家实现购物车功能(最新附源码保姆级)
开发语言·javascript·uni-app
咩咩大主教1 小时前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
时光飞逝的日子1 小时前
多重指针变量(n重指针变量)实例分析
c语言·指针·多重指针·双重指针·n重指针·指针变量
FuLLovers2 小时前
2024-09-13 冯诺依曼体系结构 OS管理 进程
linux·开发语言