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\n", &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", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d ", &a[i]);
	}
	scanf("\n");
	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", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    scanf("\n");
    scanf("%d\n", &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", &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);
  • 其结尾为'\0'。
  1. fgets函数能接收带空格的字符串。
  • 其结尾为'\n''\0',若不够则没有'\n'

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("'\n'");
      否则判断是否为加减,加减需判断是否printf("'\n'");
      若是首个或者上一个括号则不printf("'\n'");

2.3.2 代码截图

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

  • 区别:思路不太相同,我自己的代码是将-和+进行判断,而超星中是对小数点、括号等分开进行判断。超新星中的代码用函数把代码进行了分装,增强了代码的可读性,并且使主函数更加易懂整洁。
posted @ 2020-12-13 21:23  一笑惜命  阅读(106)  评论(0编辑  收藏  举报