C - программа границы класса, потенциальная ошибка времени выполнения?

Целью этой программы является определение минимального количества баллов, необходимых на экзамене для получения определенной оценки. Например. пользователь введет ТЕСТ 5 10 10 ПРОЕКТ 9 10 15, что означает, что тест получил 5/10 и стоит 10% их оценки, а проект 9/10 стоит 15% их оценки.

Я написал эту программу и жестко закодировал информацию, но теперь, когда я прошу пользователя ввести информацию, мне не удается пройти печать внутри цикла for. Кто-нибудь может помочь? Я думаю, что это занимает слишком много времени, когда я оставил программу работать примерно на полчаса, мне удалось заставить ее распечатать «Всего», но не более того.

РЕДАКТИРОВАТЬ: здесь ожидаемый результат. И вот то, что я получаю в данный момент.


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

#define P 50
#define H3 65
#define H2b 70
#define H2a 75
#define H1 80
#define MAX 10

typedef char name_t[MAX];
typedef struct {
    name_t name;
    double mark;
    double outof;
    double weight;
    double total;
} assesment_t;


int main(int argc, char **argv){
    assesment_t Subject[MAX];
    /*---------------------------------------------------------------------------*/    
    printf("\n\nEnter information in this order separated by a space\n");
    printf("When all info entered, press enter\n");
    printf("(Include exam but enter the Mark bit as 0):\n");
    printf("Name    Mark    OutOf   Weight\n\n");
    /*---------------------------------------------------------------------------*/    
    int i, n;
    double total = 0;
    /*---------------------------------------------------------------------------*/    
    for(i = 0;(scanf("%s %lf %lf %lf", &Subject[i].name,&Subject[i].mark,&Subject[i].outof,&Subject[i].weight)) == 4;i++) {

        if(i == 0) {
            printf("Name\tMark\tOut of\tWeight\tTotal");   
        }

        Subject[i].total = ( (Subject[i].mark/Subject[i].outof) * Subject[i].weight );

        printf("\n%s\t%2.1lf\t%2.1lf\t%2.2lf\t%2.2lf", Subject[i].name, Subject[i].mark,
            Subject[i].outof, Subject[i].weight, Subject[i].total);
    }
    /*---------------------------------------------------------------------------*/       
    n = i;
    for( i = 0; i <= n; i++) {
        total += Subject[i].total;
    }
    printf("\nTotal: %3.2lf\n\n", total);
    /*---------------------------------------------------------------------------*/        
    double grade, result;
    for( grade = 23; grade <= 60; grade++) {
        result = (grade / Subject[i-1].outof) * Subject[i-1].weight;
        if(total + result > P && (total + result - 1) < P)
            printf("minimum of %2.0lf is needed for FAIL\n", grade);
        else if(total + result > H3 && (total + result - 1) < H3)
            printf("minimum of %2.0lf is needed for P\n", grade);
        else if(total + result > H2b && (total + result - 1) < H2b)
            printf("minimum of %2.0lf is needed for H3\n", grade);
        else if(total + result > H2a && (total + result - 1) < H2a)
            printf("minimum of %2.0lf is needed for H2b\n", grade);
        else if(total + result > H1 && (total + result - 1) < H1)
            printf("minimum of %2.0lf is needed for H2a\n", grade);
        else if(total + result > H1 && (total + result - 1) < H1)
            printf("minimum of %2.0lf is needed for H1\n", grade);
        else
            ;
    }
    /*---------------------------------------------------------------------------*/
    return 0;
}

person LollyW    schedule 16.11.2014    source источник
comment
1) for( i = 0; i <= n; i++) { --› for( i = 0; i < n; i++) { 2) result = (grade / Subject[i-1].outof) * Subject[i-1].weight; : i неверное значение.   -  person BLUEPIXY    schedule 16.11.2014
comment
@BLUEPIXY Спасибо! Исправлены эти ошибки, однако ни одна из них не помогает среде выполнения. Этот вопрос не дает мне покоя весь день! Любая идея, почему он делает то, что делает или, скорее, не делает?   -  person LollyW    schedule 16.11.2014
comment
@LollyW У вас есть условие отказа в цикле for как scanf("%s %lf %lf %lf", &Subject[i].name,&Subject[i].mark,&Subject[i].outof,&Subject[i].weight)) == 4, почему бы не просто i<MAX   -  person Gopi    schedule 16.11.2014
comment
@Gopi Меня научили этой структуре, чтобы цикл for продолжал работать до тех пор, пока пользователь не перестанет вводить данные. Проблема, которую я обнаружил, заключается в том, что цикл for работает нормально, но ничего за пределами цикла for, кажется, не работает, что сбивает меня с толку, потому что все это работало, когда я жестко закодировал информацию. Эту структуру я использовал много раз без каких-либо проблем.   -  person LollyW    schedule 16.11.2014
comment
@LollyW Итак, вы имеете в виду, что вы вводите МАКСИМАЛЬНОЕ (10) количество элементов в свою структуру, а позже, после подсчета суммы, вы устанавливаете i=1? Вы делаете это?   -  person Gopi    schedule 16.11.2014
comment
@Gopi Я не совсем уверен, что понимаю твой вопрос. Переменная i повторно используется после цикла for, поскольку это просто счетная или «приятельская» переменная. Это отвечает на ваш вопрос? Пользователь должен ввести строку, а затем три двойных числа, в противном случае условие защиты/отказа нарушается.   -  person LollyW    schedule 16.11.2014
comment
Скомпилировать со всеми предупреждениями и отладочной информацией (gcc -Wall -Wextra -g). Затем используйте отладчик (gdb), чтобы понять, как и почему программа ведет себя неправильно.   -  person Basile Starynkevitch    schedule 16.11.2014
comment
@LollyW Проверьте приведенный ниже код, в вашем цикле не было условия прерывания, это то, что я хотел передать.   -  person Gopi    schedule 16.11.2014
comment
@BasileStarynkevitch Я уже компилирую с помощью -Wall, и компиляция как с -Wall, так и с -Wextra не дала мне никаких новых ошибок.   -  person LollyW    schedule 16.11.2014
comment
@LollyW ошибка - это ошибка времени выполнения. Ошибка компилятора не является ошибкой. Кроме того, включите всю необходимую информацию в сам вопрос. Затем, как предложил Базиль, научитесь пользоваться отладчиком. Это сделает вашу жизнь бесконечно проще.   -  person dandan78    schedule 16.11.2014
comment
@ dandan78 Это мой первый вопрос здесь, хотя я часто использую веб-сайт, чтобы помочь в учебе, поэтому не был уверен, что включить в вопрос, я разместил всю информацию, которую считал уместной. Я смотрю в отладчик прямо сейчас.   -  person LollyW    schedule 16.11.2014
comment
@user3121023 user3121023 Вот как я это закончил, потому что в противном случае программа будет продолжать ждать ввода от пользователя, однако остальная часть программы должна выполняться, но этого не происходит! Очень раздражает!   -  person LollyW    schedule 16.11.2014
comment
Вы должны ввести CTRL+Z в конце ввода (вместо CTRL+C).   -  person BLUEPIXY    schedule 16.11.2014
comment
ЗАПУСТИТЬ ДЕМО   -  person BLUEPIXY    schedule 16.11.2014
comment
Вам нужно научиться пользоваться отладчиком. Отладка не может быть полностью и надежно автоматизирована (читайте о проблеме остановки...). Так что вам нужно думать о вашей программе с помощью отладчика.   -  person Basile Starynkevitch    schedule 16.11.2014
comment
или проверил mark==0 как условие завершения цикла.   -  person BLUEPIXY    schedule 16.11.2014


Ответы (1)


Пожалуйста, взгляните на приведенные ниже изменения, и я вижу, что у меня все работает нормально: после расчета суммы вы должны установить i=1, и в цикле for должно быть условие прерывания, например if(i>10) break;. Я сделал несколько других изменений, запустите код и посмотрите Я вижу int с двойной арифметикой, которая может не дать ожидаемого результата. Проверьте ссылку ниже: in-c">Могу ли я сравнить и добавить число с плавающей запятой к целому числу в C?

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

#define P 50
#define H3 65
#define H2b 70
#define H2a 75
#define H1 80
#define MAX 10 

typedef char name_t[MAX];
typedef struct {
    name_t name;
    double mark;
    double outof;
    double weight;
    double total;
} assesment_t;


int main(int argc, char **argv){
    assesment_t Subject[MAX];
       double grade=0, result=0;
    /*---------------------------------------------------------------------------*/    
    printf("\n\nEnter information in this order separated by a space\n");
    printf("When all info entered, press enter\n");
    printf("(Include exam but enter the Mark bit as 0):\n");
    printf("Name    Mark    OutOf   Weight\n\n");
    /*---------------------------------------------------------------------------*/    
    int i, n;
    double total = 0;
    /*---------------------------------------------------------------------------*/    
    for(i = 0;i<10;i++) {
scanf("%s %lf %lf %lf", &Subject[i].name,&Subject[i].mark,&Subject[i].outof,&Subject[i].weight);
        if(i == 0) {
            printf("Name\tMark\tOut of\tWeight\tTotal");   
        }

        Subject[i].total = ( (Subject[i].mark/Subject[i].outof) * Subject[i].weight );

        printf("\n%s\t%2.1lf\t%2.1lf\t%2.2lf\t%2.2lf", Subject[i].name, Subject[i].mark,
            Subject[i].outof, Subject[i].weight, Subject[i].total);
    }
    /*---------------------------------------------------------------------------*/       
    n = i;
    for( i = 0; i < n; i++) {
        total += Subject[i].total;
    }

    printf("\nTotal: %3.2lf\n\n", total);
    /*---------------------------------------------------------------------------*/        
 i= 1;
         while(i<=10){
for( grade = 23; grade <= 60; grade++) {
    result = (grade / Subject[i-1].outof) * Subject[i-1].weight;
    printf("%lf\n",result);
    if((total + result) > P && (total + result - 1) < P)
        printf("minimum of %2.0lf is needed for FAIL\n", grade);
    else if((total + result) > H3 && (total + result - 1) < H3)
        printf("minimum of %2.0lf is needed for P\n", grade);
    else if((total + result) > H2b && (total + result - 1) < H2b)
        printf("minimum of %2.0lf is needed for H3\n", grade);
    else if((total + result) > H2a && (total + result - 1) < H2a)
        printf("minimum of %2.0lf is needed for H2b\n", grade);
    else if((total + result) > H1 && (total + result - 1) < H1)
        printf("minimum of %2.0lf is needed for H2a\n", grade);
    else if((total + result) > H1 && (total + result - 1) < H1)
        printf("minimum of %2.0lf is needed for H1\n", grade);
        else
        printf("None of the above cases pass\n");

}
i++;
 }
    printf("Out of Loop\n");
    /*---------------------------------------------------------------------------*/
    return 0;
}
person Gopi    schedule 16.11.2014
comment
это все еще не работает для меня. Я получаю точно такой же результат. Получаете ли вы этот вывод? - person LollyW; 16.11.2014
comment
@LollyW Я не вижу ни одного из ваших случаев, проходящих в цикле for, но он выходит из цикла. Еще одна вещь, которую вы проверяете с помощью double, убедитесь, что она исправлена. - person Gopi; 16.11.2014
comment
Изображение, которое я связал, взято из жестко запрограммированной версии, поэтому ДОЛЖНО быть выводом, который я получаю, когда запускаю программу, а затем ввожу данные через командную строку, но это не так. - person LollyW; 16.11.2014
comment
@LollyW Пожалуйста, проверьте приведенный выше код сейчас. Это должно дать вам надлежащие результаты. - person Gopi; 16.11.2014