文档详情

ACM竞赛备战资料精选ACMICPC校内赛讲座一些初学者必须要知道的问题.ppt

发布:2017-12-11约5.42千字共32页下载文档
文本预览下载声明
2007 UESTC ACM/ICPC校内赛讲座 一些初学者必须要知道的问题 刘歆 a.k.a. liux0229, Tom Riddle liux0229@ 该ppt可从数学学院网站 下载,无需做记录 1.如何用C/C++处理输入输出 2.复杂度和程序优化 3.初学者如何进行修炼 1.如何用C/C++进行输入输出 相对次要的问题,但成为很多初学者的拦路虎 C/C++(尤其是C)输入输出方法较复杂,需要一定时间实践才能精通 我的任务:通过实例提供处理各种输入输出任务的方法,并讲解一些原则性的问题,同学们可以举一反三 首先,几个基本概念 什么是标准输入、标准输出? 标准输入(stdin):键盘(scanf, cin) 标准输出(stdout):屏幕(printf, cout) 建议程序中只使用stdin和stdout 要打开文件怎么办? freopen(“input.txt”, “r”, stdin); freopen(“output.txt”, “w”, stdout); ACM/ICPC中基本上都是要求从键盘输入,屏幕输出 是人工评测? 否,测试前程序被做了重定向,就向上面一样,只不过重定向是外部的 比如,Linux Shell下 $ ./prog input output $ diff output answer 所以,严格按照题目描述来进行输入输出,不要打印任何题目未做要求的信息 ACM/ICPC的输入输出特点:流式、ASCII 顺序输入、输出,避免使用文件定位函数(如:fseek) 不需要把所有的输出放在一处进行,随时都可以输出,只要顺序是对的,因为只有当你的程序终止了,与正确答案的比较才会开始 字符格式,12345是5个字符‘1’,’2’,’3’,’4’,’5’构成 所以,C中只能使用处理ACSII文件的输入输出函数(getchar,putchar,scanf,printf,gets,fgets,puts) 使用C++进行输入输出 cin,cout 优点 数据类型自识别,使用简单 缺点 速度慢! ACM/ICPC的测试数据规模非常大,cin/cout在这种情况下会成为性能瓶颈,引发超时 除非输入规模小,否则不推荐使用cin! 输出规模相对较小,在某些情况下使用cout会很方便,但是cout控制输出格式不如printf灵活 一个重要的误区 不要在一个程序中同时使用cin和C输入函数(如:scanf) 也不要同时使用cout和C输出函数(如:printf) 但是,可以C输入函数和cout搭配使用,反之亦然 违反以上原则可能导致输入/输出结果错误(会发生乱序)! 推荐使用C函数进行输入输出 输出:printf(putchar,puts),其用法请查阅相关书籍,比较简单,不做重点讲解 每一行输出完后要打印回车’\n’,包括最后一行 输入:scanf, fgets(gets), getchar scanf 输入格式 %d %lld %c %s %lf 对每种格式搞清楚一个重要问题 是否自动跳过前导空白? 什么是空白:空格,TAB,回车 %d %lld %lf自动扫描前导空格 比如:读入5个整数到A[5] 输入文件中,数的排布是这个样子 35 26 78 99 206 不管它,直接5次%d for ( int i = 0; i 5; i++ ) scanf(“%d”, A + i); %lld用于输入和输出长整数(long long,64位) %lf用于输入输出double %s 读一个字符串,自动扫描前导空白,读到空白结束 如: abcd efgh,将读出”abcd” %c读一个字符,但是不扫描前导空白 如何读一个非空白字符呢? 比如,读取某人的信息,其性别用M/F表示 Nathan M Flying Claire F Self-healing 名字和能力用%s读,性别怎么办,自己扫描空格?麻烦! 读一个非空白字符,方法一 char str[2]; scanf(“%1s”, str); // %s扫描前导空白,并且只读一个字符 char c = str[0]; 方法二 强制扫描空白 在%前面加上一个空格表示“强制扫描前导空白” scanf(“ %c”, ch); 前面那个读人物信息的完整scanf语句: scanf(“%s %c %s”, name, gender, ability); 同理,格式后面加一空格表示“读完这个变量后扫描空白”,注意空白是包括回车的 读一行:gets, fgets gets会导致很讨厌的warning message,所以可改用fgets fgets(str, sizeof str, stdin
显示全部
相似文档