zoukankan      html  css  js  c++  java
  • C语言博客作业04--数组

    这个作业属于哪个班级 C语言--网络2011/2012
    这个作业的地址 C语言博客作业04--数组
    这个作业的目标 学习数组相关内容
    姓名 陈佳桐

    0.展示PTA总分

    展示2张关于“数组题目集”分数截图。

    1.本章学习总结

    1.1 学习内容总结

    学习主要知识识点:

    数组中如何查找数据

    A顺序查找法

    特点:既适用于顺序字符串查找,又适用于非顺序字符串查找。

    例:数组7-2查找整数

    • 1.通过使用if循环语句判断是否有次数,当查找到最后一个数仍不满足时,输出否定。

    • 2.也可以使用flag进行判断,初始化flag=0;当查找到数字时,flag=1.最后根据flag进行if语句输出。

    B二分查找法:

    • 特点:仅用于顺序字符串查找数据。

    • 速度快于顺序查找。

    例:来自课堂派测试数组C作业--一维、二维数组
    #include <stdio.h>

    int main(void)
    {
        int N, number, top, bott, min, loca;
        int a[15] = { -3, -1, 0, 1, 2, 4, 6, 7, 8, 9, 12, 19, 21, 23, 50};
        N = 15;
        scanf("%d", &number);
        loca = 0; top = 0; bott = N - 1;
        if ((number < a[0]) || (number > a[N - 1]))
            loca = -1;
        while ((loca == 0) && (top <= bott)) {
             min = /*1*/ (top + bott) / 2  ; 
                           if (number == a[min])             
                               {
               loca = min;
               printf("The serial number is %d
    ", loca + 1);
    	         break;
            } 
                 else if (number < a[min])   bott = min - 1;
           else   /*2*/  top = min + 1   ;
        }
       if (    /*3*/  loca==-1||top>bott   )    printf("%d isn't in table
    ", number);
        return 0;
    }
    
     //输入要找的数,每次取数组的中间数,和要找的数做比较,判断此数在中间数的左侧还是右侧,将判断区间不断进行缩小,直到找到该数或者中间数超过区间范围。
    

    数组中如何插入数据,伪代码

    插入数据首先在于找到需要插入位置,同时保证数组中其它数据的位置不发生改变,意味着需要对原数组部分内容进行有序的位置移动,同时注意符合数组定义。

    如:

    #include<stdio.h>
    int main ()
    {
        int a[11];
        int n;
        int number;
        scanf("%d",&n);
        int i;
        
        for( i=0;i<n;i++)
        {
         scanf("%d",&a[i]);    
        }
         i=0;                          //将循环后的i清零,重新进行循环
        scanf("%d",&number);
        while(a[i]<number&&i<n)
             i++;                      //寻找number应该插入的位置,以i进行计数,这里也可以定义一个index量进行判断
    	for (int j=n-1;j>=i;j--)
    	{
    		a[j+1]=a[j];       //将插入位置以及之后的原数组内容向后移动。
    	}
    	    a[i]=number;
    
         for( i=0;i<n+1;i++)
         {
             printf("%d ",a[i]);
         }
        return 0;
    }
    

    伪代码

    //从小到大
          int number                          //需要插入的数据
          int a[]
          int i=0
          int j
          while a[i]<number&&i<n
           then     i++              //寻找number应该插入的位置,以i进行计数
    	for  j=n-1 to i
                a[j+1]=a[j]          //将插入位置以及之后的原数组内容向后移动。
               
                a[i]=number;        //特殊位置的数据插入
    

    数组中如何删除数据

    a :来源于课堂派测试C作业--字符数组+数组复习

     //Fun函数用来删除字符串中所有空格。
    //学会程序中实现数组中删除元素做法,即重构数组。
    //如输入:  as df gghk lkj78,
    //则输出:  asdfgghklkj78        
    
    //#include <stdio.h>
    void Fun(char str[81])
    {
       int i,j;
       i=j=0;
       while(____2_____)    //str[i]
       {
    	   if(str[i]!=' ')
    		   str[j++]=str[i];
    	   i++;
       }
       str[j]=___3____;  //''
    }
    
    
    int main()
    {
      char str[81];
      int n;
      gets(str); 
      puts(str);
      _____1______;        //Fun(str)
      printf("*** str: %s
    ",str);
    
    }
    

    b: PTA数组题目

    #include<stdio.h>
    int main ()
    {
        int a[100];
        int n,i;
        
        scanf("%d
    ",&n);
        int temp=n;
        for( i=0;i<n;i++)
        {
           scanf("%d",&a[i]);
        }
        int k;
        scanf("%d
    ",&k);
        int x;
        for(i=0;i<k;i++)
        {
            scanf("%d
    ",&x);
            for(int j=x-1;j<n;j++)
           {
            a[j]=a[j+1];
           }
        }
       
        for(int m=0;m<(n-k);m++)
        {
            if(m==n-k-1)
            {
                printf("%d",a[m]);
                break;
            }
                printf("%d ",a[m]);
            
        }
        return 0;
    }
    

    数组中目前学到排序方法,主要思路?

    冒泡法排序:

    • (从小到大情况)从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。

    • 特点:效率较慢。耗时久。

    #include<stdio.h>
    int main()
    {
        int n;
        int temp = 0;
        scanf("%d %d
    ", &n, &k);
        int a[100];
        for (int i = 0; i < n; i++)
        {
             scanf("%d", &a[i]);
        }
    
        for (int j = 0; j < n; j++)        //每个数都进行排序
        {
            for (int x = 0; x < n - 1; x++)
            {
                if (a[x] > a[x + 1])      //如果发现更大,两数据交换位置,两两之间都会进行一次判断。
                {
                    temp = a[x];            
                    a[x] = a[x + 1];
                    a[x + 1] = temp;
                }
            }
    
        }
        for (int m= 0; m < n; m++)
        {
            printf("%d", a[m]);
        }
        
        return 0;
    }
    

    选择排序法:冒泡排序法的改进

    • 1.第一次循环找出最大值或最小值,将这个数放在数组的最首端或最末端。

    • 2.随着选择法的进行,比较的次数将会不断减少。在前面的循环过程中已经进行过比较的数就不再比较,如有符号条件情况已进行过数值互换,进行了所谓的“选择”过程,从而使循环次数减少。

    • 3.效率高于冒泡法,比较次数较少。

    //此题将给定的n个整数从大到小排序后输出。
    #include<stdio.h>
    int main()
    {
        int n;
        int a[11];
        int temp = 0;
    
        scanf("%d", &n);
    
        for (int i = 0; i < n; i++)
        {
                scanf("%d", &a[i]);
        }
    
        for (int j = 0; j <n-1; j++)
        {
            for (int x = 0; x < n - j - 1; x++)
            {
                if (a[x + 1] > a[x])
                {
                    temp = a[x];
                    a[x] = a[x + 1];
                    a[x + 1] = temp;
                }
            }
        }
    
        for (int m= 0; m < n; m++)
      {
        printf("%d",a[m]);
       }
        return 0;
    }
    

    数组做枚举用法,有哪些案例?
    枚举类型:参考https://www.runoob.com/cprogramming/c-enum.html
    引用来自:https://www.cnblogs.com/Gaoqiking/p/11722241.html

    枚举变量
    定义枚举变量,分清楚枚举变量和枚举类型的区别
    
    //先定义枚举类型,后定义枚举变量
    enum DAY
    {
       MON=1, TUE, WED, THU, FRI, SAT, SUN
    };
    enum DAY week;
    //同时定义
    enum DAY
    {
       MON=1, TUE, WED, THU, FRI, SAT, SUN
    }week;
    //直接定义
    enum
    {
       MON=1, TUE, WED, THU, FRI, SAT, SUN
    }week;
    

    哈希数组用法

    //哈希表 
    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
    
    给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
    
    • 1.hash就是为了把一个复杂的字串,通过一定的转换,得到一个简单的数字(通常是数字)。

    • 2.这种方法,通过对多个数组进行定义,以空间换时间来提高效率。

    • 3.将所需的数值储存在一个数组中,当需要时再进行调用。

    • 4.该数组储存的数可以作为一个数组的下标来用。

    如pta数组第8题
    这是一个痛苦的回忆。。。

    //正确做法
    #include<stdio.h>
    int main()
    {
        int n, i;
        int a[100000];               //存放需要进行判断的元素
        static int b[100001];        //对判断元素出现次数进行累计(类似于count变量用法)
        int flag=0;                  //flag变量为标志,用于判断是否结束循环,输出内容
        scanf("%d", &n);
        for (i = 0; i < n; i++)
            scanf("%d", &a[i]);
        for (i = 0; i < n ; i++)
        {
            b[a[i]]++;
            if (b[a[i]]==2)
            {
                flag=1;
                break;
            }
        }
        if (flag==1)
            printf("YES");
        if(flag==0)
            printf("NO");
        return 0;
    }
    

    字符数组、字符串特点及编程注意事项。

    用getchar()或scanf()的'%c'格式符对数组进行字符赋值。

    for(i=0;i<10;i++)
    a=getchar();             //用scanf()赋值
    for(i=0;i<10;i++)
    scanf("%c",&a);          //自动补充字符数组的结束标志,不需要再赋值。
    
     接收字符串,会以空格,tab,回车作为结束符号
    

    while函数循环输入

     int i=0 ;
     while((str[i]=getchar())!'
    ')
     i++;                           
     str[i]='';                    //补充使字符串结束
    

    字符数组:包含一维数组,二维数组,多维数组。

    字符串:字符串本质是数组

    • 编程注意事项:

    • 1.对字符数组的定义使用 char 数组名[数据长度];

    • 2.字符数组中的一个元素存放一个字符,它在内存中占用两个字节。

    • 3.用字符串给字符数组赋值时由于要添加结束符 '',数组的长度要比字符串的长度(字符串长度不包括 '')大1。

    2.PTA实验作业

    2.1 题目名1

    选择一题一维数组相关题目。请认真写伪代码整理解题思路。自己代码和同学代码比较,说明各自代码特点。

    2.1.1 伪代码

    这里对伪代码的进一步学习https://wenku.baidu.com/view/21f241200722192e4536f6e8.html(纯伪代码)

    定义 字符数组a,观众数量n,投票情况number,j。
    输入 观众数量
    For i=0 to i= n-1
        输入投票情况
        Read number
        switch(number)
        case 1:a[0]++;跳出
        case 2:a[1]++;跳出;
        case 3:a[2]++;跳出;
        case 4:a[3]++;跳出;
        case 5:a[4]++;跳出;
        case 6:a[5]++;跳出;
        case 7:a[6]++;跳出;
        case 8:a[7]++;跳出;
        default:跳出;   
    End for
    For j=0 to j=7
        Print j+1,a[j]
    

    老师伪代码:

    2.1.2 代码截图

    //代码过长,进行了一些缩进
    

    2.1.3 找一份同学代码(尽量找思路和自己差距较大同学代码)比较,说明各自代码特点。

    • 1.本人代码特点:根据输入投票情况,以switch语句对数组对应数值进行累加,根据累加情况以循环结构输出结果。

    • 2.想法过程流畅,对数组的利用类似于count计数做法,思路比较清晰。

    • 3.但代码量大,如果碰到选择偏后多的情况,运行时间会偏长。

    • 1.同学代码特点:通过使用一个if语句判断count++的情况,使得代码量减少,效率提高。

    • 2.比较可知,该同学的代码运行时间短,效果好,两者的思路类似,但同学的优化和考虑更加周到。

    • 3.使用switch语句和if语句,得出不同结果,以后应当思考是否有更好的解法。

    2.2 题目鞍点:介绍二维数组。

    2.2.1 伪代码

    定义二维数组,定义最大值max,定义最小值min,定义行数row,定义列数column。
    For i=0 to n-1
     For j=0 to n-1
      Read a[i][j]      //输入二维矩阵:把输入的数给a[i][j]
     End for
    End for
    
    For i=0 to n-1
     max←a[i][0]        //把a[i][0]赋值给max
     row←i
     column←0
     flag←1
      For j=0 to n-1
        If  a[i][j]>=max
        Then do  max←a[i][j];
                 row←i;
                column←j;
        End if
       End for
     min←max
    For k=0 to n-1
       If  a[k][column]<min
        Then do flag←0;跳出
       End if
    End for
    
    If flag==1
       Then do
       Print row,column
    Else
       Do
       Print "NONE"
    End if
    

    2.2.2 代码截图


    2.2.3 和超星视频做法区别

    • a.本人代码:以flag为标志位判断是否满足条件(只要有一个条件不满足就输出否定)。

    • b.通过循环判断鞍点在行和列上是否满足条件。

    老师代码:



    • 1.两者的思路类似。

    • 2.通过封装Getpoint函数使主函数代码量降低,看起来更加清晰易读懂。

    • 3.有简明的注释说明代码的使用。

    • 4.这两个习惯应该好好学习,在之后更加大型的程序中很有帮助。

    2.3 题目:切分表达式

    2.3.1 伪代码

    定义i,定义一维字符数组a
    Read a
    定义字符str
    str←a[0]
    For i to a[i]等于'0'
        If '0'<=a[i]<='9' or a[i]等于. 
          then do 输出a[i]
        Else if a[i]等于*或者等于/或者等于(或者等于)
            do
                If '0'<=str<='9'  
                 then do 
                 print a[i] 
                Else
                    do 
                print a[i] 
        Else if a[i]等于- or a[i]等于+
            do
                If '0' <=str<= '9' 
                 then do  
                 a[i] 
                Else if
                    do 
                print a[i]
                Else 
                    do 
                print a[i]
        End if
        str=a[i]
    End for
    

    2.3.2 代码截图


    2.3.3 和超星视频做法区别



    • 比较

      • 1.整体的思路和老师的相似,老师使用while语句,我使用for语句。

      • 2.老师用a[i-1]和a[i+1]判断前一个和后一个字符,我通过定义一个字符变量来存储啊a[i]字符。

      • 3.和上面所说的一样,老师更多的使用函数进行封装,主函数显得清晰明了。

      • 4.老师运用的continue语句使得程序的运行速度加快,提高效率。

      • 5.我的伪代码过于追求格式,可读性较差。

  • 相关阅读:
    解决使用git出现 The file will have its original line endings in your working directory
    SpringBoot集成flowable碰见DMN不能初始化
    CF268D Wall Bars
    CF1327F AND Segments
    P2900 [USACO08MAR]Land Acquisition G
    CF279B Books
    CF859E Desk Disorder
    CF1147B Chladni Figure
    CF1147E Rainbow Coins
    P3565 [POI2014]HOT-Hotels
  • 原文地址:https://www.cnblogs.com/keepgoingccc/p/14129446.html
Copyright © 2011-2022 走看看