如何将指针合并到我完成的 C 程序中?

问题描述 投票:0回答:1

我刚刚完成了今天到期的 2 个 C 程序,但是当我的教授检查我的工作时,他告诉我在其中加入指针。我们还没有学过指针,我真的很难理解他的意思。我尝试添加通过在线教程学到的东西,但它只会导致多个错误,而且我无法使其工作。我目前正在努力,但我的截止日期现在确实是我的问题。这个网站是我最后的手段,我希望有人能帮助我。我真的只是不想让这 2 个项目获得 F 级。

我的第一个程序是学生记录。我想要将学生的姓名、分数 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 在线教程中学到的东西,但这只导致了一行又一行的错误。

c pointers file-handling
1个回答
0
投票

尚不清楚您是否希望像现在一样将

display()
输出到标准输出和文件、仅显示到文件,还是使用不同的显示和文件格式。下面演示了通过传递
FILE *
来显示并使用
fprintf()
代替打印来写入文件。如果您想要不同的格式,请为文件输出创建替代的
display()
函数。

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

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

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 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) {
    /*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;
}

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.