2016-04-03 15 views
-3

Programlamada yeniyim, bu benim için zor. Kullanıcının ilk girdisi -999 ise programın bitmesine ihtiyacım var, eğer değilse o zaman account_num, last_name ve balance girişine devam ederler. Ancak kullanıcı ilk girdiden sonra -999'a girerse, girdilerini sonlandırır ve sonuçları görüntüler. İstemcimi [x] .account_num artan sıraya göre düzenlenirken bu -999 bölümünün nasıl çalıştığını anlayamıyorum .. Kodum aşağıda.Verilerimi nasıl sıralarım?

#include <stdio.h> 

void bubble_sort(int[], int); 

struct information 
{ 
    int  account_num; 
    char last_name[30]; 
    float balance; 
}; 

int main() 
{ 
    /* declare variables */ 
    struct information client[5]; 
    int  i, x, temp; 
    char  c; 

    /* Prompt user */ 
    printf ("Enter account number, last name, and balance.\n"); 
    printf ("Enter -999 to end input:\n\n"); 

    /* prompt user to enter number of people */ 
    x = 0; 
    while (client[x].account_num != -999) 
    { 
    int tmp; 
     scanf ("%i", &tmp); 
     /* if types -999 as their first input program ends */ 
     if (tmp == -999)  
     { 
      break; 
     } 
     else if (tmp < 1 || tmp > 1000) 
     { 
      printf ("*** Invalid account number. Please enter 1 - 1000 or -999 to exit ***\n"); 
     } 
     else 
     { 
     client[x].account_num = tmp; 
      x ++; 
     } 
     bubble_sort(client[x].account_num, i); 
     scanf("%s", client[x].last_name); 
     while ((c = getchar() != '\n') && c != EOF); /* clear input buffer. */ 
     scanf("%.2f", &client[x].balance); 
    } 

    for (x = 0; x < 5; x++) 
    printf("%i\n", &client[x].account_num); 

    return 0; 
}  

void bubble_sort(int list[], int i) 
{ 
    int e, d, t; 

    for (e = 0; e < (i - 1); e++) 
    { 
     for (d = 0; d < i - e - 1; d++) 
     { 
      if (list[d] > list[d + 1]) 
      { 
       /* swapping */ 
       t = list[d]; 
       list[d] = list[d + 1]; 
       list[d + 1] = t; 
      }/* end for*/ 
     }/*end for*/ 
    }/* end for */ 
}/* end function */ 

cevap

0

Burada birkaç sorun var. Öncelikle, hesap sahibine birden fazla hesap numarası ve bakiyesi olmak istemediğiniz sürece, account_num ve balance dizinlerini dizine eklemek istemezsiniz. Ayrıca for'un bir while döngü ile değiştirilmesini öneririm, böylece kullanıcı geçersiz bir hesap numarası girmesi durumunda döngü sayacı x ile uğraşmanıza gerek kalmaz. Son olarak, netlik sağlamak için giriş için geçici bir değişken tmp ekledim ve tüm testler gerçekleştirildi, içeriğin hesap yapısına tüm geçerlilik testleri geçtiyse atanması. tmp yalnızca while döngüsünün içinde gereklidir, bu yüzden onu main()'daki bildirimlerin bir parçası yapmak yerine orada açıkladım.

#include <stdio.h> 

#define MAX_CLIENTS 5 
#define MAX_ACCOUNTS 1000 

struct information 
{ 
    int  account_num; 
    char last_name[30]; 
    float balance; 
}; 

int main() 
{ 
    /* declare variables */ 
    struct information client[MAX_CLIENTS]; 
    int  i, x, people; 
    char  c; 

    /* Prompt user */ 
    printf ("Enter account number, last name, and balance.\n"); 
    printf ("Enter -999 to end input:\n\n"); 

    /* prompt user to enter number of people */ 
    x = 0; 
    while (x < MAX_CLIENTS) 
    { 
     int tmp; 
     scanf ("%i", &tmp); 

     /* if types -999 as their first input program ends */ 
     if (tmp == -999)  
     { 
      break; 
     } 
     else if (tmp < 1 || tmp > MAX_ACCOUNTS) 
     { 
      printf ("*** Invalid account number. Please enter 1 - %d or -999 to exit ***\n", MAX_ACCOUNTS); 
     } 
     else 
     { 
      client[x].account_num = tmp; 
      x ++; 
     } 
    } 

    return 0; 
} 
+0

Çok teşekkür ederim, bunu yapmayı nasıl yapacağımı anlamaya çalışıyorum. Her denediğimde, sadece "Geçersiz" satırını çıkarırdım. – user5932832

+0

Ama nasıl olsun, döngü sadece 5 satırdan sonra bitmeyecek? Nasıl -999 giriş – user5932832

+0

@ user5932832 ise sonunu nasıl bulabilirim? 5 istemciyi tutan istemci [5] 'yi tanımladınız, dolayısıyla döngü 5 girdiden sonra bitmelidir. Aksi halde, müşteri diziniz sınırların tükenmez. Kodu biraz daha parametrelendirdim, en üstte bir MAX_CLIENTS tanımı ekleyerek sadece maks. Tek bir yerde müşteri sayısı. Sonuçta, her şey ne elde etmek istediğinize bağlıdır - kullanıcının istemciyi belirtmesini isteyip istemediğinize, aynı istemcinin ayrıntılarını tekrar düzenlemeye izin vermek isteyip istemediğinize vb. işlevselliğin hangi yöne gitmesi gerektiği net değil. – Guido