Существует функция C с указателями и возвратом символа, которая возвращает только значение символа и 0 указателям. - PullRequest
0 голосов
/ 02 ноября 2019

Цель здесь - напечатать оценку (A, R или F) на основе средней ноты и одно значение для присутствия, а другое - для средней ноты, используя указатели для среднего и присутствия. Но после компиляции печатается только возвращаемое значение символа, остальные - 0.

Я пытался напечатать сохраненные значения по указателю присутствия * avg и *, но программа принимает значения оценки и присутствия. значения до сбоя.

#include <stdio.h>

char situation(float n1,float n2,float n3,int misses, int classes, float 
*avg, float *presence);

int main()
{
    float *avg,*presence,vet[3];
    int f,a,x;
    printf("Write the value of your notes \n");
    for(x=0;x<=2;x++)
    {
        printf("Note %d:",x+1);

        scanf("%f",&vet[x]);
    }
    printf("Misses: ");
    scanf("%d",&f);
    printf("Given: ");
    scanf("%d",&a);
    char outcome=situation(vet[0],vet[1],vet[2],f,a,&avg,&presence);
    printf("With an average of %f and presence of %f percent, your situation is %c",avg,presence,outcome);
    return 0;
    }

char situation(float n1,float n2,float n3,int misses, int classes, float 
*avg, float *presence)
{
char result;
*presence=((classes-misses)/classes)*100;
*avg=(n1+n2+n3)/3;
if(*presence>=0 && *presence<75)
{
    result='F';
}
if(*presence>=75 && *presence <=100)
{
    if(*avg>=0 && *avg<6);
    {
        result='R';
    }
    if(*avg>=6 && *avg<=10)
    {
        result='A';
    }
    if(*avg<0 || *avg>10)
    {
        result='x';
    }
}
if(*presence<0 || *presence>100)
{
    result='x';
}
return result;
}

Я ожидаю, что присутствие, среднее значение и результат будут напечатаны на экране пользователю, но это только даст значение результата char

Ответы [ 3 ]

0 голосов
/ 02 ноября 2019

Предупреждение компилятора прямо указывало на проблему. Вы должны изучить предупреждение и понять, что оно означает и почему оно было выпущено.

Ваша ошибка здесь:

float *avg,*presence

Они должны быть объявлены как float, а не float *.

0 голосов
/ 03 ноября 2019

У вашего кода есть одна главная проблема:

float *avg,*presence,

Когда вы звоните

char outcome=situation(vet[0],vet[1],vet[2],f,a,&avg,&presence);

Вы передаете адрес только что объявленному указателю. Изменяя значение в функции outcome, вы меняете адрес, на который указывают avg и presence, а не значение переменной.

Попробуйте изменить на

float avg,presence

Таким образом, когда вы изменяете значение (используя оператор *), вы меняете фактическое значение переменной.

Вы можете обнаружить, что presence по-прежнему будет отображаться как 0 на принтере. Это потому, что C работает с типами в арифметических операциях. Ваше подразделение имеет только ints, поэтому результатом будет int. Учитывая, что результат всегда будет >= 1, результат будет округлен до значения int, которое равно 0.

Чтобы исправить это, просто поместите значение с плавающей запятой в деление, и результат будет float.Что-то вроде:

*presence=((classes-misses)/(classes*1.0))*100;
0 голосов
/ 02 ноября 2019

avg - это указатель с плавающей точкой, вы отправляете его по указателю (& avg), поэтому ваша функция должна быть (int n1, ...., float ** avg, ...)

Попробуйтеотправьте avg без &. Дайте ему значение раньше (лучше)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...