该文档是关于CS537课程项目1的说明,主要介绍了一个名为MADCounter的程序,它用于统计文件中字符、单词和行的相关信息。文档包括项目截止日期、提交方式、注意事项等信息,还详细说明了MADCounter的功能、运行方式、错误处理等内容,并提供了一些提示和链接。
##
更新
- 我们将不会测试Ascii字符错误。您仍然应该只跟踪0 – 127的ASCII字符。
管理事项
- 截止日期:1月30日晚上11:59。
- 项目可以延迟最多3天提交,但每延迟一天将扣除10个百分点。
- 延期天数:
- 如果您需要在项目上额外的时间,每个人将有2天的个人项目延期天数和3天的小组项目延期天数(本学期总共5天延期天数)。在截止日期后,我们将为按时评分制作提交目录的副本。
- 要使用延期天数或延迟提交作业,您将提交文件时附带一个额外的文件,该文件仅包含一个数字,表示您的作业延迟的天数(例如1、2、3)。每连续一天,我们将制作任何包含这些slipdays.txt文件的目录的副本。在提交最终提交时,此文件必须存在,否则我们将不知道对您的代码进行评分。
- 我们将跟踪您在项目之间的延期天数和延迟提交情况,并在您用完延期天数后开始扣除百分比。
- 在用完延期天数后,如果延迟1天提交,您最多可以获得90%的分数,如果延迟2天提交,您可以获得80%的分数,如果延迟3天提交,您可以获得70%的分数,但对于任何单个作业,如果没有例外情况,我们不会在第三天后接受提交。这意味着如果您在单个作业上使用了两个个人延期天数,您只能再额外延迟一天提交,总共延迟3天,扣除10%。
- 任何例外情况都需要向教师请求。
- 示例slipdays.txt
1
- 问题:我们将使用Piazza回答所有问题。
- 开始前:阅读此实验教程;它包含了在C环境中编程的一些有用提示,包括使用makefiles、使用gdb调试器以及使用linux手册和信息系统。
- 协作:作业必须由您自己完成。复制代码(来自他人)被视为作弊。阅读此以获取更多关于什么是可以的和什么是不可以的信息。请不要这样做,帮助我们大家度过一个愉快的学期。
- 这个项目将在Linux实验室机器上完成,因此您可以在典型的基于UNIX的平台(Linux)上学习更多关于C编程的知识。您的解决方案将在这些机器上进行测试。
- 一些测试将在~cs537 – 1/tests/P1提供。通过在任何实验室机器上执行命令
cat ~cs537 - 1/tests/P1/README
,了解更多关于测试的信息,包括如何运行它们。请注意,这些测试用例并不完整,我们鼓励您自己创建更多的测试用例。 - 提交:将您的文件复制到~cs537 – 1/handin/login/P1,其中login是您的CS登录名。
Unix实用程序
在这个项目中,您将构建一个简单的用户级程序,很像各种UNIX命令行实用程序(例如man、zip、grep等)。您将实现一个工具,该工具将报告有关文件文本内容的一些各种统计信息(例如唯一字符的数量、字符的频率、单词的频率等)。我们将这个程序称为MADCounter.c(即Madison Counter)。
目标:
- 重新熟悉C编程语言,特别是:
- 处理字符串
- 读写文件
- 使用结构体
- 简单的动态内存分配
- 重新熟悉UNIX的shell/终端/命令行 虽然项目侧重于编写简单的C程序,但您可以从上面看到,即使这也需要一堆其他先前的知识,包括对shell是什么以及如何在一些基于UNIX的系统(例如Linux或macOS)上使用命令行的基本了解,当然还有对C编程的基本理解。如果您不已经具备这些技能,那么这里不是开始的正确地方。
总结要提交的内容:
-
一个.c文件:MADCounter.c。
-
每个文件在使用
-Wall
和-Werror
标志编译时应成功编译。 -
它们应该(希望)通过我们提供的测试。
-
包括一个单独的README.md,描述实现。该文件应包括您的姓名、您的cs登录名、您的wisc ID和电子邮件,以及您的实现状态。如果一切正常,就说正常。如果有您知道不起作用的东西,请告诉我。
-
如果适用,一个名为resources.txt的文件,描述使用的在线资源。欢迎您使用在线资源来帮助您完成作业。我们不建议您使用大型语言模型,如ChatGPT。对于本课程,我们已经看到这些工具给出了接近但不完全正确的示例或解释,这会让学生更加困惑,如果他们不知道正确答案是什么。请注意,当您向教学人员寻求帮助时,我们不会协助使用这些LLM,我们希望您能够向教学人员介绍您的代码和逻辑。在线资源(例如stack overflow)和生成工具正在改变包括计算机科学和教育在内的许多行业。但是,如果您使用在线资源,您需要提交一份文件,描述您对这些资源的使用。在该文件中表明您的解决方案中有多少是严格由您自己完成的,有多少是使用这些工具完成的。具体说明使用的资源和您与这些资源的交互方式。不给予外部资源信用是一种剽窃行为。在您的代码中使用该资源的地方对资源进行注释是一个好习惯。您不会因为使用LLM或阅读帖子而受到惩罚,但您不应该在在线论坛上发布关于本课程项目的帖子。您的大部分代码也应该由您自己努力编写,并且您应该能够解释您提交的所有代码。
MADCounter
程序MADCounter.c是一个命令行文本工具,它从输入文件中收集有关字符、单词和文件行的统计信息,并将这些统计信息打印到命令行或输出文件中。您的工具还应该接受一个批处理文件,其中包含一系列统计请求,每个请求对不同的文本文件进行操作。
单次运行
让我们首先讨论这个实用程序的单次运行,从一个示例开始。 $ __welcome.txt__包含:
Welcome to CS537! We are looking forward to having a wonderful semester.
prompt>./MADCounter -f welcome.txt -o output.txt -c -w -l -Lw -Ll
prompt> cat output.txt
Total Number of Chars = 73
Total Unique Chars = 29
Ascii Value: 10, Char:
, Count: 1, Initial Position: 72
Ascii Value: 32, Char: , Count: 11, Initial Position: 7
Ascii Value: 33, Char:!, Count: 1, Initial Position: 16
Ascii Value: 46, Char:., Count: 1, Initial Position: 71
Ascii Value: 51, Char: 3, Count: 1, Initial Position: 14
Ascii Value: 53, Char: 5, Count: 1, Initial Position: 13
Ascii Value: 55, Char: 7, Count: 1, Initial Position: 15
Ascii Value: 67, Char: C, Count: 1, Initial Position: 11
Ascii Value: 83, Char: S, Count: 1, Initial Position: 12
Ascii Value: 87, Char: W, Count: 2, Initial Position: 0
Ascii Value: 97, Char: a, Count: 4, Initial Position: 21
Ascii Value: 99, Char: c, Count: 1, Initial Position: 3
Ascii Value: 100, Char: d, Count: 2, Initial Position: 39
Ascii Value: 101, Char: e, Count: 8, Initial Position: 1
Ascii Value: 102, Char: f, Count: 2, Initial Position: 33
Ascii Value: 103, Char: g, Count: 2, Initial Position: 31
Ascii Value: 104, Char: h, Count: 1, Initial Position: 44
Ascii Value: 105, Char: i, Count: 2, Initial Position: 29
Ascii Value: 107, Char: k, Count: 1, Initial Position: 28
Ascii Value: 108, Char: l, Count: 3, Initial Position: 2
Ascii Value: 109, Char: m, Count: 2, Initial Position: 5
Ascii Value: 110, Char: n, Count: 3, Initial Position: 30
Ascii Value: 111, Char: o, Count: 7, Initial Position: 4
Ascii Value: 114, Char: r, Count: 5, Initial Position: 22
Ascii Value: 115, Char: s, Count: 2, Initial Position: 63
Ascii Value: 116, Char: t, Count: 3, Initial Position: 8
Ascii Value: 117, Char: u, Count: 1, Initial Position: 60
Ascii Value: 118, Char: v, Count: 1, Initial Position: 46
Ascii Value: 119, Char: w, Count: 2, Initial Position: 36
Total Number of Words: 12
Total Unique Words: 11
Word: CS537!, Freq: 1, Initial Position: 2
Word: We, Freq: 1, Initial Position: 3
Word: Welcome, Freq: 1, Initial Position: 0
Word: a, Freq: 1, Initial Position: 9
Word: are, Freq: 1, Initial Position: 4
Word: forward, Freq: 1, Initial Position: 6
Word: having, Freq: 1, Initial Position: 8
Word: looking, Freq: 1, Initial Position: 5
Word: semester., Freq: 1, Initial Position: 11
Word: to, Freq: 2, Initial Position: 1
Word: wonderful, Freq: 1, Initial Position: 10
Total Number of Lines: 1
Total Unique Lines: 1
Line: Welcome to CS537! We are looking forward to having a wonderful semester., Freq: 1, Initial Position: 0
Longest Word is 9 characters long:
semester.
wonderful
Longest Line is 72 characters long:
Welcome to CS537! We are looking forward to having a wonderful semester.
我们将在下面描述每个标志,但现在完整的可能用法是:
./MADCounter -f <输入文件> -o <输出文件> -c -w -l -Lw -Ll
或
./MADCounter -B <批处理文件>
有关这些细节的批处理模式部分,请参阅下面,但让我们先讨论标志。
-
-f:此标志放在我们正在分析的文件名称之前。
-
-o:此标志用于指定输出文件。如果未指定此标志,则所有输出应转到stdout。
统计标志:这些将确定您应该进行哪种分析。您将按照这些标志出现的顺序打印输出。我们希望输出始终按照Ascii字母顺序排序。当打印多个统计信息时,在统计信息输出之间打印一个额外的换行符。
- -c:此标志意味着您应该跟踪每个Ascii字符0 – 127。您应该跟踪每个字符的使用次数以及字符出现的初始零基位置。您还应该跟踪字符的总数和唯一字符的数量。当您打印输出时,它应该采用以下格式,每个字符一行,并且应该只包括您在文档中实际遇到的字符。
Total Number of Chars = <字符数量>
Total Unique Chars = <唯一字符数量>
Ascii Value: <ascii整数>, Char: <字符>, Count: <频率>, Initial Position: <零基初始位置>\n
- -w:此标志意味着您应该跟踪每个由空格分隔的字符串。您应该跟踪每个字符串的使用次数以及字符串出现的初始零基位置。这将是字符串位置,而不是字符位置。您还应该跟踪单词的总数和唯一单词的数量。当您打印输出时,对于每个字符串,它应该采用以下格式。
Total Number of Words: <单词数量>
Total Unique Words: <唯一单词数量>
Word: <字符串>, Freq: <频率整数>, Initial Position: <位置整数>\n
- -l:此标志意味着您应该跟踪每个换行分隔的行。您应该跟踪每行的使用次数以及行出现的初始零基位置。这将是第一次出现该行的行号,而不是字符位置。您还应该跟踪行数和唯一行的数量。当您打印输出时,它应该采用以下格式,每行一个字符串。当您打印行时,您应该删除任何尾随的换行符。
Total Number of Lines: <行数>
Total Unique Lines: <唯一行数量>
Line: <行>, Freq: <频率>, Initial Position: <位置>\n
- -Lw:此标志意味着您应该跟踪最长的单词(多个)以及字符串的长度。您将以以下格式打印输出。如果有多个单词具有相同的长度,则按Ascii字母顺序排序打印它们。
Longest Word is <长度> characters long:\n
\t<单词1>\n
\t<单词2>\n
...
- -Ll:此标志意味着您应该跟踪最长的行(多个)以及行的字符长度。您将以以下格式打印输出。如果有多个行具有相同的长度,则按Ascii字母顺序排序打印它们。
Longest Line is <长度> characters long:\n
\t<行1>\n
\t<行2>\n
...
批处理模式
您的实用程序的一种模式应该接受一个文件,其中包含不同文本分析请求的列表。每个请求将在自己的行上,并采用与上面单次运行相同的形式,除了可执行名称。 $batch.txt
-f welcome.txt -o output.txt -c -w -l -Lw -Ll
-f hollow.txt -o output.txt -c -w -l -Lw -Ll
-f welcome.txt -o output.txt -l -w -c
-f movies.txt -o output.txt -c
-f welcome.txt -o output.txt -Lw -Ll
这些命令都受下面指定的错误的约束。如果您在其中一个命令中遇到错误,您应该打印错误消息,然后继续处理下一个命令,而不是完全退出。
错误
本节描述了我们希望您处理的错误类型以及处理错误的顺序。任何不在此列表中的错误,我们不期望您处理。除非另有说明,否则您的程序在遇到所有错误情况时应立即退出并返回代码1。在成功时,您的程序应使用返回代码0。所有错误消息应打印到STDOUT,并在末尾添加换行符。提示:为了正确获取错误消息的顺序,请在进行分析之前处理所有参数。
- 用法错误 – 当提供的参数少于3个时打印。
- “USAGE:/MADCounter -f <输入文件> -o <输出文件> -c -w -l -Lw -Ll/MADCounter -B <批处理文件>”
USAGE: ./MADCounter -f <输入文件> -o <输出文件> -c -w -l -Lw -Ll OR ./MADCounter -B <批处理文件>
- 无效标志 – 所有标志都应以-开头,并且只有标志应以此开头。如果有一个标志我们在本文档的其他地方未指定,则打印此错误。
- “ERROR: Invalid Flag Types”
ERROR: Invalid Flag Types
- 无法打开批处理文件 – 如果打开批处理文件时出错。
- “ERROR: Can’t open batch file”
ERROR: Can't open batch file
- 批处理文件为空 – 如果批处理文件中没有内容。
- “ERROR: Batch File Empty”
ERROR: Batch File Empty
- 未提供输入文件 – 如果未指定-f标志或-f标志后立即跟有另一个标志。
- “ERROR: No Input File Provided”
ERROR: No Input File Provided
- 无法打开输入文件 – 如果打开输入文件时出错。
- “ERROR: Can’t open input file”
ERROR: Can't open input file
- 未提供输出文件 – 如果指定了-o标志但其后立即跟有另一个标志。
- “ERROR: No Output File Provided”
ERROR: No Output File Provided
- 输入文件为空 – 如果