【问题标题】:C - use printf to show full outputC - 使用 printf 显示完整输出
【发布时间】:2018-09-02 20:56:06
【问题描述】:

我有一个程序应该为不同学生获取不同课程的分数,然后显示获得的最高分。

它显示最高分,但我试图让它输出如下内容:

“[课程]中的[学生姓名]最高的是[标记]”

我想知道是否有办法获得这种类型的输出

这是我的代码:

#include <stdio.h>

void main() {
    const char STUDENTS = 3;
    const char COURSES = 3;
    char students[][15]= { "James", "Keith", "Jonathan" };  
    char courses[][6] = { "C++", "VB", "Java" };
    int marks[STUDENTS][COURSES];
    int i, j;
    int highest;

    for (i = 0; i < STUDENTS; i++) {
        for (j = 0; j < COURSES; j++) {
            printf("Enter marks for %s for %s: ", students[i], courses[j]);
            scanf("%d", &marks[i][j]);  
        }
    }

    printf("\nResults: \n");
    for (i = 0; i < STUDENTS; i++) {
        printf("\n%s: \t\n", students[i]);
        for (j = 0; j < COURSES; j++) {
            printf("%s: ", courses[j]);
            printf("%d\t\t", marks[i][j]);          
        }
        printf("\n");   
    }

    highest = marks[0][0];

    for (i = 0; i < STUDENTS; i++) {
        for (j = 0; j < COURSES; j++) {
            if (marks[i][j] > highest) {
                highest = marks[i][j];
            }
         }
    }
    printf("\nHighest was %s in %s with %d", students[i], courses[j], highest);

    getch(); 
}

【问题讨论】:

    标签: c arrays loops printf output


    【解决方案1】:

    当您找到最高分时,您需要保存ij 的值:

    highest = marks[0][0];
    
    int highStudent = 0;
    int highCourse = 0;
    
    for (i = 0; i < STUDENTS; i++) {
        for (j = 0; j < COURSES; j++) {
            if (marks[i][j] > highest) {
                highest = marks[i][j];
                highStudent = i;
                highCourse = j;
            }
    
        }
    }
    
    printf("\nHighest was %s in %s with %d\n", students[highStudent], courses[highCourse], highest);
    

    【讨论】:

      【解决方案2】:

      正如 Stephen Docy 所写,您必须保存最高分的索引,或者保存名称和课程以获得最高分。

      按照编码,在第三个嵌套循环的末尾,i == STUDENTSj == COURSES,所以 students[i]courses[j] 指的是超出这些数组边界的元素。尽管这些地址适合与指向相同数组的指针进行比较,但将它们传递给 printf 会导致 printf 具有未定义的行为,因为它将取消引用它们作为指向 C 字符串的指针。

      另请注意,您的代码中还有其他问题:

      • 您应该测试scanf() 的返回值以避免在无效输入时出现未定义的行为。
      • main 的返回类型是 int,而不是 void
      • type char 对于数组的大小容易出错。您可以使用 intsize_t 或宏来移植到旧的 C 标准,或者根据数组本身计算这些大小。
      • 您的大小和数组studentscourses 具有相同大小只是巧合,而不是构造。增加STUDENTSCOURSES 与相应的数组不同步会产生未定义的行为。
      • 您可以使用scanf("%*2[\n]") 代替不可移植的函数getch(),它会读取挂起的换行符并等待用户再次按下回车键。

      这是修改后的版本:

      #include <stdio.h>
      
      int main() {
          char students[][15] = { "James", "Keith", "Jonathan" };  
          char courses[][6] = { "C++", "VB", "Java" };
          const int STUDENTS = sizeof(students) / sizeof(students[0]);
          const int COURSES = sizeof(courses) / sizeof(courses[0]);
          int marks[STUDENTS][COURSES];
          int i, j, highest, best_student, best_course;
      
          for (i = 0; i < STUDENTS; i++) {
              for (j = 0; j < COURSES; j++) {
                  printf("Enter marks for %s for %s: ", students[i], courses[j]);
                  if (scanf("%d", &marks[i][j]) != 1) {
                      fprintf(stderr, "invalid input\n");
                      return 1;
                  }
              }
          }
      
          printf("\nResults:\n");
          for (i = 0; i < STUDENTS; i++) {
              printf("\n%s:\n", students[i]);
              for (j = 0; j < COURSES; j++) {
                  printf("%s: ", courses[j]);
                  printf("%d\t\t", marks[i][j]);          
              }
              printf("\n");   
          }
      
          highest = marks[0][0];
          best_student = best_course = 0;
          for (i = 0; i < STUDENTS; i++) {
              for (j = 0; j < COURSES; j++) {
                  if (marks[i][j] > highest) {
                      highest = marks[i][j];
                      best_student = i;
                      best_course = j;
                  }
               }
          }
          printf("\nHighest was %s in %s with %d\n",
                 students[best_student], courses[best_course], highest);
      
          scanf("%*2[\n]");
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多