2017-03-17 17 views
0

phone変数を配列に格納して最初のswitch文で出力する方法を理解できません。コードを実行するたびに、最後に入力した要素が残り、残りの要素は無視されます。参照値を配列に格納する

#include <stdio.h> 
#define size 3 

void decompose(long long int n, int *area, int *prefix, int *line) { 

    int n1, n2, n3; 

    n1 = n/10000000; 
    n2 = (n/10000) % 1000; 
    n3 = (n/1) % 10000; 

    *area = n1; 
    *prefix = n2; 
    *line = n3; 
} 

/* main program */ 
int main(void) { 

    int option; 
    int phone, num; 
    int aaa, ppp, llll; 
    int i = 0; 
    long long int phoneNumber[size] = {0LL, 0LL, 0LL}; 


    printf("---=== Phone Numbers ===---\n\n"); 

    do { 
     // Display the Option List 
     printf("1. Display Phone List\n"); 
     printf("2. Add a Number\n"); 
     printf("0. Exit\n\n"); 
     printf("Please select from the above options: "); 
     scanf("%d", &option); 
     printf("\n"); 

     switch (option) { 

      case 0: // Exit the program 
       printf("Exiting Phone Number App. Good Bye!!!"); 
       break; 

      case 1: // Display the Phone List 
        // @IN-LAB 
       printf("Phone Numbers\n"); 
       printf("==============\n"); 
       // Display each number in decomposed form 
       for (i = 0; i < size; i++) { 
        printf("(%3d)-%3d-%4d", aaa, ppp, llll); 
        printf("\n"); 
       } 
       break; 

      case 2: // Add a Phone Number 
        // @IN-LAB 
       printf("Add a Number\n"); 
       printf("============\n"); 
       scanf("%d", &phone); 

       for (i = 0; i < size; i++) { 

        decompose(phone, &aaa, &ppp, &llll); 
        phoneNumber[i] = phone; 
       } 

      default: 
       printf("Invalid menu option\n"); 
       break; 
     } 

    } while (option != 0); 

    return 0; 
} 

答えて

0

あなたは、構成部品にそれを分割し、aaapppllllにそれらを保存する電話番号を入力します。 phoneNumberの3つの要素すべてに完全な数値を保存します。あなたが新しい番号を入力するたびに、それらの変数のすべての前の内容を上書きしてそのプロセスを繰り返します。

あなたのコードを見ると、エリアコード、接頭辞、および行の値に対して並列配列を作成できます。

struct phoneNumber { 
    int areaCode; 
    int prefix; 
    int line; 
} 

そして、それらの構造体の配列ます:struct phoneNumber phoneNumbers[size]をまたは、より良い、などこれらのフィールドが含まれていることstructを作成します。新しい電話番号を入力するときは、配列の最後の未使用エントリにピース/パーツを保存します。

0

私はそれが数字の実際の残りではなくアドレスを参照するだけであることを意味するのを見ます。なぜ私の分解変数がaaa、ppp、llllを参照しているのですか?それは主にあるときに動作するようだが、私はそれをすべて解消する機能をコンパクトに移動する。

ありがとうございました。私は本当にあなたの質問に答えて、それぞれが何をしているのかを説明する時間を割いていただき、ありがとうございます。

+0

私の答えへの追加を参照してください。 –

+0

改造を保存して削除してください。答えはコメントではありません。 –

0

電話番号を表示する際の主な問題は、「あなたは何番号を表示していますか?」です。数字を分解して表示する必要があります。現在、あなたはそれを印刷しようとする前に何も分解していません。 (あなたはまた、あなたが電話番号のコンポーネントを持つことができないとして表示するunsignedタイプを使用する必要があります...)

 case 1:    // Display the Phone List 
      // @IN-LAB 
      printf ("Phone Numbers\n"); 
      printf ("==============\n"); 
      // Display each number in decomposed form 
      for (i = 0; i < size; i++) { 
       if (!(phone = phoneNumber[i])) 
        break; 
       decompose (phone, &aaa, &ppp, &llll); 
       printf ("(%3d)-%3d-%4d", aaa, ppp, llll); 
       printf ("\n"); 
      } 
      break; 

同様に、服用入力:あなたはの線に沿って何かを必要とします完全な配列に値を追加しようとすることから守る必要があります(応答方法を選択できます)。どのスロットに番号を入れるつもりですか?現在配列内にある数の数を把握していません。これを行うには多くの方法がありますが、配列要素をゼロに初期化してから利用できる単純な関数は単純に配列全体をループし、0をチェックしてそのスロットを埋めるだけです。また、ユーザー入力を行うたびに、入力を完全に検証する必要があります。つまり、ユーザと入力した場合、と入力がキャンセルされたかどうかを確認するためにEOFを調べることを意味します(Ctrl + dまたはCtrl + zもう一つの考慮事項は、ユーザーがあなたの次のと大混乱のすべての種類を引き起こすことになるabcに入ることができるよう、様々な入力の間input buffer(例えばstdin)を空にすることである

long long int phone; 
    .... 
     case 2:    // Add a Phone Number 
      // @IN-LAB 

      for (i = 0; i < size; i++) /* check for next open slot */ 
       if (!phoneNumber[i]) 
        break; 

      if (i == size) /* if list full, throw error */ 
       fprintf (stderr, "error: list full.\n"); 
      else { 
       int rtn = 0; /* capture scanf return to check EOF */ 

       printf ("Add a Number\n"); 
       printf ("============\n"); 

       /* always validate input */ 
       if ((rtn = scanf ("%lld", &phone)) == 1) 
        phoneNumber[i] = phone; 
       else if (rtn == EOF) { /* user canceled with ctrl+d (or z) */ 
        fprintf (stderr, "NOTE: user canceled input, exiting.\n"); 
        return 0; 
       } 
       else /* user entered something stupid */ 
        fprintf (stderr, "error: invalid input.\n"); 
      } 

      break; /* don't fall-through default */ 

:あなたがに似た何かができる、ということやっscanf呼び出し。バッファを空にするには、'\n'またはEOFが見つかるまでスキャンします。:

do { 
    int c = 0; 
    .... 
    while ((c = getchar()) != '\n' && c != EOF) {} /* empty input buffer */ 

} while (option != 0); 

最後に、decompose機能は疑わしいです。アルゴリズムが正しいことを確認してください。さらなる助けが必要な場合はお知らせください。あなたがintlong long intを混合し、phoneをオーバーフローさ


理由あなたのdecompose

作業されていません。たとえばphoneNumberlong long intの配列ですが、intphoneになります。あなたが必要とする問題が解決するには:

long long int phone; 

をして、あなたは例えば、scanflong long intを読む必要が:

if ((rtn = scanf ("%lld", &phone)) == 1) /* always validate input */ 

注:%lld

使用例/出力

Please select from the above options: 2 

Add a Number 
============ 
8885551212 
1. Display Phone List 
2. Add a Number 
0. Exit 

Please select from the above options: 1 

Phone Numbers 
============== 
(888)-555-1212 
1. Display Phone List 
2. Add a Number 
0. Exit 

Please select from the above options: 0 

Exiting Phone Number App. Good Bye!!! 
関連する問題