0
#include <stdio.h>

main()
{
    int i, num, sum=0; //declaration
    printf("How many numbers do you want to calculate average of?\n");
    scanf("%d", &num); //how many numbers are to be calculated
    printf("Enter %d numbers\n", num);

    int a[num]; //array to store data
    for(i=1;i<=num;i++) //loop to take input 
    {
        if(i==1) //for 1st
            printf("1st value : ");
        else if (i<=2) //2nd
            printf("2nd value : ");
        else if (i<=3) //3rd
            printf("3rd value : ");
        else //else print th ordinal
            printf("%dth value : ", i);
        scanf("%d", &a[i]);
    }

    for(i=1;i<=num;i++)
        sum+=a[i];

    float avg;
    avg=sum/num;
    printf("Average : %f", avg);

    return 0;
}

一个程序,用于取出 n 个数字的平均值。现在,这段代码做了它应该做的事情,但是如果数组的大小超过 20,它会打印 21th、22th、23th 等等,这是错误的。我想不出如何解决这个问题。任何帮助都会很棒。我是编程新手,所以请原谅我的无知。输出描述需要修复的内容

4

4 回答 4

3

没有标准功能可以做到这一点。你可以写一个,或者使用我的:

ordinal.c

#include "ordinal.h"
#include <stdio.h>

static const char *const suffixes[4] = { "th", "st", "nd", "rd" };
enum { NUM_SUFFIXES = sizeof(suffixes) / sizeof(suffixes[0]) };

static unsigned suffix_index(unsigned n)
{
    unsigned x;

    x = n % 100;
    if (x == 11 || x == 12 || x == 13)
        x = 0;
    else if ((x = x % 10) > 3)
        x = 0;
    return x;
}

char *fmt_ordinal(char *buffer, size_t buflen, unsigned n)
{
    unsigned x = suffix_index(n);
    int len = snprintf(buffer, buflen, "%u%s", n, suffixes[x]);
    if (len <= 0 || (size_t)len >= buflen)
        return 0;
    return(buffer);
}

ordinal.h

/* returns buffer or 0 on failure (implausible unless buffer too small) */
extern char *fmt_ordinal(char *buffer, size_t buflen, unsigned n);

其中一些本身就有点过分了,但源文件还包含scn_ordinal()以或多或少的严格性扫描序数,并且标头声明了它。

int main(void)
{
    char buffer[15];

    /* Test fmt_ordinal() */
    for (unsigned i = 0; i < 35; i++)
        printf("%2u => %4s\n", i, fmt_ordinal(buffer, sizeof(buffer), i));

    return 0;
}
于 2020-05-13T23:52:59.187 回答
2

你可以修改 10 来得到最后一个数字。然后基于此,您可以使用“st”、“nd”、“rd”或“th”。您还需要 11、12 和 13 的特殊情况。

    if ((i % 10 == 1) && (i % 100 != 11))
        printf("%dst value : ", i);
    else if ((i % 10 == 2) && (i % 100 != 12))
        printf("%dnd value : ", i);
    else if ((i % 10 == 3) && (i % 100 != 13))
        printf("%drd value : ", i);
    else
        printf("%dth value : ", i);
于 2020-05-13T23:50:33.270 回答
0

我玩了一下,这是我最小的“查找”,但遗憾的是,以模除法为代价。我对高于 99 的值并不在意。

if( i > 20 ) i %= 10; // Change 21-99 to 1-10.
if( i >  3 ) i  =  0; // Every other one ends with "th"
//         0   1   2   3 
suffix = &"th\0st\0nd\0rd"[ i * 3 ];  // Acknowledge 3byte regions.

您可以使用“后缀”作为指向正常空终止字符串的指针。

于 2021-12-05T05:00:39.623 回答
-1

初学者没关系,没必要道歉。您可以结合使用 SWITCH 语句和取模运算符 (%) 来解决问题。模运算符接受两个数字 (n1 % n2) 并在 n1 除以 n2 时返回余数。

您将需要构造一个序数数组,如下所示:

char *ordinalList[] = { "st", "nd", "rd", "th" };

这将允许您简单地引用此数组以将正确的序数附加到数字。下一步是创建一个算法来确定应该引用哪个数组索引。为此,您可以创建一个新函数并在“main”中调用它。

char *determineOrdinal (char **ordinalList, int numValue)
{

    if (3 < numValue && numValue < 21)
        return ordinals[3];

    switch (numValue % 10) {
        case 1 :    return ordinalList[0];
                    break;
        case 2 :    return ordinalList[1];
                    break;
        case 3 :    return ordinalList[2];
                    break;
        default:    return ordinalList[3];
                    break;
}

您可以将一个数字作为 numValue 参数传递给此函数。您的“主要”功能可能如下所示:

#include <stdio.h>

int main(void)
{
    char *ordinalList[] = { "st", "nd", "rd", "th" };
    char *currentdOrdinal;
    int i, num, sum=0; //declaration
    printf("How many numbers do you want to calculate average of?\n");
    scanf("%d", &num); //how many numbers are to be calculated
    printf("Enter %d numbers\n", num);

    int a[num]; //array to store data
    for(i=1;i<=num;i++) //loop to take input 
    {
        currentdOrdinal = determineOrdinal (ordinalList, i)
        printf("%d%s value : ", i, currentdOrdinal);
        scanf("%d", &a[i]);
    }

    for(i=1;i<=num;i++)
        sum+=a[i];

    float avg;
    avg=sum/num;
    printf("Average : %f", avg);

    return 0;
}

我认为该代码应该适合您。我希望这有帮助。

于 2020-05-13T23:51:20.723 回答