0

我目前正在为学校做一个项目,我需要编写一个计算器来确定一组数字的模式。参数是数字必须在 1 到 30 之间。必须检查用户是否在该范围内插入数字,并且必须将数字验证为整数。我已经完成了大部分工作,除了我的主要问题是输入数字并验证它们并确保我的模式功能正常工作的 for 循环。在解决循环问题方面有什么建议吗?另外,我必须使用模式函数来计算模式,我正在使用的模式是否运行良好,或者有更好的方法吗?

#include <stdio.h>
#include <string.h>
#include <math.h>

int mode(int *num, int size);

int main(int n, char **p) {
    int modearray[], size, i;

    printf("What is the size of the Array?");
    scanf("%d", &size);

    for (i=0; i<modearray[size]; i++) {
        printf("Enter an integer value (1 to 30): ");
        scanf("%d", modearray[i]);

        if (modearray[i] < 1 || modearray[i] > 30) {
            printf("Please enter a value within the range");
            scanf("%d", modearray[i])
        }

        else if (sscanf(p[i], "%i", &a[i]) != 1) {
            printf("ERROR\n");
            return -1;
        }
    }
}



//used the mode function code frome http://www.dreamincode.net/forums/topic/43713-   pointers-and-modefunction/
int mode(int *num, int size) {
    int currentnum = (*num);
    int count = 0;
    int modenum = -1;
    int modecount = 1;

    for (int x=0; x<size; x++) {
        if (currentnum==(*num + x)) count ++;
        else {
           if(count > modecount) {
               modenum = currentnum;
               // modecount = count; 
               x--;
           }
           currentnum=*(num + x);
           count = 0;
        }
    }
}
4

2 回答 2

2

正如 Charlie 和 user2533527 已经指出的那样,OP 代码中存在错误,他们就这些错误提供了建议。我在下面对您的原始代码的编辑中注意到了其他一些内容,如果没有解决,代码就无法构建和/或运行。因此,如果您有兴趣,请查看本文底部的内联评论,以查看对原始代码的一些更正。

这个答案的重点是输入验证,根据您声明的目标( 必须检查用户是否在该范围内插入了一个数字,并且该数字必须作为一个整数进行验证)具体来说,您似乎需要验证输入的数字是否属于一个范围,并且它们都是整数。

如果您将所有验证步骤移到一个函数中,例如:

int ValidateInput(char *num)
{
    if(strstr(num, ".")!=NULL) return FLOAT;
    if (atoi(num) < 1) return SMALL;
    if (atoi(num) > 30) return LARGE;
    return VALID;
}

然后可以轻松地执行主用户输入循环以包含特定错误(如果有),或者使用switch()语句继续数据收集,例如:

status = ValidateInput(number);
switch(status)  {
    case VALID:
        modearray[i] = atoi(number);
        printf("Enter an integer value %d: (1 to 30): ", i+2);

        break;
    case FLOAT:
        printf("float detected, enter an integer");
        i--;//try again
        break;
    case SMALL:
        printf("value too small, enter value from 1 to 30");
        i--;//try again
        break;
    case LARGE:
        printf("value too large, enter value from 1 to 30");
        i--;//try again
        break;
    default:
        //do something else here
        break;
}

总而言之,这种方法不使用模式函数,而是用它替换它ValidateInput(),确保只有整数并且在规定范围内的数字包含在modearray变量中。

编辑以包括搜索模式(组内出现的最高数字)

我的方法将做三件事来获取模式
排序数组,一路
遍历匹配的排序数组跟踪计数。
保留最高的匹配字符串

为此,我将在函数 中使用qsort()和循环。mode()

int mode(int *num, int size) {
    int count = 0;
    int countKeep=0;
    int modenum = -1;

    qsort(num, size, sizeof(int), cmpfunc);
    //now we have size in ascending order, get count of most occuring
    for (int x=1; x<size; x++) 
    {
        if(num[x-1] == num[x]) 
        {
            count++; 
            if(count > countKeep)
            {
                countKeep = count;
                modenum=num[x];
            }
            else
            {
                count = 0;
            }
        }
    }
    return modenum;
}

是我的方法的完整代码:(此代码将捕获只有一种模式的数字字符串的模式。您可以修改循环以确定字符串是多模式的,还是有两个相同出现的数字)

#include <ansi_c.h> //malloc
//#include <stdio.h>//I did not need these others, you might
//#include <string.h>
//#include <math.h>  
int ValidateInput(char *num);
int mode(int *num, int size);
int cmpfunc (const void * a, const void * b);

enum  {
    VALID,
    FLOAT,
    SMALL,
    LARGE
};

int main(int n, char **p)
{
    int *modearray, size, i;  
    int *a; 
    char number[10];
    int status=-1;
    int modeOfArray;

    printf("What is the size of the Array?");
    scanf("%d", &size);

    modearray = malloc(size*sizeof(int));
    a = malloc(size);

    printf("Enter an integer value 1: (1 to 30): ");
    for (i=0; i<size; i++) 
    {
        scanf("%s", number); 

        //Validate Number:
        status = ValidateInput(number);
        switch(status)  {
            case VALID:
                modearray[i] = atoi(number);
                printf("Enter an integer value %d: (1 to 30): ", i+2);

                break;
            case FLOAT:
                printf("float detected, enter an integer");
                i--;//try again
                break;
            case SMALL:
                printf("value too small, enter value from 1 to 30");
                i--;//try again
                break;
            case LARGE:
                printf("value too large, enter value from 1 to 30");
                i--;//try again
                break;
            default:
                //do something else here
                break;
        }
    }
    modeOfArray = mode(modearray, size);
    getchar();//to view printf before execution exits
}
int ValidateInput(char *num)
{
    if(strstr(num, ".")!=NULL) return FLOAT;
    if (atoi(num) < 1) return SMALL;
    if (atoi(num) > 30) return LARGE;
    return VALID;
}


int mode(int *num, int size) {
    int count = 0;
    int countKeep=0;
    int modenum = -1;

    qsort(num, size, sizeof(int), cmpfunc);
    //now we have size in ascending order, get count of most occuring
    for (int x=1; x<size; x++) 
    {
        if(num[x-1] == num[x]) 
        {
            count++; 
            if(count > countKeep)
            {
                countKeep = count;
                modenum=num[x];
            }
            else
            {
                count = 0;
            }
        }

    }

    return modenum;
}

int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}
于 2013-11-08T20:10:47.880 回答
0

假设问题是关于在 scanf 进入数组后崩溃:

int main(int n, char **p) {
    int *modearray, size, i;

    printf("What is the size of the Array?");
    scanf("%d", &size);

    modearray = malloc(size * sizeof(int)); //imo size of int is 4 so u can replace with

    for (i=0; i<modearray[size]; i++) {
        printf("Enter an integer value (1 to 30): ");
        scanf("%d", modearray[i]);

        if (modearray[i] < 1 || modearray[i] > 30) {
            printf("Please enter a value within the range");
            scanf("%d", &modearray[i])
        }

        else if (sscanf(p[i], "%i", &a[i]) != 1) {
            printf("ERROR\n");
            return -1;
        }
    }
}
于 2013-11-08T19:01:15.917 回答