主页 讨论版 问题 名次 状态 统计
从http://acm.hnust.edu.cn/web登录可查看比赛的OI排名分。

Contest1500 - 【18周】17级网络工程3班与信息安全3班 实验23 命令行参数、文件

 - 本次实验题目参考了陈燕晖老师的课件,部分图片参考了李艳军老师的课件,在此向两位老师表示感谢!


实验23-1 命令行参数实验(必做)

任务命令行参数程序体验(Linux)

     请自行体验并比较以下两个程序的运行方法。

    【源代码】“Unix-head”版本1:https://paste.ubuntu.com/26243412/ 

    【源代码】“Unix-head”版本2:https://paste.ubuntu.com/26243429/ 

命令行参数程序运行方法(控制台方法必做)

    ○ VC / VS:在工程属性页里有对应位置,在此位置输入argv[1]以后的参数保存、运行即可。



    ○ CB:Project-Set program's arguments-Select your current target-Program arguments


    ○ Windows CMD 控制台:进入exe程序的所在位置,随后输入程序名称及后续参数(空格区分),回车即可运行。

    E:\...\Head\Debug> head.exe -5

    提示:更改盘符,如从C盘转成E盘,输入“E:”即可。

    ○ Linux Shell 控制台:进入目标程序的所在位置,输入“./程序名称”及后续参数(空格区分),回车即可运行。

xxxxx $ ./head -5

        提示:如果没有“./”,则会认为是一个系统命令。

        补充:控制台里有许多系统命令,比如XXX命令在Windows中可以通过“XXX /?”查看该命令的使用方法,在Linux中可以通过“help XXX”以查看。


    

任务2A 简单的Echo显示程序

     echo是Unix/Linux系统的一个命令,显示命令中用空格分隔的命令行参数。

    如有命令 echo hello, world  

      (例子为通用格式,即配置好环境变量后的使用格式,如省略了linux的“./”,也省略了Windows格式的“.exe”,下同)

    则输出   hello, world


任务2B 简单的Plus计算程序(二选一)

    请设计一个命令“plus”,随后的命令行参数不限,但确保是整数(PS:不见得数字只有一位,要不然谁会用……),计算这些整数的和并输出。

    如有命令 plus 1 2 3 4 -5

    则输出   sum: 5

    如有命令 plus 

    则输出   sum: 0



实验23-2 文件读写实验(必做)

任务文本文件存储ex

     本程序要求将ex的结果写入文件file.dat(路径自选)中,再从文件中读出数据,显示到屏幕上。其中x从1.0到3.9,步长0.1。

    要求用fprintf写入文件,用fscanf从文件读入。



任务给文件各行添加行号

     本程序要求打开示例文件fgets.c(路径自选),将文件代码每一行加上行号和冒号(如“1:”)后输出到屏幕中。确保文件代码每行字符数不超过80。

    要求用fgets从文件读入。(不必考虑冒号是否对齐)



任务5 二进制文件存储ex

    本程序要求将ex的结果写入二进制文件binfile.dat(路径自选)中再从文件中读出数据,显示到屏幕上其中x从1.0到3.9,步长0.1。

    要求用fwrite写入文件,用fread从文件读入。

    【注】由于是二进制存储,所以直接打开看到的是一些乱码。



任务随机访问生成的二进制ex

    本程序要求访问【任务5】实现的二进制文件binfile.dat中的第“15、1、10、30、2”个元素(顺序不能颠倒,位置从1开始计),并输出,保留3位小数。

    要求在5次循环内用fseek实现定位,用fread读入。

 


任务7 输入输出重定向

    在OJ中增加新题目时,常常要写出标程,而在发布题目之前也需要在本地对自己的标程进行测试(即跑一遍自己生成的测试数据)。有时候打比赛的时候,自己也可能会生成若干数据,存到文件里,以方便自己的测试。

    数据一多,手工复制粘贴会显得有些麻烦,并且如果输入和输出的格式很接近的话,辨别哪一行是输入哪一行是输出都是问题。因此,“输入输出重定向”是再好不过的了。

    这种方法是通过freopen()函数实现,具体实现如下(建议写到主函数里面,第一个scanf和printf之前):

freopen("E:\\1.in", "r", stdin);

freopen("E:\\1.out", "w", stdout);

    本质上是将“标准输入”stdin从“键盘”重定向至“1.in”文件,而将“标准输出”stdout从“键盘”重定向至“1.out”文件。

    请简单测试这种写法。

    当然,在OJ中提交时,就不能有这两句话了,否则会出现“运行错误”(RE)。

    一种可行的方法是将其“注释掉”,但来回地加减操作会显得比较麻烦。

    另一个通用的方法就是使用“条件宏”一些OJ在测试时会有#define ONLINE_JUDGE的宏定义,而本地并没有。因此我们可以通过检测是否存在“ONLINE_JUDGE”这个宏来判断是从自己文件路径的文件读入,还是别的。

#ifndef ONLINE_JUDGE

    freopen(......);

    freopen(......);

#endif              

    请也简单测试这种写法(在电脑里运行与在OJ里提交比较,题目自选)。


实验23-3 综合实验(课后)

任务8 简单的Cat命令程序

        cat是Unix系统的常用命令,可以把多个文件内容连接输出到stdout。若未指定文件,则输入来自stdin。

    命令示例 cat file1 file2 file3

    【提示】编写函数“void filecopy(FILE *ifp, FILE *ofp);”,ifp指向的文件内容复制到ofp指向的文件中,调用方法:“filecopy(fp, stdout);”。

任务8结果图


任务9 简单的.out文件比较程序

    OJ的判题方法如下(目前只考虑AC和WA):运行你的程序(如“user.c”),将输入/输出重定向(任务7)到两个文件(如“test.in”和“user.out)。将运行后得到的输出文件(“user.out”)与已经有了的标准输出文件(如“test.out”)去比较,如果完全相同,则表示你的题目正确;反之则表示你的题目错误。

    现在请你完成这个比较程序compare,两个文件分别用argv[1]和argv[2]表示。如果比较成功,则输出“Accept!”;否则输出“Wrong Answer at Line XXX!”。

    命令示例 compare 1.out 2.out

    输出A    Accept!

    输出B    Wrong Answer at Line 152!

 

任务10 文件ASCII码查看工具

    编写程序display,实现对argv[1]所表示文件的ASCII码和对应字符的显示。要求所有的非空格whitespace(包括\n、\t)显示为“.”,且每行显示的个数由argv[2]决定(只考虑4~20即可),如果argv[2]为空,则默认显示16个。

    命令示例 display example.c 16

    输出     000000: 2f 2a 65 78 61 6d 70 6c 65 2e 63 2a 2f 0a 23 69  /*example.c*/.#i

             000010: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e  nclude <stdio.h>

             000020: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69  .#include <stdli

             000030: 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  b.h>.#include <c

             000040: 6f 6e 69 6f 2e 68 3e 0a 6d 61 69 6e 28 69 6e 74  onio.h>.main(int

             000050: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 61 72 67   argc, char *arg

             000060: 76 5b 5d 29 0a 7b 0a 09 63 68 61 72 20 6c 65 74  v[]),{..char let

             000070: 74 65 72 5b 31 37 5d 3b 0a 09 69 6e 74 20 63 2c  ter[17];..int c,

             000080: 69 2c 63 6f 75 6e 74 3b 0a 09 46 49 4c 45 20 2a  i,count;..FILE *

             000090: 66 70 3b 0a 09 66 72 65 6f 70 65 6e 28 22 64 3a  fp;..freopen("%d:

             0000a0: 5c 5c 64 2e 6f 75 74 22 2c 22 77 22 2c 73 74 64  \d.out","w",std

             0000b0: 6f 75 74 29 3b 0a 09 69 66 28 61 72 67 63 3c 32  out);..if(argc<2

             0000c0: 29 0a 09 7b 0a 09 09 70 72 69 6e 74 66 28 22 55  )..{...printf("u

             ......

    【注】为了显示对齐,我在输入前面加了若干空格,实现时不必添加前面的空格,直接从每行第一个字符开始输出即可


实验23-X LinuxC语言程序的编写(选做)

任务XSimple A+B

本次任务目的在于体验 Linux 中 C 语言程序的编译与运行。

【题目描述】只有1组输入,每组输入两个整数A和B,输出A+B,不必考虑溢出的情况。

Step 1: 在主文件夹中新建一个文件,命名为“hello.c”。

Step 2: 双击此文件,输入合适的代码,之后按“Ctrl+S”保存。

Step 3: 打开Shell,快捷键“Ctrl+Alt+T”,使得路径显示为我们C程序所在的文件夹。

Step 4: 编译C程序,直至目标程序生成。注意:Linux的可运行程序不带后缀。

Step 5: 运行该程序。


任务X2  GDB调试体验

    请根据以下说明,自行体验 gdb 调试程序的方法。




Start Time: 2017-01-02 08:00:00 End Time: 2018-09-07 12:00:00
Current Time: 2019-02-19 22:03:44 Status:Ended   Public
[Status] [Standing] [Statistics]
题目编号 标题 来源 正确 提交