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

2.1.3 代码展示

2.2 查找整数

2.3

posted @ 2020-12-13 22:46  走去干饭  阅读(357)  评论(0编辑  收藏  举报