创建一个包含输入文件中出现次数的数组(C)

时间:2016-07-13 05:52:55

标签: c arrays function

我一直在不知疲倦地完成这项任务,它已经过期了,我不能为我的生活找到解决方案。我们落后于讲座,教授仍然认为我们可以做我们还没有完成的家庭作业。

所以这是我遇到问题的主要功能。目标是读取一个完整的输入文件:

12 15 7 1 19
18 16 15 2 8 
5 4 16 7 1 
19 4 16 15 3 
13 9 12 4 6 
9 2 19 13 15 
18 20 17 17 4 
3 12 2 18 18 
10 14 1 14 1 
7 10 18 17 18  30

在读取文件后,假设将每个值的出现输入到数组中。所以在索引1中,会有很多1。索引2,然后会有很多2,依此类推,直到20.索引0将保存文件包含的整数总数。循环继续扫描,直到达到整数30.

我设置为999的长度因为文件永远不会相同,所以它会是随机的,你永远不会知道它的长度。因此,一旦计算到30,我会使用'amount'作为计数器,然后将长度初始化为相等的数量。

对于更多教学,这是教授给出的具体指导功能的一部分:

  

createVArray:这是一个void函数,它接受三个参数:一个FILE *和一个整数数组以及一个表示数组长度的整数。您的函数应使用收集的信息一次一个地读取文件中的数字以更新阵列。数组的第一个索引将用于存储读取的总票数,而每个后续索引将存储该T恤徽标选项的投票数。您的函数应该继续读取文件,直到遇到数字30.

int array2[999], array[21]; //Global dec

void createVArray(int amount, int length){
int counter, i, j, m;
length = 999;
amount = 0;

for(counter = 1; counter < length; counter++){
    fscanf(votesFileptr, "%d", &array[counter]);

            if(array[counter] == 30){
                for (i = 1, j = 0; i < amount, j < amount; i++, j++){
                    array2[j] = array[i];
                }
                break;
            }
            for(m = 0; m < length; m++){
                if (array[m] > 0){
                    printf("Occurs %d\n", array[m]);
                }
            }
    amount++;
}

length = amount;
array[0] = amount;
for(i = 0; i < 21; i++){
    printf("%d\n", array[i]);
}
}

3 个答案:

答案 0 :(得分:1)

让我们开始简单

  

createVArray:这是一个带有三个参数的void函数:一个FILE *和一个整数数组以及一个表示数组长度的整数

void createVArray(FILE* input, int counts[], const int length )
  

您的函数应使用收集的信息一次一个地读取文件中的数字

fscanf(input, "%i", &number)
  

数组的第一个索引将用于存储读取的总票数,而每个后续索引将存储该T恤徽标选项的投票数

++counts[0];
++counts[numbers];
  

您的功能应该继续读取文件,直到遇到数字

if( number == 30 ) return; // or break if you want to

来自一些循环的公寓,额外的测试和检查你应该已经有了编写你的功能的部分

如果你真的很绝望:http://pastebin.com/bfNTKVHq

奖金:https://godbolt.org/g/F9GYI0

答案 1 :(得分:0)

我很无聊。根据你发布的规范,我认为你的教授想要这样的东西:

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
void createVArray(FILE * fin, int *a, int len){
    int i;
    assert(len>29);
    while(1){
    if(fscanf(fin,"%d",&i) !=1){
        perror("fscanf error");
        exit(1);
    }
    if(i>=30)
        return;
    a[0]+=1;
    a[i]+=1;
    }
}


int main(){
    int a[30];
    memset(a,0,sizeof(a));
    FILE *fin=fopen("test.txt","r");
    createVArray(fin,a,30);
    for(int i=0; i<30; ++i){
        printf("a[%d]=%d\n",i,a[i]);
    }
    return 0;
}

的test.txt:

  

12 15 7 1 19 18 16 15 2 8 5 4 16 7 1 19 4 16 15 3 13 9 12 4 6 9 2   19 13 15 18 20 17 17 4 3 12 2 18 18 10 14 1 14 1 7 10 18 17 18 30

输出:

a[0]=50
a[1]=4
a[2]=3
a[3]=2
a[4]=4
a[5]=1
a[6]=1
a[7]=3
a[8]=1
a[9]=2
a[10]=2
a[11]=0
a[12]=3
a[13]=2
a[14]=2
a[15]=4
a[16]=3
a[17]=3
a[18]=6
a[19]=3
a[20]=1
a[21]=0
a[22]=0
a[23]=0
a[24]=0
a[25]=0
a[26]=0
a[27]=0
a[28]=0
a[29]=0

答案 2 :(得分:0)

该问题提出了计算范围内出现次数的典型问题。每当出现此类型问题时,您将捕获数组中出现的次数,该数组中的每个数字至少包含一个元素。 (在您的情况下+1,因为您将总票数存储在第一个元素中。

接下来的部分是循环遍历所有值,读取表示为相应T恤设计投票的1-20之间的所有值。因此,如果您阅读13,则需要增加array[13]以注意已为T恤13设计录制了一票。由于您正在读取数组范围内的数字,所以您需要做的就是确保从一个初始化为所有0的数组开始。读取每个数字时,只需将该索引处的值递增1即可。例如你看了12来增加t恤12的投票数量,它只是array[12]++;(或者你可以array[12] = array[12] + 1;array[12] += 1;,他们都做同样的事情)

在此期间,您还要保留所有投票的总计,因此每次您阅读文件中的有效投票时,只需执行total++;(或total = total + 1;total += 1;

把它放在一起,你可以做类似以下的事情,例如

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

#define ARSZ 21   /* array size 0-total, 1-20 shirt votes */

void createVArray (int *a, int n, FILE *fp);

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

    int array[ARSZ] = {0};
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open for reading */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    createVArray (array, ARSZ, fp);   /* read values from fp */

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

    printf ("\n '%d' votes recorded.\n\n", *array);
    for (int i = 1; i < ARSZ; i++)
        printf ("  tshirt[%2d] : %2d\n", i, array[i]);

    return 0;
}

/* read integer values from 'fp' incrementing values in range `array`
 * for each value read and returning the total values considered in
 * array[0].
 */
void createVArray (int *a, int n, FILE *fp)
{
    if (!a || !fp) {    /* validate array and FILE stream */
        fprintf (stderr, "error: invalid parameter in list.\n");
        return;
    }
    if (!n) { *a = 0; return; } /* validate length */
    int tmp = 0, total = 0;     /* read into tmp, increment total */

    while (fscanf (fp, " %d", &tmp) == 1) {  /* validate int read */
        if (tmp == 30) break;                /* if 30, bail       */
        if (0 < tmp && tmp <= 20)            /* if vote increment */
            total++, a[tmp]++;       /* total and value at a[tmp] */
    }
    a[0] = total;        /* set first element to hold total votes */
}

输入文件

$ cat dat/votes.dat
12 15 7 1 19
18 16 15 2 8
5 4 16 7 1
19 4 16 15 3
13 9 12 4 6
9 2 19 13 15
18 20 17 17 4
3 12 2 18 18
10 14 1 14 1
7 10 18 17 18  30

示例使用/输出

$ ./bin/tshirtvote <dat/votes.dat

 '50' votes recorded.

  tshirt[ 1] :  4
  tshirt[ 2] :  3
  tshirt[ 3] :  2
  tshirt[ 4] :  4
  tshirt[ 5] :  1
  tshirt[ 6] :  1
  tshirt[ 7] :  3
  tshirt[ 8] :  1
  tshirt[ 9] :  2
  tshirt[10] :  2
  tshirt[11] :  0
  tshirt[12] :  3
  tshirt[13] :  2
  tshirt[14] :  2
  tshirt[15] :  4
  tshirt[16] :  3
  tshirt[17] :  3
  tshirt[18] :  6
  tshirt[19] :  3
  tshirt[20] :  1

很容易看到,T恤设计186投票中50票的最大赢家。