C语言初阶之数组详细介绍

目录
  • 插入排序讲解
  • 二维数组
    • 二维数组的初始化
    • 二维数组的访问
    • n维数组
  • 字符数组
    • 字符数组和字符串
    • 字符数组的输入输出
    • 字符串函数的简单使用
    • 综合使用字符串函数
  • 总结

插入排序讲解

#include<stdio.h>
int main() {
	int arr[8] = { 1,2,3,4,6,7,10 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int n = 0;
	scanf("%d", &n);
	for (i = 0; i < sz - 1; i++)
		if (n < arr[i])       //找到插入位置
			break;
	for (int j = sz - 1; j > i; j--)
		arr[j ] = arr[j-1];   //每个位置向后移一位
	arr[i] = n;       //将n插入到数组中
	for (int j = 0; j < sz; j++)
		printf("%d ", arr[j]);  //打印结果
	return 0;
 }

上面这个程序可以实现往有序数组插入数的功能,而插入排序就相当于往有序的数组中不断的插入新的数,以上述的程序为基础,即可实现插入排序功能

#include<stdio.h>
int main() {
	int arr[8] = { 4,55,66,8,4,1,3,2};
	int i = 0;
	int j;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 1; i < sz; i++) {      //循环插入数据
			int num = arr[i];
		for (j = 0; j < i; j++)   //前i项顺序不正确道破循环
			if (arr[i]< arr[j])
				break;
		for (int x=i; x > j; x--) //全部右移
			arr[x] = arr[x- 1];
		arr[j] =num;     //插入数据
	}
	for (i = 0; i< sz; i++)
		printf("%d ", arr[i]);
	return 0;
 }

每一次循环都是一次插入,同样有这两层循环的特点。

二维数组

二维数组是一维数组的延伸和发展,二维数组是一维数组的嵌套,类似两层for循环,通俗来说二维数组就是一维数组的数组,二维数组的每个元素都是一个一维数组

int arr[5][5];
//二维数组

我们之前在九九乘法表提到的行列思想,在这里可以用上了,第一个5代表这个二维数组有五行,第二个5代表二维数组每行有五列,接下来用简单的图画来解释

 我们学习二维数组的时候,以第一种形式了解即可,但要是想深究,那么就得了解第二种形式

二维数组的初始化

在学习一维数组的时候我们可以省略数组长度,由编译器自行补充
那么二维数组可以吗?
答案是可以,二维数组的行可以省略,但是列不可以,因为个数确定,列数确定,行数也可以确定
如
int arr[][4]={1,2,3,4,5,6,7,8};
int arr[][4]={{1,2,3},{},{4,5}};
第一种方法大家应该可以理解
第二种方法就是利用了二维数组的性质,每一行都可以看成是一个一维数组
{}里的元素就是这一行的元素

二维数组的访问

二维数组和一维数组一样,数组下标都是从零开始的,下面简单的教大家打印一个二维数组

#include<stdio.h>
int main(){
int arr[4][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
	for (int i = 0; i < 4; i++) {
		int j = 0;
		for (j = 0; j < 4; j++)
			printf("%2d ", arr[i][j]);
		printf("\n");
	}
return 0;
}

是不是和打印九九乘法表的程序很类似呢,同样的,二维数组也离不开两层循环,由此可见两层循环的重要性,至于二维数组的深一层使用,等我们讲解扫雷和三子棋的时候就会有所了解

n维数组

n维数组实际上是对n-1维数组的拓展和延伸,按照研究二维数组的思维就可以一步一步的研究了

字符数组

接下来便是我们今天的主菜,字符数组

字符数组和字符串

C语言标准中并没有字符串类型,这也使得与字符串有关的操作总是需要字符串函数来进行,字符数组大多数情况下就是用来储存字符串的,但字符数组有时候并不能看做字符串。

字符串是以\0为结束标志
char a[5]={'a','b','c','d','e'};
这里的字符数组a里并没有\0,强行以字符串形式打印会出错

 当我们没有对字符数组初始化,并且以字符形式输入的时候,忽略了\0,也会出现这种状况,当然大多数情况下我们还是可以把字符数组当成字符串来用的

字符数组的输入输出

字符数组的输入方式大致分为两种字符形式输入和字符串形式输入

字符形式输入输出

//实现输入输出之前我们需要用字符数组作为容器
#include<stdio.h>
int main() {
	char arr[5] = { 0 };
	for (int i = 0; i < 5; i++)
		scanf("%c", &arr[i]);
	for (int i = 0; i < 5; i++)
		printf("%c", arr[i]);
	return 0;
}

之前提到了getchar和putchar两个库函数,接下来使用这两个专门用来字符输入输出的函数来进行

#include<stdio.h>
int main() {
	char arr[5] = { 0 };
	for (int i = 0; i < 5; i++)
		arr[i] = getchar();
	for (int i = 0; i < 5; i++)
		putchar(arr[i]);
	return 0;
}

字符串输入输出

#include<stdio.h>
int main() {
	char arr[40] = { 0 };
	scanf("%s", arr);
	printf("%s\n", arr);
	return 0;
}

接下来使用puts,gets两个库函数

#include<stdio.h>
int main() {
	char arr[40] = { 0};
	gets(arr);
	puts(arr);
	return 0;
}
//顺带一提,puts在打印完字符串之后会自动换行

字符串函数的简单使用

之前也提到了字符串的操作往往需要使用字符串函数,除了上述函数之外我们之前函数篇介绍的字符串函数我来简单教大家使用一下

#include<stdio.h>
#include<string.h>
int main() {
	char arr[10] = { 0 };
	strcpy(arr, "abc");//字符串拷贝,将abc拷贝到arr中
	strcat(arr, "def");//字符串追加,将def追加到arr的\0之后
	int len = strlen(arr);//求字符串长度,不包括\0
	int cmp = strcmp(arr, "abcdef");//字符串比较,第一个大于第二个字符串返回大于零的数,
                                    //等于返回0,小于返回小于零的数
	printf("%d %d", len, cmp);
	printf("%s\n", _strupr(arr));//将字符串全部大写
	printf("%s\n", _strlwr(arr));//将字符串全部小写
	return 0;
}

 根据注释就可以推算结果,当然我这里的打印字符串也使用了利用函数返回值的特点

综合使用字符串函数

将下来把我们的所学知识全部串起来,完成下面的字符串排序

#include<stdio.h>
include<string.h>
int main() {
char arr[5][20] = { "tiger","pander","eleplant","rabbit","lion" };//声明并初始化二维字符数
                                                                  //组arr
	int i, j,flag;                               //i,j循环变量,flag为判断二维数组是否有序
                                                 //的变量
	char t[20] = { '\0' };
	for (i = 0; i < 5; i++)                   //打印二维字符数组,以字符串形式
		puts(arr[i]);
	printf("以上为未排序的二维字符数组\n");   //   给程序打印结果进行解释
	for (i = 0; i < 4; i++) {
			flag = 1;
		for (j = 0; j < 4; j++) {
			if (strcmp(arr[j], arr[j + 1]) > 0) {            //若前一个字符串的ascll值大于
                                                       //后一个字符串,则进行字符串位置交换
 			    strcpy(t, arr[j]);
				strcpy(arr[j], arr[j+1]);
				strcpy(arr[j + 1], t);
				flag = 0;
			}
		}
		if (flag)                                        //若一轮循环下来flag仍然等于1,则
                                    //未进行位置互换,此时打破循环,减少没必要的操作
			break;
	}
	for (i = 0; i < 5; i++)                   //打印气泡法排序后的二维字符数组,以字符串形式
		puts(arr[i]);
	return 0;
}

总结

到此这篇关于C语言初阶之数组详细介绍的文章就介绍到这了,更多相关C语言数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <stdio.h> #include <string.h> //该程序的功能是 输入阿拉伯数字的月份数 输出英文月份 int main() { //一个字符串数组 它的下标代表英文月份的阿拉伯数字 char *month[] = {"January","Februa

  • C语言练习之数组中素数交换

    目录 题目要求 总结 题目要求 (1)在主函数中创建数组num,使用测试数据{108 4 19 7 23 66 49 13 33 35}对其初始化: (2)定义change函数,将num数组中的素数首尾交换,即第一个素数与最后一个素数交换,第二个素数与倒数第二个素数交换-,非素数保持位置不变: (3)定义prime函数,用于素数的判断. #include <stdio.h> #include <math.h> int prime(int num) { int i,k; if(num

  • C语言数组添加和删除元素的实现

    数组不擅长插入(添加)和删除元素.数组的优点在于它是连续的,所以查找数据速度很快.但这也是它的一个缺点.正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移:而删除一个元素时,删除点后所有的元素全部都要向前移. 插入算法 # include <stdio.h> int main(void) { int a[23] = {1, 5, 66, 8, 55, 9, 1, 32, 5, 65, 4, 8, 5, 15, 64, 156, 1564, 15, 1, 8, 9, 7,

  • C语言结构体数组的定义和使用详解

    目录 介绍 结构体数组定义时初始化 补充 介绍 一个结构体变量可以存放一个学生的一组信息,可是如果有 10 个学生呢?难道要定义 10 个结构体变量吗?难道上面的程序要复制和粘贴 10 次吗? 很明显不可能,这时就要使用数组.结构体中也有数组,称为结构体数组.它与前面讲的数值型数组几乎是一模一样的,只不过需要注意的是,结构体数组的每一个元素都是一个结构体类型的变量,都包含结构体中所有的成员项. 定义结构体数组的方法很简单,同定义结构体变量是一样的,只不过将变量改成数组.或者说同前面介绍的普通数组

  • C语言初阶之数组详细介绍

    目录 插入排序讲解 二维数组 二维数组的初始化 二维数组的访问 n维数组 字符数组 字符数组和字符串 字符数组的输入输出 字符串函数的简单使用 综合使用字符串函数 总结 插入排序讲解 #include<stdio.h> int main() { int arr[8] = { 1,2,3,4,6,7,10 }; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int n = 0; scanf("%d", &n); f

  • 详解C语言初阶之数组

    目录 1.数组 1.1数组的概念 1.2数组的定义 a:完全初始化 b:不完全初始化 c:给定元素个数 d:不给定元素个数 1.3数组的下标访问 总结 1.数组 1.1数组的概念 所谓数组(array),就是具有相同数据类型的集合,存放的数据类型即数组本身的类型. 可以发现存储的都是int型 补充 :调试小技巧 调试窗口 (按F5进行调试,打开菜单栏中的调试-窗口-监视-随便打开一个监视窗口,输入arr,将程序运行过arr的初始化即可观察到arr内部进行的初始化) 1.2数组的定义 a:完全初始

  • C语言数组详细介绍

    目录 什么是数组 一维数组 二维数组 数组越界 数组名 结尾 什么是数组 数组(Array)是一种用来存储同一种类型的集合,是一种有序的线性结构表.并且数组元素的地址是连续的. 数组最大的优点就是支持随机访问,当想访问数组的某个数时,只需要找到数组的对应下标就可以直接找到该数组对应元素.但是数组也有相应的缺点,那就是数组的元素个数和数组空间大小在创建时就已经被固定死了,如果数组的空间没有使用完也会造成空间浪费,并且因为数组的地址是连续的,这本应该是一个优点的,但是这导致数组在进行删除或增加元素时

  • C语言 strcpy和memcpy区别详细介绍

    C语言 strcpy和memcpy区别详细介绍 PS:初学算法,开始刷leetcode,Rotate array的预备知识(写的代码Time Limit Exceed难过)于是百度高效算法,本篇作为预备知识. 1.strcpy和strncpy函数 这个不陌生,大一学C语言讲过,其一般形式为strcpy(字符数组1,字符串2)作用是将字符串2复制到字符数组1中去. EX: char str1[10]='',str2[]={"China"}; strcpy(str1,str2); strn

  • Go语言中的复合类型详细介绍

    golang复合类型包括:结构体.数组.切片.Maps. 1.数组 数组 golang中的数组与C语言中的数组差异很大,倒更类似Pascal中的数组. (Slice,下个话题,有些像C语言中的数组) 复制代码 代码如下: var ar [3]int 声明ar为一个拥有三个整型数的数组,所有元素初始化为0. 大小是类型的一个组成部分. 内置的函数len可以用于获取数组大小: 复制代码 代码如下: len(ar) = 3 数组是值类型 golang中的数组是值,而非C语言中的隐式指针.你可以获得数组

  • C语言中基础小问题详细介绍

    1.printf格式输出函数 如果格式控制说明项数多于输出表列个数,则会输出错误数据:如果输出表列个数多于格式控制说明数,则多出数不被输出.%md,m指的是输出字段的宽度.如果输出字段位数小于m,则左端以空格补齐,若大于m,则按照实际位数输出.%-md,基本同上,只不过不同之处在于,空格在右端补齐printf参数可以是常量,变量或表达式,VC++ 6.0中采用从右向左顺序求值,从左向右输出如 复制代码 代码如下: int x = 5; printf("%4d%4d%4d", x, ++

  • C语言 常量,变量及数据详细介绍

    一.数据 图片文字等都是数据,在计算机中以0和1存储. (一)分类 数据分为静态数据和动态数据. ①. 静态数据:一些永久性的的数据,一般存储在硬盘中,只要硬盘没坏数据都是存在的.一般以文件的形式存储在硬盘上,电脑关机重启后依然存在. ②. 动态数据:程序运行过程中,动态产生的的临时数据,一般存储在内存中,内存的存储空间一般较小,计算机关闭后这些数据就会被清除.软件或者电脑关闭则这些临时数据会被清除. ③. 静态数据和动态数据可以转换. ④. 注意:为什么不把动态数据存放到硬盘?因为直接访问内存

  • C语言中各种操作符的详细介绍(纯干货!)

    目录 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 (类型)   强制类型转换 条件操作符 总结 算术操作符 主要是 ( +   -   *   /    %) 五种算数操作符. 1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数. 2. 对于 / 操作符如果两个操作数都为整数,执行整数除法.而只要有浮点数执行的就是浮点数除 法. 3..% 操作符的两个操作数必须为整数.返回的是整除之后的余数. 当除数为小数时,int类型只会截取整数部分. 移位操作符 << 左移操作

  • 详解C语言初阶基础

    目录 1.什么是c语言 2.初始化: 3.变量和常量 4.作用域与生命周期 简单阐述: 作用域: 生命周期(存在与消失): 作用域与生命周期的区别 作用域: 生命周期: 5.     为什么c中存在了各种数据类型: 6.常量: 7.c语言的字符串: 8.转义字符(\) 注意: 9.注释: 快捷键 总结 1.什么是c语言 c语言是一门通用计算机编程语言,是一种面向对象的编译型语言,广泛用于底层开发.其设计目的是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何环境便能运行的

  • 详解C语言初阶基础(2)

    目录 1.选择语句(if) 2.循环 while循环 for循环 do-while循环 补充 总结 1.选择语句(if) 我们先不讲switch,后面会补充.先来对简单地if进行了解. 我们已经知道,计算机的本质是为了服务于人,我们在日常生活中会遇到各种各样的选择,于情于理计算机都应该有选择语句来对应和我们的生活逻辑. 因此 if语句就是做一个选择,对计算机来说,选择只有真假之分,真就是非0(注意不是1,而是非0),假就是0. if(条件),通过对条件的判断来决定来执行哪一个分支,多分支我们可以

随机推荐