2014-09-12 3 views
-2

Я хочу преобразовать сумму в Ringgit Malaysia к ее эквивалентному значению в USD. И я хочу написать программу на 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 
+0

Почему вы рекурсивно называете 'main()'? просто весело? – ikh

+1

Ваша функция преобразования вызывает 'Main()' еще раз, поэтому она показана дважды. – chiapa

+0

. Что вам действительно нужно, это цикл «do-while» – CinCout

ответ

1

Это потому, что scanf оставляет \n в буфере ввода. Фактически, вы вводите два символа: y и \n. scanf не стирает пробел. (например: Simple dump program)

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

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

С cppreference,

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

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

0

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

#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(); 
} 
-1

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

0

Вот достойная рабочая версия ive придумала. его не на 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?. 
    } 
} 
Смежные вопросы