如何在我完成的C程序中加入指针?[关闭]

72qzrwbm  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(144)

已关闭。此问题需要更多focused。目前不接受回答。
**要改进此问题吗?**更新此问题,使其仅针对editing this post的一个问题。

4天前关闭。
Improve this question
我刚刚完成了2个今天到期的C程序,但当我的教授检查我的工作时,他告诉我要在其中加入指针。我们还没有学习过指针,我真的很难弄清楚他的意思。我试图添加我通过在线教程学到的东西,但它只是导致多个错误,我就是不能让它工作。
我的第一个程序是一个学生记录。我想学生的名字,分数1,2,3,还有他们的最终成绩,并存储在一个文件中,但我不知道如何。这是我的代码:

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

#define max 3

void getscore(char *name, int *grade1, int *grade2, int *grade3);
void display();
float rate(float ave);
float average(int a, int b, int c);

float rating[max];
float ave[max];
char n[max][50];
int q1[max], q2[max], q3[max];

int main()
{
    int i;
    system("cls");
    for(i = 0; i<max; i++){
        system("cls");
        printf("\t\tInput Student Record");
        printf("\nStudent# %i", i+1);
        getscore(n[i], &q1[i], &q2[i], &q3[i]);
        ave[i] = average(q1[i], q2[i], q3[i]);
        rating[i] = rate(ave[i]);
    }
    display();
    getch(); //system("pause");
}

void getscore(char *name, int *grade1, int *grade2, int *grade3)
{
    printf("\nStudent Name: ");
    scanf("%s", name);

    printf("\nQuiz Score#1: ");
    scanf("%i", grade1);

    printf("\nQuiz Score#2: ");
    scanf("%i", grade2);

    printf("\nQuiz Score#3: ");
    scanf("%i", grade3);
}

float rate(float ave)
{
    /*5.00 - 74 below
      3.00 - 75 - 76
      2.75 - 77 - 79
      2.50 - 80 - 83
      2.25 - 84 - 87
      2.00 - 88 - 90
      1.75 - 91 - 93
      1.50 - 94 - 96
      1.25 - 97 - 98
      1.00 - 99 - 100
    */

    if(ave >= 75 && ave <= 76)
        return 3.00;
    else if(ave >= 77 && ave <=79)
        return 2.75;
    else if(ave >= 80 && ave <= 83)
        return 2.5;
    else if(ave >=84 && ave <= 87)
        return 2.25;
    else if(ave >= 88 && ave <= 90)
        return 2.00;
    else if(ave > 91 && ave <= 93)
        return 1.75;
    else if(ave > 94 && ave <= 96)
        return 1.50;
    else if(ave > 97 && ave <= 98)
        return 1.25;
    else if(ave > 99 && ave <= 100)
        return 1.00;
    else
        return 5.00;
}

float average(int a, int b, int c)
{
    return (a+b+c) / 3;
}

void display()
{
    int i;
    printf("\nStudent Grade Record\n");
    printf("\n\nNo. Name \t Quiz_1 \t Quiz_2 \t Quiz_3 \t Average \t Rating");
    for(i=0; i < max; i++)
    {
        printf("\n%i.) %s \t\t%i \t\t%i \t\t%i \t\t%.2f \t\t%.2f", i+1, n[i], q1[i],
               q2[i], q3[i], ave[i], rating[i]);
    }
}

字符串
我试着添加一些我从youtube的在线教程中学到的东西,但结果只是一行又一行的错误。

g2ieeal7

g2ieeal71#

1.不清楚您是希望display()输出像现在一样输出到stdout或写入文件时使用不同的格式。下面演示了如何通过传递FILE *来显示并使用fprintf()而不是打印来写入文件。如果您需要不同的格式,请为文件输出创建一个替代的display()函数,并调用而不是.
1.已将最大值字段加入至读取字串的函式。
1.删除了全局变量。这意味着现在必须将相关变量传递给display()
1.把main()移到底部。在这样的小例子中,这意味着你可以消除原型。
1.删除了系统调用,以便我可以为您测试。
1.最小化变量的作用域。对于for循环,更喜欢通过循环来确定变量的作用域,而不是在循环之前(有时候你需要变量,但却不能)。
1.你的费率函数有缺陷。例如,rate(98.5) return 5?我建议您使用平均值[0; 75[的半开区间来解决此问题,[75; 77[等。这使得范围是连续的,并且更容易看出你是否漏掉了什么。下一个观察是一个范围的结束是下一个范围的开始,所以你只需要存储它们。如果你返回,那么你就我不需要else,所以组合后会是这样的。如果是ave > 100,会发生什么?

if(ave < 75)
   return 5;
if(ave < 77)
   return 3;
// ..

字符串
1.(未固定)首选双精度浮点数。
1.(未修正)考虑为一个学生创建一个结构体,其中包含您需要的所有信息。然后创建一个包含3个学生的数组。
1.(未修复)请考虑使用查找表和循环来消除修订后的rate()函数中的重复项:

struct {
    float max; // exclusive
    float rate;
 } grade[] = {
    {75, 5},
    {77, 3}
    // ...
 };
 size_t i = 0;
 for(; i < sizeof grade / sizeof *grade - 1; i++)
     if(ave < grade[i].max)
          return grade[i].rate;
 // what should happen if ave > 100?
 return grade[i].rate;


下面是生成的代码:

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

#define max 3
#define NAME_LEN 49
#define str(s) str2(s)
#define str2(s) #s

float average(int a, int b, int c) {
    return (a+b+c) / 3;
}

void display(FILE *f, char n[max][NAME_LEN+1], int q1[max], int q2[max], int q3[max], float ave[max], float rating[max]) {
    fprintf(f, "\nStudent Grade Record\n");
    fprintf(f, "\n\nNo. Name \t Quiz_1 \t Quiz_2 \t Quiz_3 \t Average \t Rating");
    for(int i=0; i < max; i++) {
        fprintf(f, "\n%i.) %s \t\t%i \t\t%i \t\t%i \t\t%.2f \t\t%.2f", i+1, n[i], q1[i],
            q2[i], q3[i], ave[i], rating[i]);
    }
}

void getscore(char *name, int *grade1, int *grade2, int *grade3) {
    printf("\nStudent Name: ");
    scanf("%" str(NAME_LEN) "s", name);

    printf("\nQuiz Score#1: ");
    scanf("%i", grade1);

    printf("\nQuiz Score#2: ");
    scanf("%i", grade2);

    printf("\nQuiz Score#3: ");
    scanf("%i", grade3);
}

float rate(float ave) {
    if(ave < 75)
        return 5;
    if(ave < 77)
        return 3;
    if(ave < 80)
        return 2.75;
    if(ave < 80)
        return 2.75;
    if(ave < 84)
        return 2.5;
    if(ave < 88)
        return 2.25;
    if(ave < 91)
        return 2;
    if(ave < 94)
        return 1.75;
    if(ave < 97)
        return 1.5;
    if(ave < 99)
        return 1.25;
    // what should happen if ave > 100?
    return 1;
}

int main() {
    FILE *file = fopen("output.txt", "a");
    if(!file) {
        fprintf(stderr, "could not open file\n");
        return 1;
    }
    float rating[max];
    float ave[max];
    char n[max][NAME_LEN+1];
    int q1[max], q2[max], q3[max];
    for(int i = 0; i<max; i++) {
        printf("\t\tInput Student Record");
        printf("\nStudent# %i", i+1);
        getscore(n[i], &q1[i], &q2[i], &q3[i]);
        ave[i] = average(q1[i], q2[i], q3[i]);
        rating[i] = rate(ave[i]);
    }
    FILE *handles[] = {stdout, file};
    for(size_t i = 0; i < sizeof handles / sizeof *handles; i++)
        display(handles[i], n, q1, q2, q3, ave, rating);
    fclose(file);
}

相关问题