哈喽!这里是一只派大鑫,不是派大星。本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段找到好的方法、路线,让天下没有难学的程序(只有秃头的程序员 2333),学会程序和算法,走遍天下都不怕!

在逐渐“内卷”化的形势下,算法体现得越来越重要了,无论是找工作、学习、竞赛,只要是学习计算机的内容,必然少不了算法。因此很多小伙伴也趁早刷起了算法题~

但是呢,我们也不能找到网站就开始进行刷题了,这样不好,在练习算法之前还有很多需要先了解的事,明白了这些事,才能让我们在刷算法的过程中更顺利~

话不多说,直入主题。

Q1:黑盒测试

黑盒测试是指:系统后台会准备若干组输入数据,

然后让提交的程序去运行这些数据,

如果输出的结果与正确答案完全相同(字符串意义上的比较),那么久称通过了这题的黑河测试,否则会根据错误类型而返回不同的结果。

其中,根据黑盒测试是否对每组测试数据单独测试或是一次性测试所有测试数据,又可以分为单点测试和多点测试。

Q2:单点测试

对单点测试来说,系统会判断每组数据的输出结果是否正确。

如果输出正确,那么对该组数据来说就是通过了测试,并获得了这组数据的分值。

在这种情况下,题目的总得分等于通过的数据的分值之和。

例如PAT、洛谷就是采用了单点测试,并且对每组数据都会给出相应的测评结果。

从代码编写上来说,单点测试只需要按正常的逻辑执行一遍程序即可,是“一次性”的写法,即程序只需要对一组数据能够完整执行即可。

以A+B为例,下面就是一个可以通过测试的代码:

#include<stdio.h>
int main(){int a,b;scanf("%d%d",&a,&b);printf("%d\n",a+b);return 0;
}

Q3:多点测试

与单点测试相对,多点测试要求程序能一次运行所有数据,

并要求所有输出结果都必须完全正确,才能算这题通过;

而只要有其中一组数据的输出错误,本题就只能得0分。

对多点测试来说,由于要求程序能运行所有数据,因此必须保证程序有办法反复执行代码的核心部分,这就要用到循环。

而题目一般会有3种输入的格式,需要采用不同的输入方式。

下面就分别讲述着三种输入方式!

多点测试输入方式(1)——while...EOF型

如果题目没有给定输入的结束条件,那么就默认读取到文件末尾。

对黑盒测试来说,所有输入数据都是放在一个文件里的,系统会让程序去读取这个文件里的输入数据,然后执行程序并输出结果。

那么如果题目没有指定何时结束输入,一般都是指输入完所有数据(即到达文件末尾)为止。

如何解决这样的输入要求呢?

scanf函数的返回值为其成功读入的参数的个数!

只有在读取文件时到达文件末尾导致的无法读取现象,才会产生读入失败。

这个时候,scanf函数会返回-1而不是0,且C语言中使用EOF(即End Of File)来表示-1

于是我们可以这样处理:

while(scanf("%d",&n) != EOF){...}

例如:

int main(){int a,b;while(scanf("%d%d",&a,&b) != EOF){printf("%d\n",a+b);   }return 0;
}

另外需要注意的是,在黑框框里输入数据时,并不会出发EOF状态。

这时我们可以按<Ctrl + Z>组合键,这时就会显示一个^Z ,我们再按下<Enter>键就可以结束while了!

还有,如果读入字符串,就会有scanf和gets两种方式,它们也有一些小区别如下:

    while(scanf("%s",str) != EOF){... }while(gets(str) != NULL){...}

多点测试输入方式(2)——while...break型

这种类型是while...EOF型的延伸,题目要求当输入的数据满足某个条件时停止输入。

很简单,此时我们再while...EOF的内部进行判断,当满足退出条件时中断(break)当前while循环即可,如下所示:

int main(){int a,b;while(scanf("%d%d",&a,&b) != EOF){if(a == 0 && b == 0) break;printf("%d\n",a + b);}return 0;
}

多点测试输入方式(3)——while(T--)型

在这种类型中,题目会给出测试数据的组数,然后才给出相应数量组数的输入数据。

由于给定了测试数据的组数,因此用一个变量T来保存,并在程序开始时读入。

在读入T之后,下面就可以进行T次循环,每次循环解决一组数据的输入与输出,

while(T--)就是循环执行T此的含义。下面的代码体现了这种写法:

int main(){int T,a,b;scanf("%d",&T);while(T--){scanf("%d%d",&a,&b);printf("%d",a + b);}return 0;
}

以上就是多点测试的三种输入类型。

下面讲解三种常见的输出类型!

(1)正常输出

这种输出类型要求需要每两组输出数据中间没有额外的空行,即输出数据是连续的多行。

(2)每组数据输出之后都额外加一个空行

这种要求非常容易实现,只需要在每组输出结束之后额外输出一个换行符\n即可。

int main(){int a,b;while(scanf("%d%d",&a,&b) != EOF){printf("%d",a + b);printf("\n");}return 0;
}

(3)两组数据之间有一个空行,最后一组数据没有空行

这一般是在第三种输入类型while(T--)的情况下,只需要通过判断T是否已经减小到0来判断是否应该输出额外的换行。

int main(){int T,a,b;scanf("%d",&T);while(T--){scanf("%d%d",&a,&b);printf("%d",a + b);if(T > 0) printf("\n");}return 0;
}

与这种要求类似的要求是:输出一行N个整数,每两个整数之间用空格隔开,最后一个整数后面不允许加上空格。做法是类似的,如下面的代码所示:

for(int i = 0;i < N; i++){printf("%d",a[i]);if(i < N - 1) printf(" ");else printf("\n");
}

最后强调:

在多点测试中,每一次循环都要重置一下变量和数组,否则在下一组数据来临的时候,

变量和数组的状态就不是初始状态了。

将初始化的操作放在while( ) { } 内

而重置数组一般使用memset函数 或是 fill函数

练习算法之前必须了解的多件事相关推荐

  1. 她破解哈希函数算法:坚持10年做一件事一定能做成

    今年9月7日,2019未来科学大奖揭晓,这项设立4年的大奖迎来首位女性得主--密码学家王小云.在信息时代,金融服务.网络安全等背后都离不开密码系统的"护航".在大众眼中,密码带着神 ...

  2. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第36篇]Index Calculus算法

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 我们这篇博客继续描述一种数学攻 ...

  3. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第24篇]描述一个二进制m组的滑动窗口指数算法

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 二进制算法 二进制模幂算法和传 ...

  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第23篇]写一个实现蒙哥马利算法的C程序

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 这次博客我将通过对蒙哥马利算法 ...

  5. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第22篇]如何用蒙哥马利算法表示一个数字和多个相乘的数字

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 安全和效率 密码学的目标是设计 ...

  6. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第26篇]描述NAF标量乘法算法

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. [1] Hankerson, ...

  7. 重磅 | 李飞飞最新演讲:ImageNet后,我专注于这五件事——视觉理解、场景图,段落整合、视频分割及CLEVR数据集

    2017中国计算机大会(CNCC2017)于10月26日在福州海峡国际会展中心开幕,大会为期3天. 而就在今天上午,李飞飞.沈向洋.汤道生.马维英等重磅大咖纷纷登台演讲. 据悉,斯坦福大学人工智能实验 ...

  8. 构建神经网络前你需要先考虑这10件事

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前言 在阅读了一篇MNIST的教程(或10篇)并了解了一些Tens ...

  9. 对话高博(二)| 换工作这件事

    高博,1983年生,上海交通大学计算机科学与工程专业本科.软件工程硕士.现任博晓文化传媒集团总裁,香港卫视科教台台长.职场经历丰富,曾在数家世界500强IT和互联网企业打造明星团队.专业兴趣包括软件测 ...

最新文章

  1. AWS — AWS Snow 系列
  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY5-神经网络
  3. ubuntu下小键盘不能用
  4. 第5章 Python 数字图像处理(DIP) - 图像复原与重建14 - 逆滤波
  5. Java学习第1天:序言,基础及配置tomcat
  6. php扇形分布图,php生成扇形比例图的实例代码
  7. 网络工程师考试2005年上半年下午试题解析(二)
  8. Java从0开始之Java环境搭建
  9. linux查看 网卡信息
  10. Redis 通过mset提速查询
  11. 支持向量机:Duality
  12. python实现图片rgb通道分离
  13. TesterHome android app 编写历程(六)
  14. 码农:为什么说英语已经影响了我的命运
  15. 【其他】记录这次曲折的域名选择及搜索引擎seo优化的过程
  16. 云计算和大数据时代网络技术揭秘(十三)VXLAN
  17. 一些个人推荐的优秀博客
  18. 如何对图像进行卷积操作
  19. bootStrap输入框鼠标指针样式设定
  20. 新版白话空间统计(9):置信度的初探

热门文章

  1. Shell脚本:Linux下定时备份MySQL数据库
  2. 使用回调技术实现局部刷新
  3. 抓取网络源码python_使用Python进行网络抓取的新手指南
  4. 如何在Kubernetes上运行PostgreSQL
  5. 使用Linux创建自己的视频流服务器
  6. 汽车维护管理软件开源_感谢开源和自由软件维护者的10种方法
  7. linux 开源谷歌浏览器_开发人员浏览器,Google开源版本等
  8. godaddy ssl_免费在线Linux培训,GoDaddy切换到OpenStack等
  9. 属性 元素的内容 创建,插入和删除节点 虚拟节点
  10. Bootstrap3 带列表组的面板