【问题标题】:C Programming Occurrences of an Integers in an Text File文本文件中出现整数的 C 语言编程
【发布时间】:2019-12-08 03:00:18
【问题描述】:

问题:编写一个程序,读取范围内的所有整数 0 到 100,包括来自名为:a.txt 的输入文件,并计算如何 每个在文件中都出现了很多次。输入完所有内容后 处理后,显示所有出现次数的值 在输入文件中。

注意:程序会忽略任何小于 0 或大于 100 的数字。 注意:如果文件中没有数字,则不要显示零。提示:一个 大小为 101 的数组就足够了。文件中的一个数字起到作用 索引。

例如:假设文件内容:a.txt如下:

99 2 99 
3 
-12 80 12 33 
3 99 100 1234 84

显示输出为:

2 has occurred: 1 times,
3 has occurred: 2 times,
12 has occurred: 1 times,
33 has occurred: 1 times,
80 has occurred: 1 times,
84 has occurred: 1 times,
99 has occurred: 3 times,
100 has occurred: 1 times

这是我现在拥有的代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
    FILE *inFile;
    int count = 1, num[101];

    inFile = fopen("a.txt", "r");
    for(int i = 1; i <= 100; i++) {
        fscanf(inFile, "%d", &num[i]);
    }

    for(int i = 1; i <= 100; i++){
        if(num[i] == i) {
            printf("%i has occurred: %d times\n", i, count);
            count++;
        }
    }

    fclose(inFile);
}

输出: 2 已发生:1 次

您好,我正在尝试为周日午夜到期的 C 编程课程做这项作业,但我在尝试打印数组中的所有数字及其出现时遇到了麻烦。在我的代码中,我首先声明 int count 以增加出现次数,如果在文本文件中多次找到该数字并创建一个大小为 101 的数组。然后,我使用 for 循环读取文本文件并存储所有将 1-100 的数字放入数组中。第二个 for 循环,后跟一个 if 语句,用于比较数组中的数字。即使这是一个测试程序,我们也应该能够对所有数据值执行此操作。希望这是一个足够好的解释,谢谢。

【问题讨论】:

  • 您的逻辑似乎有误。数组 num[101] 应该存储每个元素的计数,其中数组由从 0 到 100 的每个数字索引
  • 您需要使用第一个 for 循环中的 i 来了解 num 数组中有多少条目。您还从 1 而不是 0 开始为 num 设置索引。

标签: c arrays


【解决方案1】:

你很接近。

您不想将每个值读入num,而是想使用num 数组来保存文件中看到的每个数字的计数。

int main() {
    FILE* inFile;
    int value = 0;
    int result = 0;
    int num[101] = { 0 }; // zero-init this array

    inFile = fopen("a.txt", "r");

    if (inFile == NULL) {
        printf("unable to open file\n");
        return -1;
    }

    result = fscanf(inFile, "%d", &value);
    while (result == 1) {

        printf("Just read: %d\n", value);

        if ((value >= 0) && (value <= 100)) {
            num[value] = num[value] + 1;  // num[value]++
        }
        result = fscanf(inFile, "%d", &value);
    }

    for (int i = 0; i <= 100; i++) {
        if (num[i] > 0) {
            printf("%i has occurred: %d times\n", i, num[i]);
        }
    }

    fclose(inFile);
}

【讨论】:

  • while 循环@selbie 中似乎有一个无限循环。另外,如果我错了,请纠正我,但是while循环基本上会增加文本文件中的出现次数吗?
  • 除了我犯的错字(并且刚刚更正)之外,程序将一直运行,直到到达inFile 的文件结束条件。
  • 嗯...如果与while (result != EOF) 发生匹配失败,会发生什么?该循环可能会持续很长时间,并且您的屏幕可能会填满"Just read: &lt;some strange value&gt;",因为尝试在无限循环中读取违规字符。建议while (result == 1) {...}
【解决方案2】:

除了@selbie 的好答案,从我对您之前的问题How do I get the counter to work... 的回答中,您可以在此处应用相同的原则来填充 频率数组。在这种情况下,您只需将 n 用作 index 而不是计数器。

例如,如果您的索引 n 和您的数组 num 声明(并初始化全部为零),您只需读取文件中的所有整数并检查值 n 是否为在0 &lt;= n &lt;= 100 之间,如果是这样,将num 数组中索引n 处的值更新一,例如num[n]++;。你可以这样做:

    int n = 0;              /* index */
    int num[NELEM] = {0};   /* array */
    ...
    while (fscanf(myFile, "%d", &n) == 1)   /* read each int */
        if (0 <= n && n <= 100)             /* if 0 <= n <= 100 */
            num[n]++;                       /* increment value at index */

然后对于您的输出,您只需对num[0] 进行特殊检查以确定是否输出该索引,然后从1-NELEM 循环输出每个值的出现频率,例如

    if (num[0])     /* check if 0 found, output if so */
        printf ("num[%3d] occurred %3d times\n", 0, num[0]);

    for (int i = 1; i < NELEM; i++) /* output counts for 1-100 */
        printf ("num[%3d] occurred %3d times\n", i, num[i]);

完整的例子可以是:

#include <stdio.h>

#define NELEM 101   /* if you need a constant, #define one (or more) */

int main(int argc, char **argv) {

    int n = 0;              /* index */
    int num[NELEM] = {0};   /* array */
    /* read filename from 1st argument (stdin by default) */
    FILE *myFile = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!myFile) {  /* validate myfile is open for reading */
        perror ("fopen-myfile");
        return 1;
    }

    while (fscanf(myFile, "%d", &n) == 1)   /* read each int */
        if (0 <= n && n <= 100)             /* if 0 <= n <= 100 */
            num[n]++;                       /* increment value at index */

    if (myFile != stdin)        /* close file if not stdin */
        fclose (myFile);

    if (num[0])     /* check if 0 found, output if so */
        printf ("num[%3d] occurred %3d times\n", 0, num[0]);

    for (int i = 1; i < NELEM; i++) /* output counts for 1-100 */
        printf ("num[%3d] occurred %3d times\n", i, num[i]);
}

使用/输出示例

在一个文件中有 500 个随机整数,您会得到类似于以下内容的输出:

$ ./bin/fscanffreq dat/500_rand_0-100.txt
num[  0] occurred   3 times
num[  1] occurred   8 times
num[  2] occurred   7 times
num[  3] occurred   2 times
num[  4] occurred   1 times
num[  5] occurred   4 times
num[  6] occurred   3 times
num[  7] occurred   5 times
num[  8] occurred   6 times
num[  9] occurred   4 times
num[ 10] occurred   6 times
...
num[ 95] occurred   6 times
num[ 96] occurred   4 times
num[ 97] occurred   6 times
num[ 98] occurred   2 times
num[ 99] occurred   5 times
num[100] occurred   6 times

注意:如果num[0]0,则不会显示)

检查一下,如果您还有其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多