从C

时间:2016-06-14 06:21:29

标签: c arrays

我应该提一下,在人们对答案过于疯狂之前,我已经进入编程课程的前两周了。

以此数组为例,

int scores[30] = {90,85,100,50,50,85,60,70,55,55,80,95,70,60,95,
  80,100,75,70,95,90,90,70,95,50,65,85,95,100,65}

我正在尝试解析它以创建2个新的并行数组以便稍后使用。我们的想法是制作一个包含“得分”的数组和一个包含每个得分“出现次数”的数组。我最终编译没有错误,但在运行时崩溃。

void frequency(int scores[], int max){
    int i, x=0, temp=0, count=0, sum=0, mode=0;
    int score[sum]; //unknown length of array, sum gets added after the while loop
    int freq[sum];
    printf("score\tfrequency\n");
    printf("-----\t---------\n");
    fprintf(fp, "score\tfrequency\n");
    fprintf(fp, "-----\t---------\n");
    for (i = 0; i < max; ++i){
        while (scores[i]==scores[x]){ 
            x++; 
            count++;
            sum++;
            temp = x-1;
            if(scores[i] != scores[x]){
                //printf("   %d\t      %d\n",scores[i], count);
                freq[i] = count;
                score[i] = scores[i];
                count=0;

                i=temp;
                x=temp+1;
                sum++;
                printf("%d\t%d", score[i], freq[i]);
                fprintf(fp, "%d\t%d", score[i], freq[i]);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

这部分:

int i, x=0, temp=0, count=0, sum=0, mode=0;
int score[sum];
int freq[sum];

看起来不对。

您将sum设置为零,然后将其用于数组维度。你的意思是:

sum = max;

答案 1 :(得分:1)

  

我最终编译没有错误,但是在运行时崩溃。

<强>原因

您的程序崩溃的原因是您没有为frequency()函数中使用的数组分配足够的内存

void frequency(int scores[], int max){
int i, x=0, temp=0, count=0, sum=0, mode=0;
int score[sum];
int freq[sum];

<强>解决方案:

那么,有没有办法在运行时根据需求提供内存或在编译期间更改块的内存大小?

是的,这就是使用Dynamic memory allocation的原因....虽然你在代码中向frequency()函数发送一个固定数组,但我提供的函数适用于任何整数数组你发送..

这里我提供了代码

  • 一个数组存储所有独特的分数

  • 和其他数组存储每个得分的出现次数

我已经使用动态内存分配完成了这个。我认为如果你对动态内存分配函数有基本的了解就很容易理解..如果你有任何疑问,请通过评论问我:)顺便说一下我们假设你的主要职能是:

int main()
{
    int scores[30] = {90,85,100,50,50,85,60,70,55,55,80,95,70,60,95,
      80,100,75,70,95,90,90,70,95,50,65,85,95,100,65};
    frequency(scores,30);
    return 0;
}

<强>代码:

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

void frequency(int scores[], int max);

int main()
{
    int scores[30] = {90,85,100,50,50,85,60,70,55,55,80,95,70,60,95,
      80,100,75,70,95,90,90,70,95,50,65,85,95,100,65};
    frequency(scores,30);
    return 0;
}

void frequency(int scores[], int max)
{
    int i,j,count=0,flag=0,occur=0;
    int *score=malloc(sizeof(int)); 
    if(malloc==NULL)
    {
         printf("memory allocation failed");
         exit(1);
//it's good to check if memory allocated was successful or not
//I've avoided it for further allocations,to decrease the size of post :)
    }
    int *freq=malloc(sizeof(int));
    printf("score\tfrequency\n");
    printf("-----\t---------\n");


    //building array which has only scores
    for(i=0;i<max;i++)
    {
        if(count==0) //first time
        {
            score=realloc(score,(count+1)*sizeof(int)); 
            //increasing size of array by 1*sizeof(int)
            score[count]=scores[i];
            count++;
        }//first one requires no checking whether it's repeated or not
        else
        {
            flag=0; //resetting flag value
            for(j=0;j<count;j++)
            {
                if(scores[i]==score[j])
                {
                    flag=1; //
                    break;
                }
            }

            if(flag==0) // if not repeated need to add new element
            {
                score=realloc(score,(count+1)*sizeof(int));
                score[count]=scores[i];
                count++;
            }

        }
    }

    //allocating memory for frequency array
    freq=realloc(freq,count*sizeof(int));

    //building array which has frequency of each score
    for(i=0;i<count;i++)
    {
        occur=0;
        for(j=0;j<max;j++)
        {
            if(score[i]==scores[j])
                occur++;
        }
        freq[i]=occur;
    }

    for(i=0;i<count;i++) //printing output
        printf("\n  %d\t  %d\n",score[i],freq[i]);

    free(score); //freeing the blocks 
    free(freq);
}

我的方法很容易理解

  1. 首先创建数组score,只要遇到唯一元素并在其中存储就会创建额外的内存
  2. 然后我检查score数组中scores数组的每个元素的出现次数,并将它们存储在freq数组中。
  3. <强>输出:

    score   frequency
    -----   ---------
    
      90      3
    
      85      3
    
      100     3
    
      50      3
    
      60      2
    
      70      4
    
      55      2
    
      80      2
    
      95      5
    
      75      1
    
      65      2
    

    我希望这是你想要实现的目标:)