嗨,我是C的新手,我写了一个简单的程序。如果用户选错了,我想重新启动程序,这里是代码:
#include <stdio.h>
#include <cs50.h>
int main(void){
char choices;
float math, pc, svt, eng, philo;
do {
do {
printf("Enter your math score: ");
math = GetFloat();
}
while( math>20 || math<0);
do {
printf("Enter your pc score: ");
pc = GetFloat();
}
while(pc>20 || pc<0);
do {
printf("Enter your svt score: ");
svt = GetFloat();
}
while(svt>20 || svt<0);
do {
printf("Enter your eng score: ");
eng = GetFloat();
}
while(eng>20 || eng<0);
do {
printf("Enter your philo score: ");
philo = GetFloat();
}
while(philo>20 || philo<0);
printf("Are you pc or sm?\n");
printf("Write 1 for pc. 2 for sm\n");
int choice = GetInt();
if(choice == 1){
float score = (math*7 + pc*7 + svt*7 + eng*2 + philo*2)/25;
printf("Your score is %.2f\n", score);
}
else if(choice == 2){
float score = (math*9 + pc*7 + svt*3+ eng*2 + philo*2)/23;
printf("Your score is %.2f\n", score);
}
else{
printf("You've picked the wrong choice \n");
}
printf("Do you want to try it again? (Y/N) ");
choices = getchar();
while (choices != '\n' && getchar() != '\n') {};
} while (choices == 'Y' || choices == 'y');
}
所以我的意思是,我想在else块中插入代码来重新启动程序并给用户另一次。如果我可以让他再次在1或2之间选择,那将是非常好的。
如果您有任何建议或改进,请不要犹豫,发表评论。 谢谢:))
答案 0 :(得分:2)
您需要的是do while
循环选择代码:
int choice;
do {
choice = GetInt();
if (choice == 1) {
float score = (math*7 + pc*7 + svt*7 + eng*2 + philo*2)/25;
printf("Your score is %.2f\n", score);
}
else if (choice == 2) {
float score = (math*9 + pc*7 + svt*3+ eng*2 + philo*2)/23;
printf("Your score is %.2f\n", score);
}
else {
printf("You've picked the wrong choice, try again.\n");
}
} while(choice < 1 || choice > 2)
答案 1 :(得分:0)
您已经有一个循环可以重试,您可以重用该循环来再次获取choice
的用户输入。因此,如果用户输入{1}}而不是1或2,则可以设置choice
并重做循环。无需用户输入。
代码如下。
choices = Y
答案 2 :(得分:-1)
好吧,如果读到这个的人必须实际重启他们的程序是出于一个更重要的原因(例如异常处理程序,就像我几分钟前一样),在C中有一种可移植的方式,如下所示: / p>
#include <setjmp.h> //from C standard library
jmp_buf restart_env;
int main() {
//some initialization you don't want to repeat
if(setjmp(restart_env)) {
//restarted, do whatever
}
//the code
}
void evenFromAnotherFunction() {
//...
if(something_that_justifies_this_approach) {
longjmp(restart_env, 1); //this restarts the program
//unreachable
}
//...
}
请注意,如果有更好的方法,最好不要使用它。使用setjmp必然会产生极其恼人的错误。如果你别无选择,请记住一些数据可能会在第一次调用setjmp之前保留它的值,而有些数据可能没有,所以不要假设任何事情。