Проблемы с циклированием и уменьшением в базовом консольном приложении

#c

#c

Вопрос:

В настоящее время я студент, изучающий программирование. В нашем задании нас попросили сделать игру в угадывание чисел. Инструктор дал схему для заполнения, чтобы помочь нам с проектом.

При запуске этой программы она принимает только одно предположение, печатает, что ответ «@» четыре раза, и делает это для количества выбранных игр.

Я, честно говоря, не могу понять, что я сделал не так. Я поместил исходный код ниже. Любая помощь приветствуется.

Для открытия с файлом letterList.txt , У меня есть текстовый документ в том же каталоге со списком букв, каждая из которых находится в другой строке.

 #define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#define MAXGUESSES 5



//this function provides instructions to the user on how to play the game
void LetterGuessRules();

//this function runs one game.
//input: character from the file, void return type
//all other functions to Play one round of a game
//are called from within the GuessTheLetter function
void GuessTheLetter(char);

//this function prompts the player to make a guess and returns that guess
//this function is called from inside the GuessTheLetter( ) function described above
char GetTheGuess();

//this function takes two arguments, the guess from the player
//and the solution letter from the file.
//The function returns 1 if the guess matches the solution and returns a 0 if they do not match
//This function also lets the user know if the guess comes alphabetically before or after the answer 
int CompareLetters(char, char);

int main()
{
//declare additional variables
//declare FILE pointer
FILE *inPtr;
int numGames = 0, i = 0;
char letter;//letter from file
//display game rules
LetterGuessRules();

//Ask and get number of games to play
printf("nHow many games would you like to play?n");
scanf("%d", amp; numGames);
//connect to the file HINT: use fopen
inPtr = fopen("letterList.txt", "r");

            //this for loop will allow the player to play more than one game
            //without recompiling
for (i = 0; i < numGames; i  )
{
    //get a solution letter from file - use fscanf
    fscanf(inPtr, " %c", amp;letter);

    //change the solution to lowercase
    letter = tolower(letter);

    //call the GuessTheLetter function and pass it the solution
    GuessTheLetter(inPtr);


}

//close file pointer
return 0;
}

//this function runs one game. 
//input: character from the file, void return type
//all other functions to Play one round of a game 
//are called from within the GuessTheLetter function
//this function lets the user know if they have won or lost the game
void GuessTheLetter(char solution)
{
int win = 0;
int numGuesses = 0;
char playerguess = 0;
//declare additional variables 

while (numGuesses < MAXGUESSES amp;amp; win == 0)
{
    //get a guess from the user  by calling the GetTheGuess function
    GetTheGuess("playerguess");
    //change the guess to lowercase
    playerguess = tolower;
    printf(" %c", playerguess);
    //win = call the function to compare the guess with the solution
    win = CompareLetters(solution, playerguess);
    numGuesses  ;//count the number of guesses so far
}
//use conditions to let the user know if they won or lost the round of the game
if (win == 0)
{
    printf("nSorry, you lost that round.");
}
else
{
    printf("Congratulations, you won that round");
}
}

//this function provides instructions to the user on how to play the game
void LetterGuessRules()
{
printf("Guess a letter by typing it in then pressing enter.nThe Game will tell you where your guessed letter is in the alphabetncompared to the location of the correct letter.");
}

//this function prompts the player to make a guess and returns that guess
//this function is called from inside the GuessTheLetter( ) function described above
char GetTheGuess(char guess)
{
printf("nWhat is your guess?n");
scanf(" %lf", amp;guess);
return guess;
}

//this function takes two arguments, the guess from the player
//and the solution letter from the file.
//The function returns 1 if the guess matches the solution and returns a 0 if they do not match
//This function also lets the user know if the guess comes alphabetically before or after the answer 
int CompareLetters(char solution, char guess)
{
if (solution == guess)
{
    return 1;
}
else
{
    return 0;
}
}
  

Комментарии:

1. Сколько символов в файле letterList.txt ? Всегда ли это будут хотя бы numGames символы?

2. Кроме того, пожалуйста, не начинайте вывод с новой строки, заканчивайте на ней. Это потому, что выходные данные, записываемые stdout (то есть то, на что printf записывается), по умолчанию буферизуются по строкам. Это означает, что новая строка очистит буфер и фактически выполнит запись на консоль. Если у вас есть начальная новая строка, она будет печатать предыдущую строку, а не текущую строку.

3. GetTheGuess() возвращает значение. playerguess похоже, это означало сохранение значения. Ваш вызов tolower in GuessTheLetter сильно отличается от всех остальных…

4. В этом коде большое количество ошибок. Первое, что нужно сделать, это начать использовать прототипы функций — если функция не принимает аргументов, то помещается void в список параметров. Если вы сделаете это в своем коде, то вы начнете видеть некоторые сообщения, выдаваемые вашим компилятором, которые укажут вам, где находятся некоторые проблемы. Повысьте уровень предупреждения компилятора и устраните все проблемы, о которых он упоминает, перед запуском вашей программы.

Ответ №1:

Проблема, с которой вы столкнулись, заключается в следующем:

 //get a guess from the user  by calling the GetTheGuess function
GetTheGuess("playerguess");
//change the guess to lowercase
playerguess = tolower;
  

Прежде всего GetTheGuess , вызов функции не соответствует имеющемуся у вас объявлению прототипа. Это также не соответствует фактической реализации функции. И вы на самом деле не догадываетесь. Вы также не вызываете tolower , вы присваиваете указатель на функцию переменной playerguess .

Чтобы исправить это, оно должно выглядеть так

 //get a guess from the user  by calling the GetTheGuess function
playerguess = GetTheGuess(playerguess);  // Note: Not passing a string, and use the returned value
//change the guess to lowercase
playerguess = tolower(playerguess);  // Note: actually call the tolower function
  

Вам, конечно, нужно изменить объявление прототипа, чтобы оно соответствовало фактическому определению:

 char GetTheGuess(char guess);
  

Комментарии:

1. В точке вызова даже нет объявления прототипа

2. @M.M char GetTheGuess(); Над main функцией есть функция.

3. Это объявление, не являющееся прототипом, поскольку оно имеет пустой список параметров. Отсюда отсутствие ошибки компиляции для вызова GetTheGuess("playerguess");

4. Я все понимаю и внес изменения, но я сталкиваюсь с этим при попытке запустить его. Я запрашиваю первое предположение, затем запрашивает предположение еще 4 раза, но не запрашивает никаких входных данных. Затем сообщается, что игрок проиграл раунд. Это делает это количество раз, введенное при запросе, сколько игр игрок хочет сыграть. Чтобы ответить на ваш предыдущий вопрос, в letterList.txt досье. Инструктор сказал использовать только десять букв.