1.选择排序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int a[5] = {0};
int i = 0;
int len = sizeof(a) / sizeof(a[0]);
int min = 0;
int temp = 0;
int j = 0;
//产生5个随机数
srand(time(NULL));
for (i = 0; i < len; i++)
{
a[i] = rand() % 100;
}
printf("排序前:");
for (i = 0; i < len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
//选择排序
for (j = 0; j < len-1; j++)
{
min = j;
for (i = j+1; i < len; i++)
{
if (a[i] < a[min])
{
min = i;
}
}
if (min != j)
{
temp = a[min];
a[min] = a[j];
a[j] = temp;
}
}
printf("排序后:");
for (i = 0; i < len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
2.二维整形数组:
1.定义:
数据类型 数组名[第一维数组的元素个数][第二维数组的元素个数];
数据类型 数组名[行数][列数];
int a[2][3];
2.数组元素的访问:
数组名[行下标][列下表];
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
3.初始化:
1.全部初始化
int a[2][3] = {1, 2, 3, 4, 5, 6};
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
2.局部初始化
int a[2][3] = {1, 2, 3, 4};
int a[2][3] = {{1, 2}, {3}};
int a[2][3] = {0};
int a[2][3] = {{0}};
3.默认初始化
行能省略,列不能省略
int a[][3] = {1, 2, 3, 4};
int a[][3] = {{1, 2}, {3}};
注意:
初始化 != 赋值
#include <stdio.h>
int main(void)
{
int a[2][3] = {{1, 2}, {3, 4}};
int i = 0;
int j = 0;
#if 0
a[0][0] = 12;
a[0][1] = 36;
a[0][2] = 73;
a[1][0] = 54;
a[1][1] = 36;
a[1][2] = 77;
#endif
printf("==================================\n");
for (j = 0; j < 2; j++)
{
for (i = 0; i < 3; i++)
{
printf("a[%d][%d] = %d ", j, i, a[j][i]);
}
printf("\n");
}
printf("==================================\n");
printf("a[0][0] = %d\n", a[0][0]);
printf("a[0][1] = %d\n", a[0][1]);
printf("a[0][2] = %d\n", a[0][2]);
printf("a[1][0] = %d\n", a[1][0]);
printf("a[1][1] = %d\n", a[1][1]);
printf("a[1][2] = %d\n", a[1][2]);
return 0;
}
4.二维数组的存储:
int a[2][3];
数组所占空间大小 = 每个元素所占字节大小 * 行数 * 列数
连续性:数组的存储空间是连续的
有序性:数组存放数据顺序有序 将二维数组逐行从左到右存储
二维数组是由一维数组构成的一维数组
N维数组:是由N-1维数组构成的一维数组
5.二维数组的输入和输出
#include <stdio.h>
int main(void)
{
int a[2][3] = {0};
int i = 0;
int j = 0;
for (j = 0; j < 2; j++)
{
for (i = 0; i < 3; i++)
{
scanf("%d", &a[j][i]);
}
}
for (j = 0; j < 2; j++)
{
for (i = 0; i < 3; i++)
{
printf("a[%d][%d] = %d\n", j, i, a[j][i]);
}
}
return 0;
}
3.字符型数组:
在C语言中没有字符串类型,只能通过字符型数组存放字符串
1.数组的定义:
数据类型 数组名[元素个数];
char str[12];
注意:
1.字符型数组存放字符串,必须能够存放下末尾的\0字符
2.元素个数必须为常量
#include <stdio.h>
int main(void)
{
// char str[6] = {"hello"};
// char str[6] = {"hel"};
char str[] = {"hel"};
int i = 0;
#if 0
str[0] = 'h';
str[1] = 'e';
str[2] = 'l';
str[3] = 'l';
str[4] = 'o';
str[5] = '\0';
#endif
for (i = 0; i < 6; i++)
{
printf("%c", str[i]);
}
printf("\n");
return 0;
}
2.数组元素的访问:
数组名[下标];
3.数组元素的初始化
1.全部初始化:
char str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char str[6] = {"hello"};
char str[6] = "hello";
2.局部初始化:
char str[6] = {'h', 'e', 'l'};
char str[6] = {"hel"};
char str[6] = "hel";
char str[6] = {0}; //对数组中所有元素清0
注意:
没有给定初值的元素被赋值为0('\0') ,不是'0'
3.默认初始化:
char str[] = {'h', 'e', 'l', 'l', 'o'};
char str[] = {"hello"};
char str[] = {"hel"}
注意:
初始化 != 赋值
char str[6] = {"hello"}; //对
char str[6];
str = "hello"; //错
str[6] = "hello"; //错
4.数组的存储:
char str[6] = {"hello"};
数组所占空间大小 = 元素个数
连续性:数组存放空间连续
有序性:按照顺序依次存放
5.字符串的输入和输出:
printf("%s\n", str);
puts(str);
按照字符串打印:从字符串开头到第一个\0中间的内容打印
scanf("%s", str);
无法接收带' '的字符串
gets(str);
可以接收带' '的字符串
#include <stdio.h>
int main(void)
{
int i = 0;
// char str[6] = {"hel\0lo"};
char str[32] = {'h', 'e', 'l', 'l', 'o', '\0'};
// scanf("%s", str);
gets(str);
printf("%s\n", str);
puts(str);
#if 0
for (i = 0; i < 6; i++)
{
printf("%c", str[i]);
}
#endif
return 0;
}
6.字符串常见操作:
1.字符串的赋值(字符串的拷贝):
strcpy
字符串拷贝函数
用法:
strcpy(str, "hello world");
strcpy(str, src);
注意事项:
目的空间必须能够存放下拷贝的字符串,否则会内存越界
char str[32] = {"hello world"};
char str[32] = {0};
str = "hello world"; //错
strcpy(str, "hello world"); //对
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[32] = {0};
char dst[32] = {0};
strcpy(str, "hello world");
printf("str = %s\n", str);
strcpy(dst, str);
printf("dst = %s\n", dst);
return 0;
}
2.字符串的拼接:
strcat
字符串拼接函数
用法:
strcat(str, "world");
strcat(str1, str2);
注意事项:
源字符串数组必须能够存放拼接后的字符串
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[32] = {0};
char str2[32] = {0};
strcpy(str1, "hello");
strcpy(str2, "world");
strcat(str1, str2);
printf("str1 = %s\n", str1);
printf("str2 = %s\n", str2);
return 0;
}
3.字符串的比较:
strcmp
字符串比较函数
用法:
strcmp(str1, str2);
结果 > 0 str1 > str2
结果 < 0 str1 < str2
结果 == 0 str1 == str2
注意事项:
1.区分大小写
2.两个字符串到右依次比较,不相同的ASCII码值谁大,字符串谁就大
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[32] = {0};
char str2[32] = {0};
int ret = 0;
gets(str1);
gets(str2);
ret = strcmp(str1, str2);
printf("ret = %d\n", ret);
if (!strcmp(str1, str2))
{
printf("字符串相同!\n");
}
return 0;
}
4.字符串的长度:
strlen
获得字符串的长度(从字符串开头到\0中间元素的个数)
用法:
int len;
len = strlen(str);
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[32] = {"hel\0world"};
int len = 0;
len = strlen(str);
printf("len = %d\n", len);
len = sizeof(str);
printf("len = %d\n", len);
return 0;
}
练习:
1.从终端获得一个字符串,
编写程序统计字符串长度(不能使用strlen)
#include <stdio.h>
int main(void)
{
char str[32] = {0};
int i = 0;
gets(str);
while (str[i] != '\0')
{
i++;
}
printf("%d\n", i);
return 0;
}
2.从终端接收一个字符串,统计该字符串中大写、小写、数字和空格的个数
"Afds 123 Agf 123"
大写:2
小写:5
数字:6
空格:3
#include <stdio.h>
int main(void)
{
char str[256] = {0};
int i = 0;
int cnt_daxie = 0;
int cnt_xiaoxie = 0;
int cnt_shuzi = 0;
int cnt_kongge = 0;
gets(str);
while (str[i] != '\0')
{
if (str[i] >= 'A' && str[i] <= 'Z')
{
cnt_daxie++;
}
else if (str[i] >= 'a' && str[i] <= 'z')
{
cnt_xiaoxie++;
}
else if (str[i] >= '0' && str[i] <= '9')
{
cnt_shuzi++;
}
else if (' ' == str[i])
{
cnt_kongge++;
}
i++;
}
printf("大写:%d\n", cnt_daxie);
printf("小写:%d\n", cnt_xiaoxie);
printf("数字:%d\n", cnt_shuzi);
printf("空格:%d\n", cnt_kongge);
return 0;
}