zoukankan      html  css  js  c++  java
  • 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',''};

    ** 注意

    []中的长度是可以省略不写的;
    
    采用第2种方式的时候最后一个元素必须是'',''表示字符串的结束标志;
    
    采用第2种方式的时候在数组中不能写中文。
    
    在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);
    
    strlen()获取字符串的长度,在字符串长度中是不包括‘’而且汉字和字母的长度是不一样的
    
    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]!='
    ';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] 
    
        输入换行符'
    '
    
        输入删除次数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,那么就存在语法错误。这里需要注意的是,这里指的“字符串的长度”包括最后的 ''。

    2.PTA实验作业

    2.1 将数组中的数逆序存放

    2.1.1 题目

    2。1.2 我的思路

    • 已知n<=10,则数组长度为11

    2.1.3 代码展示

    2.2 查找整数

    2.3

  • 相关阅读:
    leetCode
    Autorelease Pool
    YYKit源码阅读
    读AVFoundation官方文档记录
    leetCode
    LeetCode
    图像灰度值 灰度值与像素值的关系
    CycloneII特殊管脚的使用(转)
    MOS管正确选择的步骤
    运算放大器单电源应用中的使用齐纳二极管偏置方法
  • 原文地址:https://www.cnblogs.com/jmlzh/p/14130875.html
Copyright © 2011-2022 走看看