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

0.展示PTA总分


  • 一维数组

  • 二维数组

  • 字符数组

1.本章学习总结


1.1 学习内容总结

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

  • 二分查找法:适用于从小到大或者从大到小整齐排列的数组,将中间数与查找数比较,如果两者相等,则查找成功;否则利用中间数将数组分成前、后两个部分,如果中间数大于查找数,则进一步查找前一部分,否则进一步查找后一部分。重复以上过程,直到找到满足条件的中间数,使查找成功,或直到超出范围为止,此时查找不成功。

  • 顺序查找:顺序査找是从序列的起始元素开始,逐个将序列中的元素与所要查找的元素进行比较,如果序列中有元素与所要查找的元素相等,那么査找成功,如果査找到序列的最后一个元素都不存在一个元素与所要査找的元素值相等,那么表明査找失败。

1.1.2 数组中如何插入数据?

int i=0,j;
scanf数组a[n]以及要插入的数字x;

while(a[i]<x&&i<n)
i++;
end while/*找到插入的位置*/

for(j=n-1;j>=i;j--)
a[j+1]=a[j];
end for/*将插入位置后的数字往后移*/

a[i]=x;/*插入*/
printf数组;

1.1.3 数组中如何删除数据?

  • 方法一

  • 方法二

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

  • 冒泡排序法
从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。
通过一遍扫描,则最后一个元素必定是最大的元素。
然后用同样的方法对前N−1个元素进行第二遍扫描。
依此类推,最后只需处理两个元素,就完成了对N个数的排序。

  • 选择排序法
将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组。

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

  • 在一维数组第11题中,利用数组枚举,记录出现最多次数的数字
    • 将用户输入的数字与之前的数字进行比较,若遇见重复数组就让其值累加,比较出最多的那个次数输出

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

  • 一维数组 有重复数据Ⅰ 这道题,运用hush数组来检查是否有重复
    • 首先将数组初始化为0,每出现一个数就让hash数组中下标为该数的元素等于1,如果对应元素已经是1,那么该元素就已经出现过了,即有重复数据。

1.2 本章学习体会

1.2.1 学习感受

  • 学习了数组以后确实感觉到了许多困难,首先是难度有了一定幅度的提升,多个数组有点应接不暇,开了新的数组题集但是上一个还没有掌握,是一种猝不及防的感觉 害 没能够有效利用自己的可支配时间导致的刷题效率下降也是必须克服的一个难关,发现预习知识还是不够全面到位导致课堂互动有些题很纠结做不出来,希望能够继续改进。
  • 另外,在大作业的设计中也感受到函数运用还是没熟练,很多是没有接口的,看了看优秀同学的代码,还是要更加努力学习吧

1.2.2 代码量

题集 一维数组 二维数组 字符数组
代码量 385 373 406

2.PTA实验作业


2.1 出生年

2.1.1 伪代码

int NUM(int age)
{
int thousand,hundred,ten,bit分别为输入年份的千位,百位,十位,个位;
以thousand,hundred,ten,bit为数组下标记录不同位数字的个数
		if (一个数出现4次) return 1;
		if (一个数出现3次) return 2;
		if (一个数出现1次) return 4;
		if (一个数出现2次的情况,剩余两个数出现一次) return 3;	
		else return 2;	
}
int main()
{
scanf出生年份和想要的n个不同位的数字;
for(i=0;;i++)
if(NUM(年份+i)==n)
break;
输出
}

2.1.2 代码截图

2.1.3 造测试数据

输入数据 输出数据 说明
1988 4 25 2013 sample 1
1 2 0 0001 sample 2
2002 3 1 2003 n是3

2.1.4 PTA提交列表及说明

1.部分正确:我先是用 static int a[10] 想让数组初始值都赋为0,可是这样子会导致错误
调试的时候发现用静态局部变量会让整个值没有清零对应下标的数组值会继续自增
然后我把初始定义改为 int a[10]={0} 来赋值,这样子就正确了

2.2 阅览室

2.2.1 伪代码

void AverageTime(int record[][3], int k);//统计借阅平均时间

int main()
{
	int record[MAX][3];//存储借阅记录
	int n;//天数
	int number, hour, minute;//存书号,时间
	char op;//操作
	int i, j, k;

	scanf天数;

	for (i = 1;i <= n;i++)
	{
		k = 0;
		while (1)
			scanf数据格式 ;
			if (number == 0)  break;
			
			记录数组元素;
			k++;
		end while
		调用函数AverageTime;
	}
	return 0;
}
void AverageTime(int record[][3], int k)
{
	int i, j;
	int count = 0;
	float avg = 0;

	for (i = 0;i < k;i++)//借下标的操作
		if (record[i][1] == 'S')
		{
			for (j = i + 1;j < k;j++)//j表示还的下标
				if (书号一致且有借书记录) break;
				if (书号一致且有还书记录)
				{
					count++;
					算出总的时间avg;
					break;
				}
			end for
		}
	end for
	if (count != 0 即该天有借书)
	{
		 输出读者借书次数和平均阅读时间;
	}
	else
	{
		printf("0 0
");
	}
}

2.2.2 代码截图

2.2.3 造测试数据

输入数据 输出数据 说明
sample
同一本书被借多次
有不匹配

2.2.4 PTA提交列表及说明

1.答案错误:没有设置avg和count的初始值为0
2.答案错误:把输入的S打错成了s
3.答案错误:还是打错了大小写...

2.3 判断E-mail地址是否合法

2.3.1 伪代码

int main()
{
	定义循环变量;
	定义数组;
	定义长度;
	定义 flag=1 用来判断是否正确的变量,并初始化为1;
	定义 digit = 0 作为判断下标;
	定义 string[4] = "com" 来判断是否后三位为com;

	定义 k = 0记录遇到@的次数;
		计算出数组长度;

	for (i = 0;i < len - 1;i++)
		if (符合输入的只有数字字母下划线@和.)
			if (a[i] == '@')
				k++;//遇到一个@,k就加一
				if (是最后一个字符)
					flag = 0;
					break;
				end if
				else
					if (后一位是字母或者数字) end if
					else
						flag = 0;
						break;
					end else
					if (前一位是字母或者数字) end if
					else
						flag = 0;
						break;
					end else;
				end else
			end if
			if (a[i] == '.')
				判断后三个是不是com
				if(是);
                                else 
                                flag=0;
			end if
		end if
		else(输入非法字符)
			flag = 0;
			break;
		end else
	end for

	if (只有一个@且其它字符没有错误,合法)  printf("YES");
	else  printf("NO");
	
	return 0;
}

2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明
adf12@qw213.com YES sample
vfdvd@dc123.com YES sample等价
xasx123_sxj@djwo.com YES 字母数字下划线.@
adf12@qw213.comdasd NO com后有多余字符
.@ NO
@. NO
@ NO
. NO
.. NO
@@ NO
adf12@qw213.(空格)com NO 字符串中有空格
(空格)(空格) NO 全空格
adf12@qw213.com(空格) NO 有多余的空格
adf12@qw213.com* NO 合法地址后有非法字符

2.3.4 PTA提交列表及说明

1.部分正确:由于最初for循环条件设置的不对,导致会输入换行符
2.部分正确:不知道为什么在vs调试中for(i=0;i<len-1;i++)输出答案是对的,而在PTA里面就是显示错误,然后我就增加了一些条件控制输出

3.阅读代码


double queue

  • 题目大意:本题大概是说让从最低优先级开始呼叫服务台,每个序号代表不同的优先级,输入的每一行都包含一个可能的请求;只有最后一行包含停止请求(代码0);客户端可以多次到达以被服务,并且每次可以获得不同的优先级。输出描述对于代码为2或3的每个请求,程序必须在标准输出的单独一行中打印服务客户端的标识符。如果请求在等待列表为空时到达,那么程序将在输出中打印0

  • 代码优点:

    • 首先该代码函数运用较多,并且逻辑性很强,每个函数接口都有联系,联想到函数大作业,我的函数接口就缺少参数传递,从这份代码里也可以吸取到很多有益的经验吧
    • 然后是数据自增的用法,其实我一直不太会运用,看到这样的作法就会觉得很巧妙,希望能够多加练习掌握技巧
    • 数组之间的嵌套和联合运算用的很方便诶!多加学习!
原文地址:https://www.cnblogs.com/hekikimi/p/11876343.html