C语言博客作业04——数组

0.展示PTA总分

一维数组

二维数组

字符数组

1.本章学习总结

•数组中如何查找数据,有哪些做法

顺序查找

重头到尾遍历数组,直到找到需要的数据。
优点:操作简单。
缺点:效率低,当数组很大时十分耗时。

二分法查找

每次查找都可以缩短一半的查找范围,效率高。
缺点:只适用于有序排列的数组。

•数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法

首先找到该数要插入的位置,再将这个位置后的所有数的位置向后移一位,最后将这个数插入。

•数组中如何删除数据,这个有多种做法,请一一展示。

1.覆盖

找到要删除的数据的位置,从它开始,将后面的数据向前覆盖,实现数组数据的删除。

2.新数组存放

定义一个新数组,将不删除的数据放入新数组。

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

1.选择排序法

思路:将数组中每个元素与第一个元素比较,如果这个元素小于第一个元素, 则交换这两个元素。循环查找,每次找出最小元素,放于第 1 个位置,经过 n-1 轮比较完成排序

2.冒泡排序

思路:比较相邻的元素,将小(大)的放到前面。

•数组做枚举用法,有哪些案例?

不懂。

•哈希数组用法,目前学过哪些案例,举例展示。

7-5 有重复的数据I (10 分)

#include<stdio.h>
#define N 100001
int check(int n);
int main()
{
	int a[N];
	int n;
	int m;
	int i;
	int flag = 0;

	scanf("%d", &n);
	if (check(n) == 1)
	{
		printf("YES");
	}
	else
	{
		printf("NO");
	}
		return 0;
}

int check(int n)
{
	int static hash[100001];
	int i;
	int x;
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &x);
		if (hash[x] == 1)
		{
			return 1;
		}
		else
		{
			hash[x]=1;
		}
	}
	return 0;
}

7-11 求整数序列中出现次数最多的数 (15 分)

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

1.2 本章学习体会

对于一维数组和二维数组的学习有些明白,但是对于字符数组实在是懵。还有对于一些题目,虽然做出来了,但是代码非常多,应该能找到更简洁的方法去写。

代码量:483行

2.PTA实验作业

2.1 7-4 删除重复字符

2.1.1 伪代码

#include<stdio.h>
#define N 201
int main()
{
	char s[N];
	static char h[N];
	int i=0;
	int k;
	//输入字符串
	for (i = 0; s[i] != '\0'; i++)
	{
		k = (int)s[i];//强制类型转换
		h[k] = s[i];//将字符储存在对应ASCII码值得数组内
	}
	输出字符串
	return 0;
}

2.1.2 代码截图

#include<stdio.h>
#define N 201
int main()
{
	char s[N];
	static char h[N];
	int i=0;
	int k;
	while ((s[i] = getchar()) != '\n')
	{
		i++;
	}
	s[i] = '\0';

	for (i = 0; s[i] != '\0'; i++)
	{
		k = (int)s[i];
		h[k] = s[i];
	}
	for (i = 0; i < 200; i++)
	{
		if (h[i] != 0)
		{
			printf("%c", h[i]);
		}
	}
	return 0;
}

2.1.3 造测试数据

输入数据 输出数据 说明
全空格 一个空格 全空格
==--ccbbaa;;'' '-;=abc 有其他字符

2.1.4 PTA提交列表及说明

部分正确:只考虑了字母和数字的情况,没有考虑其他字符的输入与重复。也没有考虑全空格的情况。

2.2 7-7 jmu-c-大数加法

2.2.1 数据处理

char a[N];//大数a
char b[N];//大数b
int n=1,m=1,i,j,k;//循环变量
int x, y;
int z;
a[0] = '0';//考虑进位
b[0] = '0';;//考虑进位

2.2.2 代码截图

#include<stdio.h>
#include<string.h>
#define M 1002
#define N 1003
int main()
{
	char a[N];
	int n=1,m=1,i,j,k;
	int x, y;
	int z;
	char b[N];
	a[0] = '0';
	b[0] = '0';
	while ((a[n] = getchar()) != '\n')
	{
		n++;
	}
	a[n] = '\0';
	while ((b[m] = getchar()) != '\n')
	{
		m++;
	}
	b[m] = '\0';
	j = n-1;
	i = m - 1;
	if (n>=m)
	{
		for (i; i >= 0; i--)
		{
			x = a[j] - '0';
			y = b[i] - '0';
			if (x + y > 9)
			{
				a[j] = (x + y - 10) + '0';
				for (k = j;; k--)
				{
					a[k - 1] = a[k - 1] + 1;
					if (a[k - 1] - '9' > 0)
					{
						a[k - 1] = '0';
						continue;
					}
					else break;
				}
			}
			else a[j] = (x + y) + '0';
			j--;
		}
		if (a[0] != '0')
		{
			printf("%s", a);
		}
		else
		{
			for (i = 1; i < n; i++)
			{
				printf("%c", a[i]);
			}
		}
	}
	else
	{
		for (j; j >= 0; j--)
		{
			x = a[j] - '0';
			y = b[i] - '0';
			if (x + y > 9)
			{
				b[i] = (x + y - 10) + '0';
				for (k = i;; k--)
				{
					b[k - 1] = b[k - 1] + 1;
					if (b[k - 1] - '9' > 0)
					{
						b[k - 1] = '0';
						continue;
					}
					else break;
				}
			}
			else b[i] = (x + y) + '0';
			i--;
		}
		if (b[0] != '0')
		{
			printf("%s", b);
		}
		else
		{
			for (i = 1; i < m; i++)
			{
				printf("%c", b[i]);
			}
		}
	}
	
	return 0;
}

2.2.3 造测试数据

输入数据 输出数据 说明
99、1 100 检验是否进位
1、99 100 a的位数小于b

2.2.4 PTA提交列表及说明

答案错误:没有考虑a的位数比b来得少。

2.3 7-5 有重复的数据I

2.3.1 数据处理

int static hash[100001];//定义一个哈希数组来表示数据是否出现过

2.3.2 代码截图

#include<stdio.h>
#define N 100001
int check(int n);
int main()
{
	int a[N];
	int n;
	int m;
	int i;
	int flag = 0;

	scanf("%d", &n);
	if (check(n) == 0)
	{
		printf("YES");
	}
	else
	{
		printf("NO");
	}
		return 0;
}

int check(int n)
{
	int static hash[100001];
	int i;
	int x;
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &x);
		if (hash[x] == 1)
		{
			return 1;
		}
		else
		{
			hash[x]=1;
		}
	}
	return 0;
}

2.3.3 造测试数据

输入数据 输出数据 说明
1 2 3 4 5 1 YES 最后一个有重复

2.3.4 PTA提交列表及说明

部分正确:使用逐一查找的方法来判断是否有重复数据,浪费了时间,还导致了段错误。改用以空间换时间的方法来重写代码。

3.阅读代码

7-7 螺旋方阵

#include<stdio.h>
int main(void)
{
	int n;
	int a[10][10];
	scanf("%d", &n);
	int x = 0, y = 0;//坐标,爱的螺旋转圈圈
	int k = 1;//循环数1~n*n
	int bound0 = n - 1, bound1 = n - 1, bound2 = 0, bound3 = 1;//右下左上个方向的墙壁会向中间缩拢
	int direction = 0;//0向右,1向下,2向左,3向上
	while (k <= n * n)
	{
		if (direction == 0)
		{
			a[x][y++] = k++;
			if (y == bound0)
			{
				//向右走,遇到墙壁就向下
				direction = 1;
				bound0--;
			}
		}
		else if (direction == 1)
		{
			a[x++][y] = k++;
			if (x == bound1)
			{
				//向下走,遇到墙壁就向左 
				direction = 2;
				bound1--;
			}
		}
		else if (direction == 2)
		{
			a[x][y--] = k++;
			if (y == bound2)
			{
				//向左走,遇到墙壁就向上
				direction = 3;
				bound2++;
			}
		}
		else if (direction == 3)
		{
			a[x--][y] = k++;
			if (x == bound3)
			{
				//向上走,遇到墙壁就向右
				direction = 0;
				bound3++;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf(" %2d", a[i][j]);
		}
		printf("\n");
	}
}

功能:打印n阶螺旋方阵

这个螺旋方针题目的解法令我眼前一亮,它用生动形象的注释,将一个复杂的问题形象化、简单化,我想,自己写代码是否也能像这样子灵动。同时它也让我知道了代码并不一定是枯燥的
,它只要加上一点注释,就可以变得很优美。

posted @ 2019-11-17 21:21  极仙  阅读(298)  评论(0编辑  收藏  举报