如何在 C 程序中打印序号指示符?无法使用 'st'、'nd'、'rd' 打印数字。 (初学者)
How do I print ordinal indicators in a C program? Can't print numbers with 'st', 'nd', 'rd'. (Beginner)
#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,它会打印第 21、22、23 等等,这是错误的。我想不出如何解决这个问题。任何帮助都会很棒。我是编程新手,请原谅我的无知。
您可以 mod 乘以 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);
初学者没关系,不用道歉。您可以使用 SWITCH 语句和模数运算符 (%) 的组合来解决您的问题。取模运算符取两个数 (n1 % n2) 和 returns 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 参数传递给此函数。您的 "main" 函数可能如下所示:
#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;
}
我认为该代码应该适合您。希望对您有所帮助。
没有执行此操作的标准函数。你可以写一个,或者使用我的:
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()
,它以或多或少的严格程度扫描序数,并且 header 声明了它。
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;
}
我玩了一下,这是我的最小 'lookup' 除了,遗憾的是,模除法的费用。我对高于 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[=10=]st[=10=]nd[=10=]rd"[ i * 3 ]; // Acknowledge 3byte regions.
您可以使用 'suffix' 作为指向正常空终止字符串的指针。
#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,它会打印第 21、22、23 等等,这是错误的。我想不出如何解决这个问题。任何帮助都会很棒。我是编程新手,请原谅我的无知。
您可以 mod 乘以 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);
初学者没关系,不用道歉。您可以使用 SWITCH 语句和模数运算符 (%) 的组合来解决您的问题。取模运算符取两个数 (n1 % n2) 和 returns 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 参数传递给此函数。您的 "main" 函数可能如下所示:
#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;
}
我认为该代码应该适合您。希望对您有所帮助。
没有执行此操作的标准函数。你可以写一个,或者使用我的:
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()
,它以或多或少的严格程度扫描序数,并且 header 声明了它。
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;
}
我玩了一下,这是我的最小 'lookup' 除了,遗憾的是,模除法的费用。我对高于 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[=10=]st[=10=]nd[=10=]rd"[ i * 3 ]; // Acknowledge 3byte regions.
您可以使用 'suffix' 作为指向正常空终止字符串的指针。