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

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字符数组和字符串

字符串由有效字符和‘\0’组成;
字符串用字符数组来保存;
字符输入由下面几种组成:
(1).

scanf("%s",str);
遇空格or回车结束

(2).

循环输入(接受空格)
i=0;
while((str[i]=getchar())!='\n')
i++;
str[i]='\0';必须给最后一个赋上字符串的结束标志,不然会结束不了

(3).

fgets:接收带空格的字符串
char buf[10];
fgets(buf,10,stdin);

缺点就是当输入字符少于n-1时,会多带换行符;
解决方法就是加上

for(i=0;buf[i]&&buf[i]!='\n';i++);
buf[i]='\0';

字符输出由以下几种组成:
(1).循环输出

(2).

printf("%s",str);
or
printf("%s","hello");
遇‘\0’结束;

(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]!='\0')
    {
         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]必须等于‘\0’
部分正确:邮箱地址内有非法字符,无法跳出判断
解决:不符合条件时,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;在中间,对于我们初学者我觉得应该还是定义在前面;但以后熟悉了应该也可以在需要的地方再进行定义也可以吧

posted @ 2019-11-17 21:03  湛遥  阅读(597)  评论(0编辑  收藏  举报
/* 点击爆炸效果*/
/* 鼠标点击求赞文字特效 */ /*鼠标跟随效果*/