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\n", 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\n", 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____;  //'\0'
}


int main()
{
  char str[81];
  int n;
  gets(str); 
  puts(str);
  _____1______;        //Fun(str)
  printf("*** str: %s\n",str);

}

b: PTA数组题目

#include<stdio.h>
int main ()
{
    int a[100];
    int n,i;
    
    scanf("%d\n",&n);
    int temp=n;
    for( i=0;i<n;i++)
    {
       scanf("%d",&a[i]);
    }
    int k;
    scanf("%d\n",&k);
    int x;
    for(i=0;i<k;i++)
    {
        scanf("%d\n",&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", &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())!'\n')
 i++;                           
 str[i]='\0';                    //补充\0使字符串结束

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

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

  • 编程注意事项:

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

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

  • 3.用字符串给字符数组赋值时由于要添加结束符 '\0',数组的长度要比字符串的长度(字符串长度不包括 '\0')大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.我的伪代码过于追求格式,可读性较差。

posted @ 2020-12-13 22:51  落叶满长安  阅读(86)  评论(0编辑  收藏  举报