#0.展示PTA总分
#1.本章学习总结 ##1.1学习内容总结 ###1.1.1一维数组
#define M 10使后面修改数组长度时更加方便
void Array(int a[],int M);一维数组函数声明
int main()
{
int a[M];定义一维数组
输入需要循环输入,传出也需要循环;
Array(a,M);传入一维数组地址和长度
}
void Array(int a[],int M)
{
定义函数;
}
当需要将数组内的全部值需要定义成0时,可写成static int a[M];即将全部值初始化成0; ###1.1.2二维数组
#define N 10
#define M 10使后面修改数组长度时更加方便
void Array(int a[M][N],int M,int N);二维数组函数声明
int main()
{
int a[M][N];定义二维数组
输入需要两层循环输入,传出也需要两层循环;
Array(a,M,N);传入二维数组地址和长度
}
void Array(int a[M][N],int M,int N)
{
定义函数;
}
###1.1.3字符数组和字符串 字符串由有效字符和‘ ’组成; 字符串用字符数组来保存; 字符输入由下面几种组成: (1).
scanf("%s",str);
遇空格or回车结束
(2).
循环输入(接受空格)
i=0;
while((str[i]=getchar())!='
')
i++;
str[i]=' ';必须给最后一个赋上字符串的结束标志,不然会结束不了
(3).
fgets:接收带空格的字符串
char buf[10];
fgets(buf,10,stdin);
缺点就是当输入字符少于n-1时,会多带换行符; 解决方法就是加上
for(i=0;buf[i]&&buf[i]!='
';i++);
buf[i]=' ';
字符输出由以下几种组成: (1).循环输出
(2).
printf("%s",str);
or
printf("%s","hello");
遇‘ ’结束;
(3).
put(str);
or
put("hello");
输出后自动换行
字符数组传函数时不用传长度 ###1.1.4数组中如何查找数据,有哪些做法 ####(1)顺序查找 方法:通过遍历数组,从第一个数据开始查找,依次从第一个找到最后一个,找到匹配数据则成功,否则失败; 优点:算法简单,容易上手; 缺点:查找效率低,遇到较多数据时,容易运行超时,数据较多时,不建议用此方法 ####(2)二分查找法:前提:必须是有序排列 方法:不断的通过与中间数据比较,不断缩小范围,进而找到数据 优点:数据较多时,用此种方法效率减半,高效完成程序; 缺点:算法复杂,只能用于有序排列 ###1.1.5数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法 输入一个数据x,将数组中的每一个数据与x逐一比较,如果满足条件,则将这数据以后的下标往后移一位,将x插入该下标!
###1.1.6数组中如何删除数据,这个有多种做法,请一一展示 (1). 在一个数组中,在该需要删除数据的地方记录下标,将后面的数据依次往前移,即可做到删除该数据 如下图所示:
(2). 用两个数组来进行操作,一个数组用来保存原来的数据,另一个数组用来保存删除后的数据 如下图所示: ###1.1.7数组中目前学到排序方法,主要思路? (1)选择排序法 主要思路:需要两次循环,第一次循环从第一个数据开始,第二层循环从第一次循环的数据开始,不断找出最小值放在第i个位置,直到n-2个位置的数据 (2)冒泡排序法 主要思路:将相邻的两个数据比较,将小的调到前面;经过第一趟比较后,最大的数已经在最底下了,然后对余下的数进行重复操作 (3)直接插入排序 方法较于简单,此处不介绍 ###1.1.8数组做枚举用法,有哪些案例? 阅览室题目应该有一点枚举的意思 ###1.1.9哈希数组用法,目前学过哪些案例,举例展示 用法:原来的数据可以直接通过哈希函数存储起来,这样在搜索的时候,等于每一个数据都有了自己的特定查找号码,所以在查找时,可以通过哈希函数,一步直接找到(不考虑冲突)。所以时间复杂度,接近O(1) 案例:类似于查重复数据一题: ##1.2本章学习体会 ###描述学习感受,也可以在这里提出你不理解地方、对教师教学建议等等 在数组学习中,在刚开始接触时,感觉有点难度,但题做多了以后,对数组也渐渐熟悉,运用也比以前更加灵活,现在又感觉对指针有难度了,还是好好敲代码吧 ###计算这两周代码量,是否达到目标 前一周521行 本周400行 #2.PTA实验作业 ##2.1题目名:天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。 ###2.1.1伪代码
int main()
{
for(i到N天)
{
输入四列的数据;
分别转化成二维数组a[k][0],a[k][1],a[k][2];
}
从第一行开始找a[i][1]为‘s’的数据;
找到后找与之对应的‘E’;计算出时间;
最后计算出count,平均值;
}
###2.1.2代码截图
###2.1.3造测试数据
| 输入数据 | 输出数据 | 说明 |
| ----- | --------- | ----------- |
| 3 1 S 08:10 2 S 08:35 1 E 10:00 2 E 13:16 0 S 17:00 0 S 17:00 3 E 08:10 1 S 08:20 2 S 09:00 1 E 09:20 0 E 17:00 | 2 196 0 0 1 60 | 题示数据 |
|1 1 S 08:10 2 S 08:35 1 E 10:00 2 E 13:16 0 S 17:00 |2 196|一组数据 |
###2.1.4PTA提交列表及说明
答案错误:没有考虑到出现一次书号出现两次‘S’的情况,导致题示数据错误
解决:加上{if (a[l][1] == 'S' && a[i][0] == a[l][0]) break;}
思路问题:不知道‘s’‘e’怎样去表示,并且完全不懂如何输入,判断时还准备用前面的书号去判断,结果不是这不对就是那不对;
解决:在老师课堂上提了一嘴后,有了一点思路,再结合超星平台上林老师的讲法,便很快明白了
##2.2题目名:输入一个字符串,判断是否是合法邮箱(格式正确即可,不管是否真的存在)输入的只能是字母、数字、下划线、@以及.五种, @前后只能是字母或者数字,而且.后只能是com, 是则输出YES ,否则输出NO ###2.2.1代码截图 ###2.2.2伪代码
int main()
{
fgets输入;
while(a[i]!=' ')
{
if(判断是否是邮箱的合法字符)
if(判断是否为‘@’)
if判断前后是否为合法字符;
if判断是否为‘.’
if判断后面是否只有com;
}
###2.2.3造测试数据 | 输入数据| 输出数据 | 说明 | | ----- | --------- | ----------- | |adf12@qw213.com | YES | 题示数据 | |adf12@qw213.com12|NO| com后面有后缀的 | |adf12@ qw213.com |NO | 不合法字符 | ###2.2.4PTA提交列表及说明 说明:
段错误:用了getchar()来输入
解决:其实两种应该都可以,但PTA似乎只认fgets()
部分正确:.com后有后缀的
解决:在判断.com时,a[i+4]必须等于‘ ’
部分正确:邮箱地址内有非法字符,无法跳出判断
解决:不符合条件时,return 0跳出,结束判断
##2.3题目名:向一个n×m的数组中输入一组整数(n<=10,m<=10),然后输出其中的最大值、最小值,并输出这两个值的下标 ###2.3.1伪代码
int main()
{
while(输入==2)
循环输入数组数据;
for 0到n
for 0到m
if判断最大的数据;
if判断最小的数据;
输出答案;
}
###2.3.2代码截图 ###2.3.3造测试数据 | 输入数据| 输出数据 | 说明 | | ----- | --------- | ----------- | |3 5 57 30 66 41 98 11 93 54 62 31 49 87 71 70 37| max=98 row=0 col=4 min=11 row=1 col=0 | 题示数据 | |3 5 57 30 66 41 98 11 93 54 62 31 11 93 54 62 98| max=98 row=0 col=4 min=11 row=1 col=0 |在同一数列中,同时有最大最小值| ###2.3.4PTA提交列表及说明 说明:
答案错误:输入题型是ACM型,多组数据输入
解决:去问了问学长(应该很6吧),告诉我用这种做法,并且叫我多多看看ACM,确实,ACM里有许多骚操作,自叹不如,以后一定会多多看看,让自己“骚起来”;
格式错误:输出时空格不对
解决:很神奇的输出,明明复制时有很明显的空格,但确是不加空格正确
#阅读代码
学习地方: (1)找到了一个与上面那输入多组数据的题相差无几,也是输入多组数据的题; (2)还有这句“strlen(st) != 4”统计字符串的长度; (3)简单看了一些ACM的题目,好像函数定义都是写在前面的,并没有像我们前面一个声明,后面一个定义,这种方法显然更节省时间; (4)还有一个不一样的地方,就是他的定义int i;int len;在中间,对于我们初学者我觉得应该还是定义在前面;但以后熟悉了应该也可以在需要的地方再进行定义也可以吧