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

 更新时间:2021年12月30日 10:51:04   作者:build小春宝  
大家好,本篇文章主要讲的是C语言初阶之数组详细介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

插入排序讲解

#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语言数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c/c++那些你一定会出错的数组笔试题汇总

    c/c++那些你一定会出错的数组笔试题汇总

    这篇文章主要给大家汇总介绍了关于c/c++那些你一定会出错的数组笔试题,除了基本数据类型之外,其余的都作为类对象,包括数组,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • C语言中无符号数和有符号数之间的运算

    C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了。下面通过一个例子给大家分享C语言中无符号数和有符号数之间的运算,一起看看吧
    2017-09-09
  • C++日历拼图的解法你了解吗

    C++日历拼图的解法你了解吗

    这篇文章主要为大家详细介绍了日历拼图C++的解法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • C语言中的const如何保证变量不被修改

    C语言中的const如何保证变量不被修改

    这篇文章主要给大家介绍了关于C语言中const如何保证变量不被修改的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C++实现线程同步的四种方式总结

    C++实现线程同步的四种方式总结

    这篇文章主要为大家详细介绍了C++实现线程同步的四种方式,文中的示例代码讲解详细,对我们学习C++有一定的帮助,需要的可以参考一下
    2022-11-11
  • C++设计模式迪米特法则实例

    C++设计模式迪米特法则实例

    这篇文章主要为大家详细介绍了C++设计模式迪米特法则实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • c语言实现把文件中数据读取并存到数组中

    c语言实现把文件中数据读取并存到数组中

    下面小编就为大家带来一篇c语言实现把文件中数据读取并存到数组中。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言操作符进阶教程(表达式求值隐式类型转换方法)

    C语言操作符进阶教程(表达式求值隐式类型转换方法)

    这篇文章主要为大家介绍了C语言操作符进阶教程(表达式求值隐式类型转换方法)
    2022-02-02
  • C语言基于哈希表实现通讯录

    C语言基于哈希表实现通讯录

    这篇文章主要为大家详细介绍了C语言基于哈希表实现通讯录,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C语言深入浅出讲解顺序表的实现

    C语言深入浅出讲解顺序表的实现

    线性表是最简单的数据结构,而顺序表又是最简单的线性表,其基本思想是用一段地址连续的储存单元依次存储线性表的数据元素,比如我们常用的一维数组,下面代码实现了顺序表的定义以及基本操作
    2022-04-04

最新评论