2015-04-19 3 views
0

Я очень новичок в программировании, поэтому, пожалуйста, простите мое невежество. Я уже пытался найти, как использовать scanf, и попробовал различные способы его использования, но я все равно получаю сообщение об ошибке после того, как попытаюсь ввести первый ввод. Когда я пытался запустить программу с заданным номером, она работает (вплоть до моей второй проблемы, к которой я обращусь), поэтому я знаю ее первый scanf. Я ценю любую помощь. Вот что я пытаюсь работать на:Ошибка для scanf и нескольких входов

//C code 
#include <stdio.h> 
using namespace std; 

int main() { 
    //Declare variables 
    char StudentName[100]; 
    float Avg; 
    int Sum, Students, TotalStudents, TotalClasses, Classes, A, B, C, D, F; 

    A=4; 
    B=3; 
    C=2; 
    D=1; 
    F=0; 

    //This is where the problem begins. 
    //I want to allow the user to input the number of students 
    //being graded. "Enter the number of students being graded" 
    //comes up fine. 
    printf ("Enter the number of students being graded."); 
    scanf ("%i", TotalStudents); 

    //First loop 
    for (Students = 0; Students<1; Students++){ 
     Avg =0.0; 
     printf ("Enter Student Name \n"); 
     scanf ("%s", StudentName); 
     printf ("Enter Number of Classes \n"); 
     scanf ("%f", TotalClasses); 
     for (Classes = 0; Classes < TotalClasses; Classes++){ 

      printf ("Enter Letter Grade for Class \n"); 
      //The second problem starts here. I am trying to find a way to 
      //allow the user to input the letter grade and add all the grades 
      //together. After that I want it to find the average for that 
      //student before moving on to the next student. 
      //I know my code is completely wrong but I don't know how to correct 
      //it based off of the examples I have seen 
      scanf ("%i", A || B || C|| D || F); 
      Sum = Sum + A || B || C|| D || F; 

     } 
    Avg = Sum/TotalClasses; 
    printf ("%s's average is %f \n", StudentName, Avg); 
    } 

    return 0; 
} 

ответ

0

Есть куча ошибок здесь:

Во-первых, там, где вы используете scanf, например:

scanf ("%i", TotalStudents); 

Изменить его Scanf ("% я", & TotalStudents);

Во-вторых, первая часть scanf является спецификатором формата, поэтому, если у вас есть %f, аргументы должны быть плавающего типа.

scanf ("%f", TotalClasses); 

Здесь TotalClasses является int. Таким образом, либо измените его на float, либо измените спецификатор формата на %i.

Оценки букв: Предполагая, что ввод является целым числом, и вы хотите использовать их сумму.

scanf ("%i %i %i %i %i", &A,&B,&C,&D,&F); 
     Sum = Sum + A + B + C + D + F; 

Кроме того, еще одна вещь, вы можете рассмотреть некоторые переменные (например, Sum) как float, так как оператор Avg = Sum/TotalClasses; является целочисленное деление, поэтому некоторые значения (после десятичной точки, как 12/5 = 2.00 в целочисленном делении) могут быть потеряны.

Ideone ссылка на полный код: http://ideone.com/ur3M2v

Полный код:

#include <stdio.h> 
using namespace std; 

int main() { 
//Declare variables 
char StudentName[100]; 
float Avg,TotalClasses; 
int Students, TotalStudents, Sum, Classes, A, B, C, D, F; 
char c; 
A=4; 
B=3; 
C=2; 
D=1; 
F=0; 

//This is where the problem begins. 
//I want to allow the user to input the number of students 
//being graded. "Enter the number of students being graded" 
//comes up fine. 
printf ("Enter the number of students being graded."); 
scanf ("%i", &TotalStudents); 

//First loop 
for (Students = 0; Students<TotalStudents; Students++){ 
    Avg =0.0; 
    printf ("Enter Student Name \n"); 
    scanf ("%s", StudentName); 
    printf ("Enter Number of Classes \n"); 
    scanf ("%f", &TotalClasses); 
    for (Classes = 0; Classes < TotalClasses; Classes++){ 

     printf ("Enter Letter Grade for Class \n"); 
     //The second problem starts here. I am trying to find a way to 
     //allow the user to input the letter grade and add all the grades 
     //together. After that I want it to find the average for that 
     //student before moving on to the next student. 
     //I know my code is completely wrong but I don't know how to correct 
     //it based off of the examples I have seen 
scanf (" %c", &c); 
    switch(c) 
{ 
    case 'A': Sum+=A; 
        break; 
    case 'B': Sum+=B; 
        break; 
case 'C': Sum+=C; 
        break; 
case 'D': Sum+=D; 
        break; 
case 'F': Sum+=F; 
        break; 
} 

    } 
Avg = Sum/TotalClasses; 
printf ("%s's average is %f \n", StudentName, Avg); 
} 

return 0; 
} 

Для обнаружения пустого входа для StudentName, замените scanf("%s,StudentName); с

char c= getchar();  // line 1 
fgets(StudentName,100,stdin); // line 2 
int i = strlen(StudentName)-1; // line 3 
if(StudentName[ i ] == '\n') // line 4 
    StudentName[i] = '\0'; // line 5 
    if(i==0) {printf("exiting"); break;} // line 6 

Объяснения для этого кода:

line 1: Это c просто для хранения буфера. В предыдущей строке у нас есть \n, поэтому, когда мы используем fgets для ввода, он сохраняет это значение \n и не принимает дальнейшего ввода.

line 2: Здесь мы берем фактический ввод для нашей строки, используя fgets. Почему не scanf? Поскольку он перестает принимать ввод после столкновения с пробелом, а его разделитель является символом новой строки, т. Е. Он ожидает, что новая строка завершит сканирование.

line 3: Мы сохраняем длину строки в i.

line 4: если условие - если последний символ строки является \n, то ...

line 5: Преобразовать что последний символ \0, потому что, как строки должны быть прекращены.

line 6: если условие - если длина строки равна 0, то есть пользователю просто нажать enter, распечатать сообщение и выйти из цикла.

0

Основываясь на моем понимании на вашей проблемы, вы хотите, чтобы пользователь ввести буквенную - A, B, C, D, F.

Теперь этот код прямо здесь не имеет смысла, потому что scanf принимает входные данные% i - целочисленную базу 10 (больше информации: http://alvinalexander.com/programming/printf-format-cheat-sheet) и присваивает ее после запятой.

scanf ("%i", A || B || C|| D || F); 

A A || B и т. Д. Является условным, поэтому не имеет смысла назначать целочисленный ввод пользователя условному ...

0

Для использования scanf вам необходимо передать два аргумента, формат того, что вы сканирования и адрес переменной, которую вы назначаете. Оператором & является получение адреса переменной. Это будет выглядеть следующим образом:

scanf("%i", &someVariable); 

Формат% я или% d для целых чисел,% е для поплавков и% с для персонажей.

Также || оператор - логический оператор OR, используемый для сравнения, и его нельзя использовать таким образом.

0

Вам необходимо понять, как работает scanf(). scanf занимает не менее 2 параметров. Первый параметр будет содержать тип переменной, которую необходимо захватить (%d - целое число, %s - строка, %c - символ и т. Д.). Второй параметр содержит адрес переменной, который будет содержать то, что пользователь ввел.

Вот фрагменты кода, которые вам нужно заменить:

scanf ("%i", TotalStudents); должен быть scanf ("%i", &TotalStudents);

for (Students = 0; Students<1; Students++){ должен быть for (Students = 0; Students<TotalStudents; Students++){

scanf ("%i", A || B || C|| D || F); 
Sum = Sum + A || B || C|| D || F; 

должен быть

scanf ("%i %i %i %i %i", &A,&B,&C,&D,&F); 
Sum += A + B + C + D + F; 

Также. ..

scanf ("%f", TotalClasses); должно быть scanf ("%i", &TotalClasses);

Смежные вопросы