2016-03-26 32 views
1

numaralı belgede yayınlanırken, bir kullanıcı, sonraki bir hesaplamada kullanılmak üzere belirli bir koşul kümesinde bir değişken girdisi girmeye çalışıyorum. Yani, vmax değerini aşamaz, sıfırdan düşük olamaz ve bir dize olamaz., koşullar

Elde ettiğim şey budur.

do 
    { 
     scanf("%f", &vkmh); 
     if (vkmh <= vmax) 
     { 
     }   
     else if (vkmh < 0) 
     { 
      printf("Error, speed must be positive.\n"); 
     } 
     else if (vkmh > vmax) 
     { 
      printf("Error, the max speed of this vehicle is listed as %.fkm/h.\nIt cannot exceed that value. Please enter a value under %.f.\n", vmax, vmax); 
     } 
     else if (vkm != getchar()) 
     { 
      printf("Error in input. Please only use numbers\n"); 
     } 
    } 
    while(vkmh > vmax || vkmh < 0 || vkm != getchar()); 

Teorik olarak geçerli değerler geçerli bir yanıt döndürmedi ve Vmax üzerinde bir değer geçersiz bir yanıt verir ve yeniden girmek için kullanıcı ister. Ama bir negatif ya da bir dize hiçbir şey döndürmez.

Bunu nasıl çalıştırabilirim konusunda herhangi bir fikir var mı?

+0

Sadece bir uyarı. Eğer (vkmh <= vmax) {X} yapsaydı, (vkmh <= 0) {Y} 'ifadesi, "vmax> = 0" olduğunda asla "Y" dalını yürütmez. – Marian

+0

Peki, bu şartlar için ayrı operasyonlar anlatmaktan nasıl bahsederim? –

+0

Her seferinde bir şey yapma kavramını duydunuz mu? –

cevap

2

Sen sana ne ulaşmak için aşağıdaki kodu kullanabilirsiniz arıyoruz. Cevap bu cevabın o çok benzer olduğuna dikkat edin:

How to scanf only integer and repeat reading if the user enter non numeric characters?

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

int clean_stdin() 
{ 
    while (getchar()!='\n'); 
    return 1; 
} 

int main() 
{ 
    float vkmh, vmax = 100.0; 

    setbuf(stdout, NULL); 

    vkmh = vmax + 1.0; /* value to start the loop */ 
    while (vkmh < 0 || vkmh > vmax) { 
     printf("Please enter value for the velocity in km/h: "); 
     if (scanf("%f",&vkmh) == 1) { 
      if (vkmh < 0) { 
       /* This was your 2nd if condition, but would never have executed assuming that vmax > 0. */ 
       printf("Error, speed must be positive.\n"); 
       exit(1); 
      } else if (vkmh <= vmax) { 
       /* Do something */ 
      } else { 
       /* No need for the else if, this is the only other possibility */ 
       printf("Error, the max speed of this vehicle is listed as %.fkm/h.\n" 
         "It cannot exceed that value. Please enter a value under %.f.\n", vmax, vmax); 
      } 
     } else { 
      printf("Error in input.\n"); 
      clean_stdin(); 
     } 
    } 
    printf("\nValue read: %f km/h\n",vkmh); 
    return 0; 
} 
0

İlk olarak bu C, C# değil. getchar standart girişten okuduğunuz her iterasyonda (en fazla) 3 kez getchar() ve 3 kez kullanıcı girişi okuyun. Böylece bu çağrıları kaldırabilirsiniz.

scanf işlevi, başarılı dönüşüm sayısını döndürerek, kullanıcının doğru bir float değeri girmediğini kontrol etmek için bunu kullanabilmeniz (== 1).

Düzenleme: Bu sayfadaki örnekte olduğu gibi, ben benim telefonda derleme olamaz olarak kod kaldırdık, üzgünüm Kullanım fgets/atof http://www.cplusplus.com/reference/cstdlib/atof/

+2

Bu yapı sayılar için iyi çalışır, ancak dizeleri çok iyi işlemez. Eğer "K" gibi bir şey koyarsanız, "Girişte Hata" mesajı tekrarlanır –

+0

Üzgünüm, bir durum değişkeni unuttum. Eğer C++ –

+0

kullanırsanız bool türüne değiştirin. 'Scanf ("% c ", &c);" içinde "if (scanf ("% f ", & vkmh)! = 1)' karakterini girdiğinizde karakterleri tüketebilirsiniz! –