【问题标题】:How to align output numbers (or text) to the right in c?如何在c中将输出数字(或文本)右对齐?
【发布时间】:2017-05-22 03:32:15
【问题描述】:

我的任务是从用户那里获取一个正整数,然后打印一个看起来像这样的三角形(例如整数 5):

          1
        1 2
      1 3 5
   1 4 7 10
1 5 9 13 17

这是我设法制作的代码:

int num, line,addition,sum,termNum;
printf("Enter a positive integer: ");
scanf("%d",&num);

printf("%d\n",1);

for (line=2;line<=num;line++)
{
   addition = line-1;
   termNum=1;
   printf("%d ",termNum);

   for (sum=2;sum<=line;sum++)
   {
       termNum+=addition;
       printf("%d ",termNum);
   }
   printf("\n");

}

但是输出没有右对齐,看起来是这样的:

1
1 2
1 3 5
1 4 7 10
1 5 9 13 17

我无法创建函数或使用数组,只能使用循环和 if,以及各种控制字符,例如 %c %s %d %-12c 等... 变量类型必须是 int、double、char。 (不是字符串或 char* 等)

有什么想法吗? 谢谢。

【问题讨论】:

  • 我们不是homwork服务。如果只有一种打印空格的方法...
  • @Olaf 我尝试了大约 2 小时后来到这里...我可以打印这样的空格: char s = ' ' ; printf("%c",s);但是我怎么知道每行需要多少?
  • 如果有一种方法可以重复一个或多个语句......在编程中,人们应该在询问之前考虑......

标签: c alignment printf


【解决方案1】:

最大打印数字将是最后一个数字。那是线 num 和列 num。因此它将是1 + (num - 1) ^ 2

十进制数N的打印宽度为ceil(log(N+1) / log(10))

对齐数字的最简单方法是将它们全部打印出来 宽度,即最大数的宽度: ceil(log(1 + (num - 1) ^ 2) / log(10)).

int num, line, addition, sum, termNum;
printf("Enter a positive integer: ");
scanf("%d", &num);
int width = ceil(log10(1 + 1 + (num - 1) * (num - 1)));
char format[] = "%0000000000d%c";
sprintf(format, "%%%dd%%c", width);
for (sum = 1 + 1; sum <= num; sum++) {
    int i;
    for (i = 0; i <= width; i++)
        putchar(' ');
}
printf(format, 1, '\n');
for (line = 2; line <= num; line++) {
    for (sum = line + 1; sum <= num; sum++) {
        int i;
        for (i = 0; i <= width; i++)
            putchar(' ');
    }
    addition = line - 1;
    termNum = 1;
    printf(format, termNum, ' ');
    for (sum = 2;sum <= line; sum++) {
        termNum += addition;
        printf(format, termNum, ' ');
    }
    printf("\n");
}

【讨论】:

  • 谢谢,但我们不能使用 ceil() 或 sprintf,而且 format[] 是一个数组(对吗?)所以我们也不能使用它......
  • 那太复杂了。而且我们不做作业编码!
  • @Olaf 不要为我做功课,如果你知道怎么做,请给出正确方向的提示(?)......或者这也违反了规则?
  • @user7387595 ceill() 只是查找数字的打印表示长度的一种方法。您也可以通过计算需要除以 10 的次数来找到它。
  • @user7387595 同样,sprintf()format[] 用于利用 C 的对齐功能。但是您可以通过连续调用printf(" ") 来进行填充。或者,如果您知道您的练习必须使用的最大数量,您可以简化该值。
【解决方案2】:

OP a 需要轻推以预先计算最大线宽。

下面的填空代码计算最大线宽,这似乎是OP的绊脚石。

int main(void) {
  int x = 5;
  int width = 0;
  for (int col = 0; col < ___ ; col++) { // How many iterations?
    int value = col* ___ + ___;          // Determine each value: 1 5 9 13 17      
    // find print width
    do {
      width++;  // add 1 per digit       
      value /= ___;                      // What base is the number displayed?
    } while (value > ___);               // When to quit (hint:  not much)
    width++;  // add 1 for ' ' separator 
  }
  printf("%d\n", width);                 // Should be a dozen
}

另类

  for (int col = 0; col < ___ ; col++) {
    int value = col* ___ + ___;
    width += snprintf(NULL, 0, "%d ", value);
  }

【讨论】:

    猜你喜欢
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2011-08-07
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多