вызвать функцию, используя да или нет

Я хочу конвертировать сумму в малайзийских ринггитах в ее эквивалент в долларах США. И я хочу написать программу на C, которая могла бы попросить пользователя ввести да или нет для продолжения последующей функции.

Я сделал некоторое кодирование

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

int main()
{

    char y, n, Y, N, ans;
    printf("\nWould you like to continue ?:\t");
    scanf("%c",&ans);

    switch (ans)
    {
        case 'y':
        case 'Y':
           convert();
           break;
        case 'N':
        case 'n':
           return(0);
           break;
        default:
            {
                return (0);
            }
            break;
            return 0;
    }

    while (ans==y || ans==Y);
        return main();

}

int convert () {
    float ia,ca;

    printf("\nEnter amount in Ringgit Malaysia : RM ");
    scanf("%f",&ia);

    ca=ia/3.30;

    printf("\nRM %.2f is equals to USD %.2f\n\n\n",ia,ca);

    return main();
}

Но мой вывод показан ниже

Would you like to continue ? : y
Enter amount in Ringgit Malaysia : RM 100
RM 100.00 is equals to USD 30.30


Would you like to continue ? : 
Would you like to continue ? : y
Enter amount in Ringgit Malaysia : RM 100
RM 100.00 is equals to USD 30.30

Would you like to continue ? : 
Would you like to continue ? : n

Мой вопрос: почему вопрос повторяется дважды?

Кстати вывод должен быть таким

Would you like to continue ? : y
Enter amount in Ringgit Malaysia : RM 100
RM 100.00 is equals to USD 30.30

Would you like to continue ? : y
Enter amount in Ringgit Malaysia : RM 100
RM 100.00 is equals to USD 30.30

Would you like to continue ? : n

person Aravin Nair    schedule 12.09.2014    source источник
comment
Почему вы рекурсивно вызываете main()? просто весело?   -  person ikh    schedule 12.09.2014
comment
Ваша функция преобразования снова вызывает Main(), поэтому она отображается дважды   -  person chiapa    schedule 12.09.2014
comment
Что вам действительно нужно, так это do-while loop   -  person CinCout    schedule 12.09.2014
comment
@chiapa Нет. Даже если рекурсия выглядит странно, в данном случае она не создает ошибок. (кроме stackoverflow, если мы используем эту программу много и много ›o‹)   -  person ikh    schedule 12.09.2014
comment
Ух ты, сколько ошибок в одной короткой программе... Для начала избавьтесь от этих операторов return main(). Если вы хотите повторить процесс после того, как пользователь ввел Y, просто используйте простой цикл.   -  person barak manos    schedule 12.09.2014
comment
Рекурсивный вызов main разрешен в C . .. но... почему? Даже страшное goto имело бы больше смысла. В этом коде есть некоторые серьезные проблемы с потоком - даже если он работает (что я не осмеливаюсь гарантировать, просто взглянув на него), это показывает, что OP серьезно нуждается в рассмотрении. повторное чтение о правильном использовании функций, циклов do-while и while и управлении потоком в целом.   -  person Jongware    schedule 12.09.2014


Ответы (4)


Это потому, что scanf оставляет \n во входном буфере. На самом деле вы вводите два символа: y и \n. scanf не стирает пробелы. (например: Простая программа дампа)

Чтобы очистить пробелы, вы можете заставить scanf сделать это.

scanf(" %c",&ia);
/*     ^                 */
/* additional whitespace */

Из cppreference,

любой одиночный символ пробела в строке формата потребляет все доступные последовательные символы пробела из ввода

Таким образом, дополнительные пробелы съедают '\n' и другие пробелы во входном буфере.

person ikh    schedule 12.09.2014

Мне удалось заставить его работать, и я разместил свой ответ ниже.

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

int main()
{

char y, n, Y, N, ans;
printf("\nWould you like to continue ?:\t");
scanf(" %c",&ans);


switch (ans)
{
case 'y':
case 'Y':
       convert();
break;
case 'N':
case 'n':
       return(0);
break;
default:
    {
        return (0);
    }
break;
return 0;
}

while (ans==y || ans==Y);
return main();
}

int convert (){
    float ia,ca;

    printf("\nEnter amount in Ringgit Malaysia : RM ");
    scanf("%f",&ia);

    ca=ia/3.30;

    printf("\nRM %.2f is equals to USD %.2f\n\n\n",ia,ca);

 return main();
}
person Aravin Nair    schedule 12.09.2014

Вот достойная рабочая версия, которую я придумал. это не на 100% идеально. Опять же, я не эксперт и использую свое собственное суждение о передовом опыте и т. Д. Мы очень ценим отзывы, поскольку я все еще учусь сам, я не студент, а просто учусь в свободное время. Причина, по которой я сделал это для начала, состоит в том, чтобы посмотреть, смогу ли я помочь решить проблему в процессе обучения и, возможно, узнать что-то для будущего использования.

/*
* Name: tomyr
* File: tomyr.c
* Description: Converts $USD to MYR (RM). 
* Author: Steven Medley <[email protected]>
* Copyright (c) 2016 Steven Medley.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
// stdlib.h is NOT needed.
int main()
  {
    float usdol; // used to store input as $USD.CC eg: 1.50 
    float myr = 3.30; // this rate (usd/myr) may not be up to date
    char answer; // stores the answer to continue
    do //Loops until you QUIT saying y or Y to continue
      {
        printf("Enter in USD to convert to MYR (Malasia Ringgit) $");
        scanf("%f", &usdol); //possible FIXME: fgets()?? but for this program as is, scanf works
        printf("$%.2f is equal to RM %.2f\n", usdol, usdol/myr);


        /*
        FIXME: i dont check length of answer and enter key acts as newline
               still expecting an answer to the question.
               can be a "2 birds, 1 stone" type of fix.
        */
        LABEL: printf("would you like to continue? y/Y/n/N: ");
        scanf(" %c", &answer);;

     }  
   while (answer == 'y' || answer == 'Y'); // see above comment next to "do".
   if (answer == 'n' || answer == 'N')
     {
       return 0;
     }
   else
     { // oops answer wasnt a Yy/Nn, attempt at error handling.
       printf ("That was an invalid answer.\n");
       goto LABEL; //possible FIXME: this works, but there could be a better way?.
     }
 }
person theoneandonly    schedule 15.02.2016

я не собираюсь делиться каким-либо кодом, потому что я не эксперт, но для меня имеет больше смысла использовать оператор IF ELSE для обработки того, что у вас есть переключатель, пусть convert() выполняет свою единственную работу по преобразованию и возвращает числовое значение в ваша основная функция, и пусть основная функция будет той, которая печатает («») результаты. как вы это реализуете, зависит от вас, я обнаружил, что это намного меньше кода и намного более организовано.

person theoneandonly    schedule 14.02.2016