day11 一维数组的排序及字符数组

1> 排序:一组数据,根据其关键字按照有顺序的方式进行重新排列组合的过程就叫做排序

分类:升序排序和降序排序

2> 排序种类:冒泡排序、选择排序

3> 冒泡排序:

1、原理:依次比较相邻的元素,如果前面的比后面的大(小)就进行交换

每一趟比较后,就会得到一个最大值(小),该值不进行下一轮的比较

对剩余的部分,再次进行前面的操作,直到剩余一个元素为止,排序成功

2、原理图:

3、排序要素

1、需要双重循环来解决:外层循环控制比较的趟数,每一趟会有一个元素到位,内层循环控制比较的次数,每一趟从第一个元素开始比较

2、趟数从1开始,内层循环控制元素,需要从0开始

3、每趟的比较次数 + 所在趟数 == 元素总个数

4、相邻元素进行比较后,需要进行交换,交换三部曲

4> 选择排序

1> 原理:每次都从待排序序列中,选择一个最大(小)值,放在已排序序列的最后

2> 原理图:

3> 注意事项:

1、也需要两层循环来解决,外层循环控制已排序序列,让已排序序列不断后移,内层循环控制待排序序列,不断从待排序序列中找出最大(小)值

2、外层循环控制的是已排序序列,所以从0开始,内层循环控制待排序序列,待排序序列从 下标为i处到n-1处

3、在待排序序列中找到最值后,需要跟已排序序列当前位置上的数据进行判断,如果就是第一个数据,则无需交换,如果不是,则需要进行交换。

三、字符数组

1> 在C语言中,没有字符串类型,所有有关字符串的操作,都是基于字符数组来完成的

2> 字符串:由双引号括起来的0个或多个字符就称为字符串

例如: "I love China"、"爱我中华"、'张三'、""、" "、 "A"

字符串的标识:每个字符串都会拥有一个默认的字符串结束标识 '\0'

3> 字符数组也可以像整形数组和实型数组一样,存储多个单字符

4> C语言中,使用字符数组,常用于处理字符串

2.1 字符数组的定义及初始化

1> 字符数组定义格式: char 数组名[数组长度];

2> 字符数组的初始化:

1、存储字符方式的初始化

1、全部初始化:定义数组长度为几,就初始化几个值 char arr[5] = {'a', 'b', 'c', 'd', 'e'}; //arr[0]='a' arr[1]='b' arr[2]='c' arr[3]='d' arr[4]='e'

2、部分初始化:初始化元素的个数,小于数组的长度,没有初始化的部分使用'\0'补齐 char arr[5] = {'a', 'b', 'c'}; //arr[0]='a' arr[1]='b' arr[2]='c' arr[3]='\0' arr[4]='\0'

3、特殊初始化:定义数组时,不给定数组的长度,由初始化元素的个数来确定 char arr[] = {'a', 'b', 'c', 'd', 'e'}; //arr[0]='a' arr[1]='b' arr[2]='c' arr[3]='d' arr[4]='e

2、使用字符串初始化

1、全部初始化: char arr[6] = {"hello"}; //char arr[6] = "hello"; //arr[0]='h' arr[1]='e' arr[2]='l' arr[3]='l' arr[4]='o' arr[5] = '\0' 2、部分初始化 char arr[8] = {"hello"}; //arr[0]='h' arr[1]='e' arr[2]='l' arr[3]='l' arr[4]='o' arr[5] = '\0' arr[

6] = '\0' arr[7] = '\0' 后面的两个'\0'是自动补齐的,而不是自带的

3、特殊初始化: char arr[] = {"hello"}; //char arr[] = "ab\\0cd"; 该数组实际长度:6 字符串实际长度:5

2.2 字符及字符串的输入输出函数

1> printf 和 scanf 也可以用于格式化输出字符及字符串,输入输出字符时,使用格式控制符 %c,输入输出字符串时,使用格式控制符 %s 完成

注意:scanf 输入字符串时,不能输入有空格的字符串,因为scanf遇到空格会结束一次输入。但是scanf可以连续输入多个字符串。printf 可以连续输出多个字符串,但是,这些字符串不会自动换行。

2> 字符串输入输出函数(gets puts)

#include <stdio.h>

char *gets(char s[]);

功能:从终端上获取一个字符串,放入给定的字符数组容器中

参数:字符数组名,必须是一个足够大的容器

返回值:就是输入的字符串的起始地址

注意:每个gets只能完成一个字符串的输入,如果想要输入多个字符串,需要使用多个gets完成。但是,gets可以输入带空格的字符串

int puts(const char *s);

功能:向终端输出一个字符串,并且自带换行(自动将字符串的'\0'换成'\n'输出)

参数:要输出的字符串的起始地址

返回值:成功输出的字符的个数

注意:使用puts输出字符串时,只能输出一个字符串

单字符的输入输出(getchar putchar)

int getchar(void);

功能:阻塞等待从终端上获取一个字符数据,以返回值的形式返回

参数:无

返回值:成功读取的字符值 int putchar(int c);

功能:向终端输出一个单字符

参数:要输出的字符数据

返回值:成功返回输出的字符的ascii值

2.3 字符及字符串处理函数

1> 有关字符相关的函数,被封装在 #include头文件中

2> 有关字符串的相关函数,被封装在 #include头文件中

3> 有关字符处理的相关函数

4> 有关字符串处理的相关函数

1、对字符串的操作,不能直接使用相关运算符进行操作,因为字符数组名是一个地址

2、两个字符串赋值不能使用 赋值运算符,只能使用strcpy

两个字符串比较大小,不能使用关系云素昂,只能使用strcmp

3> 相关函数

1、字符串拷贝函数:

char *stpcpy(char *restrict, const char *restrict);

功能:将一个字符串拷贝到另一个字符数组中

参数1:被重新赋值的字符数组名,要求足够大

参数2:要被赋值的字符串起始地址

返回值:成功被赋值的字符串起始地址

2、字符串连接函数:

char *strcat(char *restrict, const char *restrict);

功能:将一个字符串连接到另一个字符串后面,合成一个长的字符串放入第一个字符串容器中

参数1:第一个字符串容器起始地址

参数2:第二个字符串 返回值:合成的新的字符串的起始地址

3、字符串比较函数:

int strcmp(const char *, const char *);

功能:比较给定的两个字符串的大小

参数1:第一个字符串

参数2:第二个字符串

返回值:是一个整数 >0:表示第一个字符串大于第二个字符串 <0:表示第一个字符串小于第二个字符串 =0:表示两个字符串相等

4、字符串求长度: size_t strlen(const char *);

功能:求出给定的字符串的实际长度

参数:字符数组名,字符串的起始地址

返回值:字符串的实际长度,不包含'\0'

5、求子串函数 char *strstr(const char *, const char *);

6、设置容器内容: void *memset(void *, int, size_t);

7、内存拷贝函数 void *memcpy(void *restrict, const void *restrict, size_t);

1> 提示并输入一个字符串,统计该字符串中大写字母、小写字母、数字字符、空格字符的个数并输出

2> 提示并输入一个字符串,将该字符串中的所有字母挑选到一个新数组中,将所有的数字字符挑选到另一个新数组中。并且将数字字符对应的数组降序排序。输出两个数组的结果

3> 请用 C、JAVA、C# 任一种语言,对数组 {3, 2, 10, 1, 23, 15, 82} 进行由小到大的排序。(安在软件)

4> 输入一个字符串,将其逆序后输出?(电工时代)

5> 一个长度为10的数组中重复数据,现要求相同数据只保留一份,其他的用0来代替,被替换的数据移到数组末尾。(数组内容自定) (富士安全,云尖软件开发)

6> 输出一个 int 型数组中最小和第二小的数。(鲁科安全)

7> 将作业连接上的 第二节数组部分的题目完成:5、7、8、10、13、18、20、22、23、26、27、28、29、30

0-C基础知识 答案 · 华清远见工作空间

8> 思维导图

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值