C语言博客作业04--数组
| 这个作业属于哪个班级 | C语言--网络2011/2012 |
| ---- | ---- | ---- |
| 这个作业的地址 | C博客作业04--数组 |
| 这个作业的目标 | 学习数组相关内容
| 名字 | 黎钊涵
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
1.1.1 一维数组
-
定义
-
定义形式: 类型名 数组名 [数组长度];
-
类型名:指定数组中每个元素的类型
-
数组名:数组的名称,是一个合法的标识符
-
数组长度:一个整形常量表达式,设定数组的大小
-
例:
int a [10]; //定义一个有10个整形元素的数组a
int c [200]; //定义一个有200个字符型元素的数组c
float f [5]; //定义一个有5个单精度浮点型元素的数组f
** 数组长度是一个常量
** 数组名是一个地址常量,存放数组内存空间的首地址
-
引用
-
引用规则:只能引用单个的数组元素,而不能一次引用整个数组
-
数组元素的引用要指定下标,形式为:数组名 [下标]
其中下标可以是整型表达式
-
取值范围:[0,数组长度-1]
若前面定义的数组a有10个元素,则最后的取值为a [9],而不是a [10],这些数组元素按递增顺序排列存储
-
** 数组下标从0开始,下标不能越界
- 使用方法:与同类型的变量完全相同
例:
int k, a [10];
k = 3;
a [0] = 23;
a [k-2] = a [0] + 1;
scanf("%d", &a [9]);
** 在定义了整型变量k和整型数组a之后,可以在任何可以使用整型变量的地方使用整型数组a的元素
-
初始化
-
一般形式:类型名 数组名 [数组长度] = [初值表];
例:
-
int a [10] = [1,2,3,4,5,6,7,8,9,10]; //此时,a [0]为1,a[1]为2,...,a [9]为10
- 初始化静态数组b:
static int b [5] = [1,2,3,4,5];
若静态存储的数组没有初始化,系统会自动给所有的数组元素赋0:
static int b [5]; //即等价于:static int b [5] = [0,0,0,0,0];
- 数组的初始化也可以只针对部分元素,如:
static int b [5] = [1,2,3]; //即只对数组b的前三个元素赋初值,其余元素的初值为0
1.1.2 二维数组
- 定义
* 定义形式:类型名 数组名 [行长度] [列长度];
- 例:
int a [3] [2]; //定义一个二位数组a,3行2列,共6个元素
-
引用
- 引用规则:指定两个下标,即行下标和列下标,形式为:数组名 [行下标] [列下标]
- 取值范围:行下标的合理取值范围为[0,行长度-1],列下标的合理取值范围为[0,列长度-1],注意下标不要越界
- 引用规则:指定两个下标,即行下标和列下标,形式为:数组名 [行下标] [列下标]
-
元素存放方式
- 先行后列,即先存放第0行的元素,再存放第1行的元素,其中每一行的元素按照列的顺序存放
-
初始化
-
分行赋初值
类型名 数组名 [行长度] [列长度] = {{初值表0},……,{初值表k},……};
-
顺序赋初值
-
类型名 数组名 [行长度] [列长度] = {初值表};
-
字符串数组
- 两种表示方法:
1、char 字符串名称[长度] = "字符串值";
2、char 字符串名称[长度] = {'字符1','字符2',...'字符n','\0'};
** 注意
[]中的长度是可以省略不写的;
采用第2种方式的时候最后一个元素必须是'\0','\0'表示字符串的结束标志;
采用第2种方式的时候在数组中不能写中文。
在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);
strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的
strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小
strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝
strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串
- fgets函数
char buf[10];
fgets(buf,10,stdin);// stdin 表示标准输入流
fgets函数,读取文件当中的n-1个字符到s中,从标准输入流中读取字符串,输入的字符个数超出了字符数组的大小不会导致溢出的问题!
fgets()读取到换行符、文件尾或读完n-1个字符结束。包括换行符。
缺点:输入字符长度少于n-1,会多带一个换行符。
循环条件需要这样设置:
for(i=0;buf[i] &&buf[i]!='\n';i++)
1.1.3多维数组
-
定义形式:数据类型 数组名称 [常量表达式1] [常量表达式2]...
-
注意:
-
二维数组定义的时候,可以不指定行的数量,但是必须指定列的数量
-
多维数组的每一维下标均不能越界
-
2.数组中如何查找数据
2.1 顺序查找
按一定顺序将数组中各个数据与待查数据进行比较,看是否有与要查数据相等的数据
从数据一端开始,顺序扫描,依次将扫描到的结点关键字与给定值i相比较。
1.从表中的第一个元素开始,依次与关键字比较。
2.若某个元素匹配关键字,则查找成功。
3.若查找到最后一个元素还未匹配关键字,则 查找失败。
2.2 二分查找(折半查找)
元素必须是有序的,如果是无序的则要先进行排序操作
给定数组是有序的,给定一个key值。每次查找最中间的值,如果相等,就返回对应下标,
如果key大于最中间的值,则在数组的右半边继续查找,如果小于,则在数组左半边查找,
最终有两种结果,一种是找到并返回下标,第二种是没找到。
一个有序数组中,假设为升序排列,如果查找的数字在数组范围内,
第一个数下标设为low,最后一个数下标设为high,中间元素下标设为mid=(low+high)/2,
比较x与a[mid]的大小,若a<a[mid],则下标范围变成low~mid-1,执行high=mid-1,
如果a>a[mid],则下标范围变成mid+1~high,执行low=mid+1,重复查找,直到x==a[mid]或low>high
3.数组中如何插入数据
- 方法一:
输入一个数x,将数组中的数与x逐一比较,如果大于x,记录下数据的下标,然后此数据下标和其后的数据的下标都加一,相当于都向后挪一位,然后将x赋值给数组的那个下标
for(i=0;i<10;i++)
{
if(a[i]>x)
break;
}
for(j=9;j>=i;j--)
{
a[j+1]=a[i];
}
a[i]=x;
- 方法二:
将要插入的数放在数组最后,然后和前面的数逐一比较,如果x小于某元素a[i],则将a[i]后移一个位置,否则将x至于a[i+1]的位置
for(i=9;i>=0;i--)
{
if(a[i]>x)
a[i+1]=a[i];
else
a[i+1]=x;
break;
}
4.数组中如何删除数据
遍历数组,在找到要删除的数据后,将该数据后的每个数据向左移动一位,从而达到删除此数据的目的。
伪代码:
定义数组a[100]
定义变量k //删除的次数
定义变量n //输入的数组元素数
定义变量m//要删除的数字
定义变量flag//储存删除次数
输入n
for i=0 to i<n i自增
输入数组a[i]
输入换行符'\n'
输入删除次数k
for i = 0 to i < k i 自增
输入要删除数的位置m
for j = m - 1 to j < n j自增 //j的赋值应该为m-1,实际删除的是数组的前一个数
a[j]=a[j+1] //将后面的数往前移动
for i = 0 to i < n - k i自增
if (不是flag)
输出数组前面无空格a[i]
flag自增//记录删除次数
否则
输出前面有空格a[i]
end for
5.数组中目前学到排序方法,主要思路?
- 冒泡排序:
不断比较相邻的两个数,让较大的元素不断地往后移。经过一轮比较,就选出最大的数;经过第2轮比较,就选出次大的数,以此类推。对于具有n个元素的数组a[n],进行最多n-1轮比较
主要代码部分:
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1-i;j++)
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
- 选择排序:
选出最小的数放在第一个位置;然后,选出第二小的数放在第二个位置;以此类推,直到所有的数从小到大排序。
对大小为n的无序数组a[n]进行排序,进行n-1轮选择过程,第i轮选取第i小的数,并将其放在第i个位置上,然后将其与第i个数进行交换。
主要代码部分:
for(int i = 1;i < n;i++)
{
for(int j = 0;j < n - 1;j++)
{
if(a[j] < a[j + 1])
{
temp= a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
- 插入排序:
将无序数组分成为两个部分,排序好的子数组和待插入的元素,在一个已经有序的小序列的基础上,一次插入一个元素,直到所有元素都加入排序好数组
while (j >= 0 && a[j - 1] > x) {//一般插入排序是j>1开始,这里就插一个元素,可能插0,要从0开始
a[j] = a[j - 1];//把j-1位置的元素移到j位置
j--;
}
a[j] = x;
6.数组做枚举用法
枚举的定义枚举类型定义的一般形式为:
枚举名{ 枚举值表 };
在枚举值表中应罗列出全部可用值。这些值也称为枚举元素
7.字符数组、字符串特点及编程注意事项。
-
scanf函数无法接受无字符
-
如果字符串的长度大于 10,那么就存在语法错误。这里需要注意的是,这里指的“字符串的长度”包括最后的 '\0'。
2.PTA实验作业
2.1 将数组中的数逆序存放
2.1.1 题目
2。1.2 我的思路
- 已知n<=10,则数组长度为11