【问题标题】:Printing values of an Array that are in odd numbers of columns and rows打印列和行奇数的数组的值
【发布时间】:2017-01-27 20:42:57
【问题描述】:

我必须创建一个程序来打印具有用户指定的行数和列数的数组,并打印具有奇数索引的值(行#和列#)

这是我设法写的:

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

int main(int argc, char *argv[])
{
    int r, c, i, j;
    printf("Number of rows: ");
    scanf("%d", &r);
    printf("Number of columns: ");
    scanf("%d", &c);
    int A[r][c];
    printf("Enter your numbers\n");

    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++)
            scanf("%d", &A[i][j]);
    }

    for (i = 0; i < r; i++) {
        printf("\n\t");
        for (j = 0; j < c; j++)
            printf("%d ", A[i][j]);
    }
}

如果用户指定他想要 4 行和 4 列,程序将打印如下内容:

X X X X
X X X X
X X X X 
X X X X

如何让程序打印出来:

X   X  // prints only for odd columns (1st and 3rd)
       //  prints nothing as the index of row is even(2nd)
X   X // same as 1st row
      // smae as 2nd row

【问题讨论】:

  • i += 2j += 2替换打印循环中的i++j++
  • ...奇数索引需要像for (i = 1; i &lt; r; i+=2) 这样的循环,类似于j。除非人类世界是从 1 而不是 0 计数的。
  • 决定显示宽度#define WIDTH 1, if((i &amp; 1) || (j &amp; 1)) printf("%*s ", WIDTH, ""); else printf("%*d ", WIDTH, A[i][j]);

标签: c arrays printf scanf


【解决方案1】:

从您的示例看来,您正在考虑第一行和第一列(索引0s)到第一个奇数...可能在行和列1 中。

在这种情况下,在您的打印功能中,您可以简单地将递增字段更改为...

for (i = 0; i < r; i++) {
    printf("\n\t");

    if (i % 2 == 0) {
        for (j = 0; j < c; j += 2)
            printf("%d ", A[i][j]);
    }
}

...或者您可以使用modulus (%) 运算符来检查j 的值的状态是偶数还是奇数...

for (i = 0; i < r; i++) {
    printf("\n\t");

    if (i % 2 == 0) {
        for (j = 0; j < c; j++) {
            if (j % 2 == 0) //will print columns at index 0, 2, 4, 6, ...
                printf("%d ", A[i][j]);
        }
    }
}

我更喜欢第一个...


编辑

如果您想在输出中保留行不是奇数的空格,请不要更改 i 的增量,这样它将每次打印 \n 以保持这些空格。

【讨论】:

    【解决方案2】:

    既然你想打印 1..3...5...7 索引而不是在你的 for 循环中每次递增一个,那么你的索引从 1 开始

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char *argv[]) {
        int r, c, i, j;
        printf("Number of rows: ");
        fflush(stdout);
        scanf("%d", &r);
        printf("Number of columns: ");
        scanf("%d", &c);
        int A[r][c];
        printf("Enter your numbers\n");
    
        for (i = 0; i < r; i++) {
            for (j = 0; j < c; j++)
                scanf("%d", &A[i][j]);
        }
    
        for (i = 1; i < r; i+=2) {
            printf("\n\t");
            for (j = 1; j < c; j+=2)
                printf("%d ", A[i][j]);
        }
    }
    

    【讨论】:

      【解决方案3】:

      首先,如果您只是学习 C,那么您可以学到的最有价值的课程之一就是始终验证用户输入。不需要太多操作,只需检查scanf返回,如果成功转换,则验证收到的值是否在您的允许范围内。例如,由于您的 rowscolumn 输入用于数组边界,它们必须大于 0,所以您可以这样做:

      int rtn = 0;
      printf ("Number of rows: ");
      /* VALIDATE all user input */
      if ((rtn = scanf ("%d", &r)) != 1 || r < 1) {
          if (rtn == EOF) {   /* respect cancellation of input with EOF */
              putchar ('\n'); /* tidy up */
              return 1;
          }
          fprintf (stderr, "error: invalid number of rows provided.\n");
          /* handle error as desired */
      }
      

      现在如果你想再次显示你的提示,如果输入了一个无效的row值,你可以简单地将整个例程放入一个无限循环中,当输入有效输入时break,例如

      for (;;) {
          int rtn = 0;
          printf ("Number of rows: ");
          /* VALIDATE all user input */
          if ((rtn = scanf ("%d", &r)) != 1 || r < 1) {
              if (rtn == EOF) {   /* respect cancellation of input with EOF */
                  putchar ('\n'); /* tidy up */
                  return 1;
              }
              fprintf (stderr, "error: invalid number of rows provided.\n");
          }
          else
              break;
      }
      

      接下来,无需使用昂贵的modulo ('%') 测试,您真正关心的只是打印 odd rowcol 值是您的 @ 987654333@ 值不是 奇数 值(因为数组索引在 C 中是从零开始的,所以第一、第三、第五等列都有一个 even 值),因此只需检查列的 LEAST SIGNIFICANT BIT,例如:

      for (i = 0; i < r; i++) {
          for (j = 0; j < c; j++)
              if (!(j & 0x1))  /* check if the first bit of the column is 0 */
                  printf ("%2d  ", A[i][j]);   /* print the number */
              else
                  printf ("__  ");            /* print an equivalent blank */
          putchar ('\n');     /* never use printf for a single char */
      }
      

      如果您想要更短的代码,尽管可读性稍差,您可以使用ternary 运算符来控制测试和打印,例如

      for (i = 0; i < r; i++) {
          for (j = 0; j < c; j++)
              !(j & 0x1) ? printf ("%2d  ", A[i][j]) : printf ("__  ");
          putchar ('\n');
      }
      

      为了只打印奇数rows,只需检查row最低有效位 是否为奇数并完全跳过该行,例如

      for (i = 0; i < r; i++) {
          if (i & 0x1) {      /* skip printing of even rows */
              putchar ('\n');
              continue;
          }            
          ...
      

      总而言之,您可以执行以下操作:

      #include <stdio.h>
      
      int main (void)     /* make clear no arguments are expected */
      {
          int r, c, i, j;
      
          for (;;) {
              int rtn = 0;
              printf ("Number of rows: ");
              /* VALIDATE all user input */
              if ((rtn = scanf ("%d", &r)) != 1 || r < 1) {
                  if (rtn == EOF) {   /* respect cancellation of input with EOF */
                      putchar ('\n'); /* tidy up */
                      return 1;
                  }
                  fprintf (stderr, "error: invalid number of rows provided.\n");
              }
              else
                  break;
          }
          for (;;) {
              int rtn = 0;
              printf ("Number of columns: ");
              if ((rtn = scanf ("%d", &c)) != 1 || c < 1) {
                  if (rtn == EOF) {
                      putchar ('\n');
                      return 1;
                  }
                  fprintf (stderr, "error: invalid number of columns provided.\n");
              }
              else
                  break;
          }
      
          int A[r][c];
      
          printf ("Enter your numbers\n");
      
          for (i = 0; i < r; i++) {
              for (j = 0; j < c; j++)
                  if (scanf ("%d", &A[i][j]) != 1) {
                      fprintf (stderr, "error: invalid array input.\n");
                      return 1;
                  }
          }
      
          for (i = 0; i < r; i++) {
              if (i & 0x1) {      /* skip printing of even rows */
                  putchar ('\n');
                  continue;
              }            
              for (j = 0; j < c; j++)
                  if (!(j & 0x1))  /* check if the first bit of the column is 0 */
                      printf ("%2d  ", A[i][j]);   /* print the number */
                  else
                      printf ("__  ");            /* print an equivalent blank */
              putchar ('\n');     /* never use printf for a single char */
          }
      }
      

      使用/输出示例

      $ ./bin/array_prnodd
      Number of rows: 4
      Number of columns: 4
      Enter your numbers
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
       1  __   3  __
      
       9  __  11  __
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        相关资源
        最近更新 更多