插入排序讲解
#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语言数组内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!