0.展示PTA总分(0----2)

展示3张关于“数组题目集”分数截图。


1.本章学习总结(2分)

1.1 学习内容总结

整理数组这章学习主要知识点,必须包含内容有:

(1)数组查找数据

  • 顺序查找法

    顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。该查找法思路较为简单,容易上手。
  1. /* 举一个例子 */
  2. /*在给定的一组数中查找是否有数字 2*/
  3. #include<stdio.h>
  4. int main()
  5. {
  6. int i;
  7. int a[5] = { 1, 2,3,4,5 };
  8. int loc;//记录位置;
  9. int flag = 0;
  10. for (i = 0; i < 5; i++)
  11. { //遍历数组,寻找2;
  12. if (a[i] == 2)
  13. {
  14. loc = i;
  15. printf("2在这个数组的第%d项",loc);
  16. flag = 1;
  17. }
  18. } //判断是否发现了数2;
  19. if(flag==0)
  20. printf("2不在这个数组中。");
  21. }
  • 二分查找法

    基本思想:也称为是折半查找,属于有序查找算法。确定上界下界(left,right),用给定值k先与中间结点(mid=(left+right)/2)的关键字比较,中间结点把线性数组分成两部分,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪一部分,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
  1. /*同样举一个例子*/
  2. /*用二分法在一个有序数列{1,2,3,4,5,6,7,8,9,10}中查找key值,若找到key则输出其在数组中对应的下标,否则输出not found。*/
  3. #include <stdio.h>
  4. int binarySearch(int a[], int key)
  5. {
  6. int low = 0; //定义上界下界,他的中间值mid;
  7. int high = 9;
  8. int mid;
  9. int loc;
  10. while (low <= high) //循环控制条件,如果下界大于上界则表示可以结束循环;
  11. {
  12. mid = (low + high) / 2;
  13. if (a[mid] < key)
  14. low = mid + 1;
  15. else if (a[mid] > key)
  16. high = mid - 1; //判断在线性数组的哪一部分,然后进行再赋值计算;
  17. else
  18. {
  19. loc = mid ;
  20. return loc;
  21. }
  22. }
  23. return 0;
  24. }
  25. int main()
  26. {
  27. int i;
  28. int key;
  29. int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  30. scanf("%d", &key);
  31. if (binarySearch(a, key))
  32. {
  33. printf("weizhi:%d", binarySearch(a, key));
  34. }
  35. else
  36. {
  37. printf("not found");
  38. }
  39. return 0;
  40. }

需要说明的是:使用二分查找法元素必须是有序的,如果是无序的则要先进行排序操作。二分法查找大大减少了用时,是一种高效的查找方法;


(2)数组中如何插入数据

  1. #include<stdio.h>
  2. #define N 10
  3. void InputArrery(int a[], int n, int date);
  4. int main()
  5. {
  6. 输入数的个数;
  7. for i=0 to i<n;
  8. 输入要插入的数date
  9. 调用函数插入InputArrery(a, n, date);
  10. 输出数组;//注意插入数之后,项数的改变;
  11. }
  12. void InputArrery(int a[], int n, int date)
  13. {
  14. for i=0 to i<n
  15. 寻找第一个大于date的数;
  16. 记录位置loc=i;
  17. end for;
  18. 临时变量temp存储date;
  19. a[n]=date;
  20. for i=n-1 to t>=loc //将每一项的值赋给后面一项,达到插入的目的;
  21. a[i + 1] = a[i];
  22. a[i] = temp;
  23. }

(3)数组中如何删除数据

  • 方法一:移位删除法

    思路:有n项的数组将要删除的i项放在数组的最后面,输出的时候只输出n-i项即进行了删除;
  1. int date;//被寻找的数据;
  2. int temp;
  3. for i=0 to i<n
  4. 输入n项数
  5. for i=0 to i<n
  6. 遍历数组,寻找值进行交换;
  7. if(a[i]==date) temp=a[n-1]; a[n-1]=a[i]; a[i]=temp;//交换数组;
  8. for i=0 to i<n-1
  9. 输出n-1项数
  • 方法二:覆盖法;
  1. int length;//计算数组长度;
  2. for int i=0 to i<length-1
  3. for int j=i+1 to j<length //注意:此时第三个表达式空出,因为当找到重复的数据,后面的数往前覆盖之后,应该再进行一次对比
  4. if (a[i] == a[j])//判断如果出现相同数据,则将后面的数据往前移一位
  5. {
  6. for int k=j to k<length-1
  7. {
  8. a[k]=a[k+1];
  9. }
  10. length--;//记录数组长度的变量相应减1
  11. }
  12. else j++;//没有的时候才j++;
  13. for i = 0 to i<length
  14. 输出数组;

(4)数组中排序方法。

  • 冒泡法

    其原理为从a[0]开始,依次将其和后面的元素比较, 若a[0] > a[i],则交换它们,一直比较到a[n]。同理对a[1], a[2], ...a[n - 1]处理,即完成排序。下面列出其代码:
  1. void bubble(int* a, int n) /*定义两个参数:数组首地址与数组大小*/
  2. {
  3. int i, j, temp;
  4. for (i = 0; i < n - 1; i++)
  5. for (j = i + 1; j < n; j++) /*注意循环的上下限*/
  6. if (a[i] > a[j])
  7. {
  8. temp = a[i];
  9. a[i] = a[j];
  10. a[j] = temp;
  11. }
  12. }

冒泡法原理简单,但其缺点是交换次数多,效率低。

下面介绍一种源自冒泡法但更有效率的方法“选择法”。

  • 选择法

    选择法循环过程与冒泡法一致,它还定义了记号k = i, 然后依次把a[k]同后面元素比较,若a[k] > a[j], 则使k = j.最后看看k = i是否还成立,不成立则交换a[k], a[i], 这样就比冒泡法省下许多无用的交换,提高了效率。
  1. void choise(int* a, int n)
  2. {
  3. int i, j, k, temp;
  4. for (i = 0; i < n - 1; i++) {
  5. k = i; /*给记号赋值*/
  6. for (j = i + 1; j < n; j++)
  7. if (a[k] > a[j]) k = j; /*是k总是指向最小元素*/
  8. if (i != k)
  9. { /*当k!=i是才交换,否则a[i ] 即为最小*/
  10. temp = a[i];
  11. a[i] = a[k];
  12. a[k] = temp;
  13. }
  14. }
  15. }

(5)数组做枚举用法,有哪些案例?

枚举法:【https://blog.csdn.net/wq3028/article/details/76204690】

程序设计中,存在着一种“数据集”,他的数值在程序中是稳定的,而且元素的个数是有限的,通常可以使用一个数组元素代替一种状态。

(6)哈希数组用法

哈希算法:【https://blog.csdn.net/u014209205/article/details/80820263】

应用:hash被用在加密等场合,但在一般的应用程序代码中,也可以用它来存贮简单的数据,这样代码的效率会高很多。


1.2 本章学习体会

  • 数组是一种应用性很强的工具。通过对本章内容的学习,可以利用数组解决很多问题。数组就是一种对数据暂时存储的容器,运用它可以同一时间存储多个数据,并且根据要求对所给出的数据进行处理。利用正确的方法可以实现问题快速高效地解决,比如说查找指定数据,可以遍历数组查找,也可以用二分法查找。将数据排序,再也不用设abcd···等多个变量,节约了代码量。并且还可以利用这部分地知识解决实际生活中的问题,比如设计一个最受欢迎节目统计器,寻找多次出现的数据,各种进制之间的相互转换等。最重要的是,利用它可以解决许多线性代数问题(因为它经常研究矩阵)。认真学好这部分的知识对后面指针的学习也有很大帮助。
  • 计算这两周代码量
时间 代码量
十一周 1203
十二周 1502

2.PTA实验作业(7分)

2.1 题目名1 数组元素的删除

2.1.1 伪代码

  1. int num;//被删除的数据;
  2. int temp;//暂时变量,用于交换;
  3. for i=0 to i<n
  4. 输入n项数
  5. end for
  6. 输入要删除的数据;(假设删除i项)
  7. for i=0 to i<n
  8. 遍历数组,寻找值进行交换;
  9. if(a[i]==num) temp=a[n-1]; a[n-1]=a[i]; a[i]=temp;//交换数组;将要删除的数据放在整个数组的后头;
  10. end for
  11. for i=0 to i<n-i
  12. 输出n-i项数

2.1.2 代码截图

2.1.3 造测试数据

测试数据 运行结果 结果
数的量:10 每个数:1 2 3 4 5 6 7 8 9 10 删除的项:4 3 2 4 6 1 4 5 7 8 10 正确
数的量:2 每个数:1 2 删除的项:1 2 正确
数的量:0 每个数:1 2 删除的项:1 乱码

2.1.4 PTA提交列表及说明

截图PTA提交列表,介绍碰到问题及解决办法。如:



提交列表说明:

  • 1.格式错误:关于结尾有空格的问题,可以让a[0]单独输出;
  • 2.答案错误:主要是越界的问题。控制输出的个数;

2.2 题目名2 数组循环左移

2.2.1 数据处理

  1. int n, m;//移动次数;
  2. int a[N];
  3. int temp;
  4. scanf("%d %d", &n, &m);
  5. for i = 0 to i < n
  6. {
  7. 输入数据;
  8. }
  9. end for
  10. for i = 1 to i<= m
  11. {
  12. temp = a[0];//储存头号数据;
  13. for k = 0 to k < n
  14. 进行后一项与前一项的交换;
  15. }
  16. end for
  17. for i = 0 to i < n - 1
  18. {
  19. 输出结果;
  20. }
  21. end for;

2.2.2 代码截图

2.2.3 造测试数据

测试数据 运行结果 结果
输入几个数:8 移动几次:3 数:1 2 3 4 5 6 7 8 4 5 6 7 8 1 2 3 正确
输入几个数:2 移动几次:3 数: 5 6 6 5 正确

2.2.4 PTA提交列表及说明

  • 1.多种错误:刚开始的时候没有思路,一直想把前面几项当成一个整体进行移动,但是多种错误;
  • 2.答案正确:后来在网上搜到了整体移动的方法;
  • 3.答案正确:看了超星平台的视频之后,感觉每次只移动一个数字,多次进行移动的效率高,且容易理解;

2.3 题目名3 阅览室

2.3.1 数据处理

  1. int main()
  2. {
  3. scanf("%d", &n);//输入要查找N天的纪录;
  4. for i = 1 to i <= n
  5. {
  6. k = 0;
  7. while (1)
  8. {
  9. scanf("%d %c %d:%d", &number, &op, &hour, &minute);
  10. if (number == 0) break; //输入0则表示退出;
  11. record[k][0] = number;
  12. record[k][1] = op; //利用二维数组进行数据的存储;
  13. record[k][2] = hour * 60 + minute;
  14. k++;
  15. }
  16. AverageTime(record, k);
  17. }
  18. return 0;
  19. }
  20. void AverageTime(int record[][3], int k)//向下查找并且进行计算;
  21. {
  22. for i = 0 to i < k
  23. {
  24. if (record[i][1] == 'S')//以S为开始;
  25. {
  26. for j = i + 1 to j < k
  27. {
  28. if (record[j][0] == record[i][0] && record[j][1] == 'S') break;
  29. if (record[j][0] == record[i][0] && record[j][1] == 'E')//以E 为结束;
  30. {
  31. count++;
  32. avg = avg + record[j][2] - record[i][2];
  33. break;
  34. }
  35. }
  36. end for
  37. }
  38. }
  39. end for
  40. }

2.3.2 代码截图



2.3.3 造测试数据

  1. /*1 S 08:10 //测试数据(1)
  2. 2 S 08:35
  3. 1 E 10:00
  4. 2 E 13:16
  5. 0 S 17:00
  6. 0 S 17:00
  7. 3 E 08:10
  8. 1 S 08:20
  9. 2 S 09:00
  10. 1 E 09:20
  11. 0 E 17:00*/
测试数据 运行结果 结果
测试数据(1) 2 196 0 0 1 60 正确
0(表明没有查询) 正确

2.3.4 PTA提交列表及说明

  • 1.多种错误:刚开始的时候没有思路;
  • 2.编译错误:ctrl+v时候发生了错误;
  • 3.答案正确:看了超星平台的视频之后,按照老师给的思路进行了编译,最后成功完成了代码;

3.阅读代码(-2--1分)

打印螺旋方阵———洋葱遍历法;

题目描述:



遍历方式:



优点:

  • 该代码运用了很详细的注释,比较直观的描述了数组打印的过程;
  • 总体思路上来讲,将数组从外层到内层不断地存放,打印出一个矩形(n为其边长),外面有一个大的for循环,判断循环结束的条件是是s>e;解决了我pta上没有解决的内容。

    我的代码:



    更加优雅的解题方法:



    核心思路:

    当我们遍历每一行、每一列时,都把最后一个元素留着,等到下一步再遍历。这样的话,我们每次把矩阵剥离一圈,都对应 4 个非常规整的循环,边界条件清晰不易出错。

C语言博客作业04—数组的更多相关文章

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

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量 1.2.1学习体会 这几周学习了数组,数组分为三大块:一维数组.二维数组和字符数组.数组相对于之前普通变量的好处就是可以储存数值,方便数据 ...

  2. C语言博客作业04数组

    0.展示PTA总分 1.本章学习总结 1.1 学习内容总结 1.int a[10];为定义数组,表示数组有10个数 2.数组的下标都是从0开始,到n-1结束 3.数组里元素的个数不能大于数组的长度 4 ...

  3. C语言|博客作业04

    这个作业属于哪个课程 C语言程序设计II 这个作业的要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-1/homework/9768 我在这个课程的 ...

  4. C语言Ⅰ博客作业04

    问题 回答 这个作业属于哪个课程 c语言程序设计ll 这个作业要求在哪里 https://blog.csdn.net/qq_42264638/article/details/102381471 我在这 ...

  5. c语言Ι博客作业04

    这个作业属于哪个课程 c语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-3/homework/9771 我在这个课程的目 ...

  6. C语言博客作业04

    问题|答案 -|:-:|-: 这个作业属于哪个课程|c语言程序设计I 这个作业的要求在哪里|https://edu.cnblogs.com/campus/zswxy/CST2019-4/homewor ...

  7. C语言博客作业—字符数组

    一.PTA实验作业 题目1:字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 (1)定义i为循环变量,number用于存放每一次转化的结果,flag用于判断是否为负数,p用于修改结果的 ...

  8. C语言博客作业--字符数组

    一.PTA实验作业 题目1:统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 Begin 定义字符型变量ch,pre=' ': 定义整型变量count://用来记录单词个数 count ...

  9. C语言博客作业字符数组

    一.PTA实验作业 7-12 IP地址转换 本题PTA提交列表 设计思路 3.代码截图 7-7删除字符串中的子串 本题PTA提交列表 设计思路 定义字符型数组s[81]储存主串,sub[81]储存子串 ...

随机推荐

  1. 配置Java,jdk环境变量

    注意:所有的都是配系统变量 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.8.0_202(以自己的为准)变量名:Path 变量值:%JAVA_HOME%\b ...

  2. 路由拨号上网过Drcom

    学校校园宽带是Drcom认证的 ,一人一号一设备.用着难受就决定想破解. 开始想着用软路由,但是感觉对电脑不友好,所以就决定买个路由器来搞. 一丶环境说明 学校使用的是Drcom 6.0 P版客户端. ...

  3. Zabbix监控服务器磁盘I/O

    一.场景说明: 需要使用Zabbix监控服务器上各个磁盘的I/O使用率,当zabbix自身带的item无法满足我们的时候,则需自定义item.     包括: 磁盘读的次数 磁盘读的毫秒数 磁盘写的次 ...

  4. MySQL的select详细介绍

    MySQL 查询数据 MySQL 数据库使用SQL SELECT语句来查询数据. 你可以通过 mysql> 命令提示窗口中在数据库中查询数据 语法 以下为在MySQL数据库中查询数据通用的 SE ...

  5. SceneView聚焦当前选中项

    编辑器代码如下所示: Selection.activeGameObject = indexer; // 方法一 SceneView.FrameLastActiveSceneView(); // 方法二 ...

  6. Listary 文件操作神器

    文档简介 Listary 官方文档(中文版):https://zhuanlan.zhihu.com/p/24897629 视频介绍:https://v.youku.com/v_show/id_XNTY ...

  7. Linux权限设置基础

    chmod   linux系统中文件或目录有两个属性:访问权限和文件所有者,简称“权限”和“归属”. 访问权限包括:读取.写入.可执行. 归属包括:属主(拥有该文件的用户).属组(拥有该文件的用户组) ...

  8. dapi 基于Django的轻量级测试平台六 怎样使用压测功能

    QQ群: GitHub:https://github.com/yjlch1016/dapi JMeter非GUI模式下: jmeter -n -t jmx脚本 -l jtl文件 -e -o 测试报告目 ...

  9. 在istio中让prometheus跑起来

    使用microk8s安装,默认的prometheus已就位. 可直接弄. 一,映射本地端口(注意,命令行最后的两个端口,前一个为要映射的本地端口,后一个为POD的服务端口,如果本地相同端口被占用,则要 ...

  10. 让istio中的jaeger跑起来

    现在的水平,仅止于让它跑起来.:) 同样的环境,microk8s+istio. 步骤如下: 一,使用kubectl get pod -n istio-system查看所有istio的POD运行正常. ...