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

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

    0.展示PTA总分(0----2)

    1.本章学习总结(3分)

    1.1 学习内容总结

    数组中如何查找数据

    1. 遍历数组查找
    • 特点:从第一个判断最后

    #include<stdio.h>
    int main() {
    	int n;
    	int i;
    	int m;
    	int k = 0;
    	int flag = 0;
    	scanf("%d", &n);
    	scanf("%d
    ", &m);
    	int a[20];
    	for (i = 0; i < n; i++)
    	{
    		scanf("%d", &a[i]);
    	}
    	for (i = 0; i < n; i++)
    	{
    		if (a[i] == m) 
    		{
    			k = i;
    			cnt++;
    			break;
    		}
    	}
    	if (k > 0 && flag) 
    	{
    		printf("%d", k);
    	}
    	else if (flag)
    	{
    		printf("0");
    	}
    	else 
    	{
    		printf("Not Found");
    	}
    	return 0;
    }
    
    1. 二分查找
    • 特点:在一组从小到大的数组中从中间进行比较比一次数据少一半,数据比较大时更能体现好处。
      例子:二分查找
    int BinSearch(int* a, int n, int key, int* count)
    {
        int loca = 0;
        int top = n - 1;
        int bot = 0;
        int min;
    
        while (loca == 0 && top >= bot)
        {
            *count = *count + 1;
            min = (top + bot) / 2;
            if (*(a + min) == key)
            {
                loca = min;
                return loca;
            }
            else if (key < *(a + min))
            {
                top = min - 1;
            }
            else bot = min + 1; 
        }
        if (bot >= top)
        {
            loca = -1;
            return loca;
        }
    }
    

    3.哈希查找

    1. 建立一个哈希数组按ASCII码表排序的。都赋值为0。
    2. 读取数组的时候把数据对应哈希数组的标识符修改
    3. 输出的时候按哈希数组的标识符进行输出

    举例:A-B

          int haxi[256];
          if(和哈希中相同)
                haxi[a[]]++;
    

    /*这题可以用但是我没用,我太废物了*/

    1.2 数组中如何插入数据

    • 插入数据前要可以把数据全后移一位。
    • 或者把插入的数据放最后在与前面的交换
      例子:简化的插入排序

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

    1.4 数组中如何删除数据

    • 删除数组之后将数组左移,重排列一次数组。再进行下一次删除
    • 另一种可以用标识符来标记是否输出。
    #include <stdio.h>
    int main() {
        int i;
        int j;
        int n;
        int k;
        int flag = 0;
        int a[100] = { 0 };
        int del;
    
        scanf("%d
    ", &n);
        for (i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        scanf("
    ");
        scanf("%d
    ", &k);
        for (i = 0; i < k; i++)
        {
            scanf("%d", &del);
            for (j = del - 1; j < n; j++)
            {
                a[j] = a[j + 1];
            }
        }
        for (i = 0; i < n - k; i++)
        {
            if (!flag)
            {
                printf("%d", a[i]);
                flag++;
            }
            else 
            {
                printf(" %d", a[i]);
            }
        }
        return 0;
    }
    

    1.5数组中目前学到排序方法

    1. 冒泡法排序
    • 思路:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。
    • 也就是只需处理两个元素,就完成了对N个数的排序。

    例子:冒泡法排序

    #include <stdio.h>
    int main() 
    {
    	int n;
    	int k;
    	int i;
    	int j;
    	int flag = 0;
    	int temp;
    	int a[100];
    
    	scanf("%d %d
    ", &n, &k);
    	for (i = 0; i < n; i++)
    	{
    		scanf("%d", &a[i]);
    	}
    	for (j = 0; j < k; j++)
    	{
    		for (i = 0; i < n - 1 - j; i++)
    		{
    			if (a[i] > a[i + 1])
    			{
    				temp = a[i];
    				a[i] = a[i + 1];
    				a[i + 1] = temp;
    			}
    		}
    	}
    	for (i = 0; i < n; i++)
    	{
    		if (!flag) 
    		{
    			printf("%d", a[i]);
    			flag++;
    		}
    		else
    		{
    			printf(" %d", a[i]);
    		}
    	}
    	return 0;
    }
    
    1. 选择法排序
    • 把一堆数据从小到大排序。

    例子:选择法排序

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

    1.6数组做枚举用法

    查找整数
    选择排序法
    找鞍点
    删除重复数据

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

    读取字符串

    1. scanf("%s",&a);
    • 其结尾为''。
    1. fgets函数能接收带空格的字符串。
    • 其结尾为' ''',若不够则没有' '

    2.PTA实验作业(7分)

    2.1 7-7 数组循环左移(3分)

    题目:

    2.1.1 伪代码

    我的:

          m = m % n;
          scanf(整个数据);
          int一个数组;
          for(i = m;i < n ;i++)
                printf数组;
          for(i = 0;i < m ;i++)
                printf数组;
    /*实际上我没改变数组的顺序,值改变了输出的顺序*/
    

    同学的:

          m = m % n;
          int两个数组;
          scanf(m个数据到第一个数组);
          scanf(剩下的到数组b);
          把第一个数组输到b中;
          for(i = 0;i < n ;i++)
                printf数组;
    

    2.1.2 代码截图

    我的:

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

    同学的:

    2.2 找鞍点(2分)

    题目:

    代码截图

    鞍点这介绍二维数组。并说明和超星视频做法区别。

    • 区别:思路有些相似,都是找行列符合条件的并记录。
    • 超新星中的代码用函数把代码进行了分装,增强了代码的可读性,并且使主函数更加易懂整洁。

    2.2.1 伪代码

          定义二维数组;
          读入n和数组;
          for找出第一行的最大值
          for判断是否为每列最小值
          符合条件就修改标识符令其鞍点输出
          若都不符合啧标识符没修改即无鞍点就输出NONE
    

    2.3 切分表达式——写个tokenizer吧(2分)

    2.3.1 伪代码

          for+if判断是否为数字或.是则直接输出并判断下一位来是否printf("'
    '");
          否则判断是否为加减,加减需判断是否printf("'
    '");
          若是首个或者上一个括号则不printf("'
    '");
    

    2.3.2 代码截图

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

    • 区别:思路不太相同,我自己的代码是将-和+进行判断,而超星中是对小数点、括号等分开进行判断。超新星中的代码用函数把代码进行了分装,增强了代码的可读性,并且使主函数更加易懂整洁。
  • 相关阅读:
    call()与apply()的作用与区别
    Tomcat8/9的catalina.out中文乱码问题解决
    怎样查看Jenkins的版本
    每日日报2020.8.18
    528. Random Pick with Weight
    875. Koko Eating Bananas
    721. Accounts Merge
    515. Find Largest Value in Each Tree Row
    286. Walls and Gates (Solution 1)
    408. Valid Word Abbreviation
  • 原文地址:https://www.cnblogs.com/lz02/p/14130398.html
Copyright © 2011-2022 走看看