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

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

    0.展示PTA总分


    1.本章学习总结

    1.1 学习内容总结

    数组中如何查找数据,有哪些做法
    顺序查找:不需要排序,遍历所有数组元素,查找时间较长。
    二分法查找:需要对所有数据进行排序,适合顺序结构。因为每次都是和中间值比较,如果大于选中间值后面的部分继续二分查找,如果小于中间值则选前面的部分继续执行。例如:

    #include <stdio.h>
    #define M 10
    void main()
    {
      static int a[M]={-12,0,6,16,23,56,80,100,110,115};
      int n,low,mid,high,found;
      low=0;
      high=M-1;
      found=0;
      printf("Input a number to be searched:");
      scanf("%d",&n);
      while(low<=high)
        {
         mid=(low+high)/2;
         if(n==a[mid]) {found=1;break;}
         else if(n>a[mid]) low=mid+1;
              else high=mid-1;
        }
      if(found==1) printf("The index of %d is %d",n,mid);
      else printf("There is not %d",n);
    }
    

    分块查找:需要按照数值大小进行排序分块,虽然每个块中的大小可以不排序,但是块的取值区间是排序的。

    数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法
    例如在一个由小到大排好序的数列中插入一个数值:

    #include <stdio.h>
    int main()
    {
        int a[11];
        int i, k, x;
        printf("请您输入一个数组中的10个数字:
    ");
        for (i = 0; i <= 9; i++)
        {
            scanf("%d", &a[i]);
        }
        printf("请您输入一个要插入的数字:
    ");
        scanf("%d", &x);
        for (i = 0; i <= 9; i++) 
        {
            if (x < a[i])   //找到第一个比x大的数据
                break;
        }
        k = i;        //跳出来记住位置
        for (i = 9; i >= k; i--)  /*自第k个数据之后的所有数据后移*/
        {        
            a[i + 1] = a[i];
        }
        a[k] = x;                      //将x插入一定要在for循环外面,在里面会把后面的数据覆盖
        for (i = 0; i <= 10; i++) 
        {
            printf("%d ", a[i]);
        }
        return 0;
    }
    

    数组中如何删除数据,这个有多种做法,请一一展示
    方法一:对原数组进行对应删除

    #include<stdio.h>
    #define N 10
    void main()
    {
    	int a[N], num, i, n = N;
    	int j;
    	/*输入N个数到数组中;*/
    	for (i = 0; i < n; i++)
    	{
    		scanf(" %d", &num);
    		a[i] = num;
    	}
    	/*在数组a中删除指定的zhi数num;*/
    	for (i = 0; i < n; i++)
    	{
    		if (a[i] == num)
    		{
    			//a[i]=a[n];//如果不保留原数组里的顺序,此一句即可代替下边2行语句,同时省掉变量j
    			for (j = i; j < n - 1; j++)
    			{
    				a[j] = a[j + 1];
    			}
    			n--;
    		}
    	}
    	/*输出删除了num后的数组a;*/
    	for (i = 0; i < n; i++)
    	{
    		printf("%d ", a[i]);
    	}
    	getchar();
    }
    

    方法二:建立新数组

    #include <stdio.h>
    #define SIZE 100
    int deleteData(int*, int, int);
    int main()
    {
        int n = 10;
        int i, j, locate;
        int a[SIZE] = { 12,15,79,4,6,52,16,1,9,19 };
        for (j = 0; j < n; j++)
        {
            printf(" %d", a[j]);
        }
        printf("
    请输入数组a[10]需要删除的元素位置序号:");
        scanf("%d", &locate);
        n = deleteData(a, n, locate);
        for (i = 0; i < n; i++)
        {
            printf(" %d", a[i]);
        }
        printf("
    ");
        return 0;
    }
    int deleteData(int arr[], int len, int loc)
    {
        int i = loc;
        while (i < len - 1)
        {
            arr[i] = arr[i + 1];
            i++;
        }
        len--;
        return len;
    }
    

    数组中目前学到排序方法,主要思路?
    冒泡排序法:对数组进行多次的扫描并排序,所需时间长

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

    选择排序法:选择出需要排序的数组中的数据对其进行排序,所需时间短

    #include<stdio.h>
    int main() {
        int i;
        int j;
        int n;
        int num[10];
        int temp;
        scanf("%d", &n);
        for (i = 0; i < n; i++)
        {
            scanf("%d", &num[i]);
        }
        for (i = 0; i < n-1; i++)
        {
            for (j = 0; j < n-i-1; j++)
            {
                if (num[j] < num[j + 1]) 
                {
                    temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
            }
        }
        for (i = 0; i < n; i++)
        {
           
            if (i != 0)
            {
                printf(" ");
            }
            printf("%d", num[i]);
        }
        return 0;
    }
    

    数组做枚举用法,有哪些案例?
    PTA题目:调查电视节目受欢迎程度,查找整数等,附上查找整数的代码

    #include<stdio.h>
    int main() {
        int i;
        int n;
        int num[20];
        int X;
        int temp=0;
        scanf("%d %d", &n,&X);
        for (i = 0; i < n; i++)
        {
            scanf("%d", &num[i]);
        }
        for (i = 0; i < n; i++)
        {
            if (num[i] == X)
            {
                printf("%d", i);
                temp = 1;
            }
        }
        if (temp == 0)
        {
            printf("Not Found");
        }
        return 0;
    }
    

    哈希数组用法,目前学过哪些案例,举例展示
    PTA题目:

    代码:

    #include<stdio.h>
    int panduan(int n);
    int main()
    {
    	int a[100001];
    	int n;
    	int m;
    	int i;
    	int flag = 0;
    
    	scanf("%d", &n);
    	if (panduan(n) == 1)
    	{
    		printf("YES");
    	}
    	else
    	{
    		printf("NO");
    	}
    	return 0;
    }
    
    int panduan(int n)
    {
    	int static b[100001];
    	int i;
    	int x;
    	for (i = 1; i <= n; i++)
    	{
    		scanf("%d", &x);
    		if (b[x] == 1)
    		{
    			return 1;
    		}
    		else
    		{
    			b[x] = 1;
    		}
    	}
    

    建立哈希函数来进行判断数组是否符合要求,然后进行返回。
    字符数组、字符串特点及编程注意事项。

    • gets识别换行符 ,也就是不识别空格,可以输入一行数据, puts输出后,会自动加上一个换行符
    • 如果不是使用scanf函数的%s格式,或者是使用gets函数输入字符串,记得一定需要在最后面加一个''.例如:使用scanf函数的%c格式,或者使用getchar,一定要在后面加上一个''
    • scanf函数输入时,然后整数换行时,输入直接闪退,这个时候需要在%d后面加上 换行

    2.PTA实验作业

    2.1 有重复的数据

    2.1.1 伪代码

    int main
    {
    scanf n //得知输入数值数量
    if panduan=1 //利用函数来判断输出值
          printf YES //证明有重复数据
    else 
          printf NO //证明没有重复数据
    }
    int panduan
    {
    int static b[100001]//设置静态数组
    int x
    for  
          scanf x
          if (b[x] == 1) 返回返回值1 
          else b[x] = 1//利用数值来作为数组下标,如果下标出现两次则说明有重复数据
    end for
    }
    

    2.1.2 代码截图


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

    同学代码:

    特点:我运用了分装函数的方法来让代码更清晰可读,做法都是运用了哈希数组。

    2.2 找鞍点

    2.2.1 伪代码

    定义数组和max数组
    for
         if (a[i][j] >= a[i][maxi]) //判断行最大数并记录位置到max数组中
                {
                    maxi = j;
                } 
          max[i] = maxi;
    end for
    for
          //判断上述已经是行最大数的数是否为列最大数
          if(不是) break//跳出循环
          if (是)  printf("%d %d
    ", j, max[j]);//输出鞍点位置,并结束程序
    end for
    输出无鞍点
    

    2.2.2 代码截图


    2.2.3 请说明和超星视频做法区别,各自优缺点

    稍微借鉴了超星视频的做法,思路一致,不同的是视频运用了分装函数的办法让整个过程更加清晰明了

    2.3 切分表达式

    2.3.1 伪代码

    定义字符数组
    get(字符数组)
    for
          if (所获取为0~9的数值)
                 while (((ch[i] >= '0' && ch[i] <= '9') || ch[i] == '.') && ch[i] != '')//判断下一位是为0~9数值或为小数点,记录对应下标
                 for  printf("%c", ch[j]);//输出对应下标的数
          if (所获取为‘-’字符)
                 if (ch[i - 1] >= '0' && ch[i - 1] <= '9' || ch[i + 1] == '(')//数组前一位是数字或者下一位是前括号
                      {
                       putchar('-');
                       putchar('
    ');//减号单独输出一行
                      }
                 else
                      {
                       putchar('-');//只输出减号
                      }      
          if (所获取为‘+’)
                 if(i == 0)//正号为起始,仅输出正号
                      {
                       putchar('+');
                      }
                 else//正号单独输出一行
                      {
                       putchar('-');
                       putchar('
    ')
                      }
          else//其余的单独输出一行
          {
                printf("%c", ch[i]);
                putchar('
    ');
          }
    end for
    

    2.3.2 代码截图


    2.3.3 请说明和超星视频做法区别,各自优缺点。

    超星视频运用了封装函数的方法,且有提前结束循环的设置可以缩短代码运行时间,代码可读性和所需时间得到提升,我的代码比较直白,但也考虑了特殊情况,细节抓得住

  • 相关阅读:
    样式问题
    布局
    通用模板实现可变参数函数
    使用单例模式实习string类
    动态生成一维数组和二维数组
    自定义的类传数据到主窗口控件上的方法
    使用TableView
    G480折腾上了黑苹果,完美了,哈哈
    error C2383: 此符号中不允许有默认参数
    动态链接库的隐式动态链接和显示动态链接
  • 原文地址:https://www.cnblogs.com/miao-witch/p/14127147.html
Copyright © 2011-2022 走看看