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

0.展示PTA总分




1.本章学习总结

1.1 学习内容总结

  • 查找数据有遍历法和二分查找法
    • 遍历法:以数组的下标为循环条件,从0开始查找,直到找到数据。
    • 二分查找法:将数据与数组中间的数据进行比较,通过比较的结果确定数据在数组的哪个区间,从而改变查找区间,以此类推,直到找到数据。该方法仅适用于有序数组。
  • 通过遍历数组找到数据要插入位置的下标,然后将数组左移或右移,再将数据插入。
  • 通过查找数据,找到要删除数据的下标,然后直接将数组左移,覆盖掉要删除的数据,即可完成数据删除。
  • 我们学到的排序方法主要有:选择排序和冒泡排序
    • 选择排序法:在所有数中找到最小数,将其与数组中的第一个数交换,以此类推,直到排序完成。
    • 冒泡排序法:相邻的两个数进行比较,如果下标小的数更大,则交换两个数,以此类推可将最大数移到第n位。再对前n-1个数进行上述操作,将第二大的数移到n-1位。反复进行上述操作,即可完成排序。
  • 数组做枚举用法:用i枚举数组下标,遍历数组。
  • 哈希数组用法:定义一个哈希数组用于计数,以需要统计的数值做为下标,在哈希数组中计数。

1.2 本章学习体会

  • 本章学习了数组,感觉在做数组的过程中,最容易出错的地方就是下标了,数组的第一个数下标是为0,虽然都知道,但在做题的时候还是容易出错。
  • 大概1000行。

2.PTA实验作业

2.1 数组循环左移

2.1.1 伪代码

定义一个长度为最大n两倍的数组
输入数组元数个数n和左移长度m
m=m%n
for i=0 to i<n do
对a[i]赋值
end for
for i=0 to i<m do
a[N - 1-i] = a[i]
end for
for i=0 to i<n-m do
a[i] = a[i+m]
end for
for i=n-m to i<n do
a[i] = a[N - 1 - j];j++;
end for
for i=0 to i<n do
输出a[i]
end for

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
8 3 1 2 3 4 5 6 7 8 4 5 6 7 8 1 2 3 正常数据
8 11 1 2 3 4 5 6 7 8 4 5 6 7 8 1 2 3 m>n的数据
8 0 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 m为0的数据

2.1.4 PTA提交列表及说明

1.部分正确:在最开始做这题时,我没有考虑到m大于n的情况,导致部分测试点无法通过。
2.答案正确:通过m=m%n计算出移动的最小长度,提高了程序运行效率,也使m始终小于n。

2.2 IP地址转换

2.2.1 伪代码

定义一个数组two[N]用于存储输入的二进制字符
定义一个flag用于判断是否需要输出".",并将flag初始化为0
定义一个num用于存对应的十进制数
for i=0 to i<N do
给two[i]赋值
end for
for i=1 to i<=4 do
num=0
if i==4 then
flag=1
end if
for j=j to j<i*8 do
num=num*2+two[j]-'0'
end for
输出num
if flag==0 then
输出"."
end if
end for

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
11001100100101000001010101110010 204.148.21.114 0和1都有的数据
00000000000000000000000000000000 0.0.0.0 全0的数据
11111111111111111111111111111111 255.255.255.255 全1的数据

2.2.4 PTA提交列表及说明

1.部分正确:最初写这段代码的时候我将num=0放在循环外定义,导致只能通过全0的测试点。
2.答案正确:在我将num=0放在循环内,每轮循环都对num从新赋值后,答案正确。

2.3 判断上三角矩阵

2.3.1 伪代码

定义一个二位数组a[N][N]用于存放矩阵
输入一个数据T,代表需要判断的矩阵个数
for i=1 to i<=T do
flag=0
输入一个数n作为矩阵的阶
for j=0 to j<n do
for k=0 to k<n do
对a[j][k]赋值
end for
end for
for j=1 to j<n do
for k=0 to k<=j-1 do
if a[j][k]不等于0 then
flag=1并且跳出内层循环
end if
end for
if flag==1 then
跳出外层循环
end if
end for
if flag==1 then
输出NO
else
输出YES
end if
end for

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
2 3 1 2 3 0 4 5 0 0 6 2 1 0 -8 2 YES NO 正常数据
1 1 1 YES 矩阵为一阶矩阵的数据
1 10 1 2 3 4 5 6 7 8 9 10 2 4 5 4 8 4 5 1 5 5 3 1 5 4 4 5 6 5 4 4 4 5 1 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NO 最大n

2.3.4 PTA提交列表及说明

1.答案错误:在第一次提交时我的flag=0是放在for循环外初始化的,以至于后期的循环中flag没有被初始化,导致答案错误。
2.答案正确:我将flag=0写到for循环中,每轮循环开始都重新将flag初始化为0,最后答案正确。

3.阅读代码

#include <stdio.h>
#define N 1000
#define M 9

int main()
{
	int n;
	int i;
	int response;
	static int count[M];

	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &response);
		if (response >= 1 && response <= 8)
		{
			count[response]++;
		}
	}
	for (i = 1; i <= 8; i++)
	{
		printf("%4d%4d
", i, count[i]);
	}
	
	return 0;
}

这个代码的优点就是用response作为count的下标,灵活的运用了数组

原文地址:https://www.cnblogs.com/w60-06/p/11875809.html