質問編集履歴

4 誤字

Inabahitsuji

Inabahitsuji score 6

2016/03/20 13:47  投稿

C言語 線形リスト
初歩的な質問で非情に申し訳ないのですがどなたかお力添えをして頂けないでしょうか。
下記のコードの機能を新規作成、追加、ソートに変更したいのですが一向にうまくいかず、詰まっている状態です。
「機能説明」
・新規作成…番号、氏名、得点を入力
・追加…新規作成によって入力されたものをリストに格納
・ソート…番号順や得点順を昇順降順に切り替えれるもの
・追記・
質問内容の指摘ありがとうございます、こういった場で尋ねるのは初めてでどうお聞きすればいいのかさえ分からず本当に申し訳ありません…。
新しく作る「新規作成機能」は下記の「追加機能」を利用したいのですが、そのままでは上記の機能説明で言うところの「新規作成」と「追加」を同時に行ってしまうため、新規作成で入力・追加で格納するといった形にしたいのです。
構築環境
win10
visualStudio2915
visualStudio2015
「実行結果のイメージ」
メニューを入力して下さい
1.新規作成2.追加3.ソート4.終了
1
番号:xx
氏名:yy
得点:zz
新規作成が完了しました
このデータを追加する場合はメニューにて追加を選択して下さい
メニューを入力して下さい
1.新規作成2.追加3.ソート4.終了
まだ追加されていないデータがありますがよろしいですか?
1.はい2.いいえ
2
メニューを入力して下さい
1.新規作成2.追加3.ソート4.終了
2
追加が完了しました
メニューを入力して下さい
1.新規作成2.追加3.ソート4.終了
3
追加されたデータのソートを行います
1.番号順2.得点順
1
番号1 氏名xx 得点yy
```C言語
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 20
#define DATASIZE 100
   typedef struct address {
   int szNum; //番号
   char szName[10]; //氏名
   int szPoint; //得点
} Numress;
  int search(Numress *ap, int cnt);
  int add(Numress *ap, int cnt);
  int amend(Numress *ap, int cnt);
  int del(Numress *ap, int cnt);
  int printall(Numress *ap, int cnt);
  /* 関数のジャンプテーブル */
  int(*func[])(Numress *, int) = { search, add, amend, del, printall };
  /* 構造体の配列 -- 大きくてスタックを消費する可能性があるので静的に定義した */
  Numress ad[DATASIZE];
  //処理の選択
  int main(void)
  {
      char dummy[BUFSIZE];
      int i, cnt = 0;
      while (1) {
          puts("●メニューを入力して下さい");
          puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 5) cnt = func[i - 1](ad, cnt);
          else if (i == 6) break;
      }
      return 0;
  }
  int search(Numress *ap, int cnt)
  {
      char buf[BUFSIZE], dummy[BUFSIZE];
      char *target[] = { "番号", "氏名", "得点" };
      int i, j = 0, count = 0;
      Numress *t = ap;
      while (1) {
          puts("何で探しますか?\n1.番号 2.氏名 3.得点");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 3) break;
      }
      printf("%sを入力して下さい:", target[--i]);
      gets(buf);
      while (j++ < cnt) {
          switch (i) {
          case 0: /* 番号 */
              if (!strcmp(t->szNum, buf)) goto print;
              break;
          case 1: /* 氏名 */
              if (!strcmp(t->szName, buf)) goto print;
              break;
          case 2: /* 得点 */
              if (!strcmp(t->szPoint, buf)) goto print;
              break;
          default: /* no condition、ここには来ない */
              break;
          }
          t++;
          continue;
      print:;
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", j, t->szNum, t->szName, t->szPoint);
          t++;
          count++;
      }
      printf("%d件Hit\n", count);
      return cnt;
  }
  int add(Numress *ap, int cnt)
  {
      Numress *t = ap + cnt;
      if (cnt == DATASIZE) {
          puts("これ以上追加できません");
          return cnt;
      }
      printf("番号:");
      gets(t->szNum);
      printf("氏名:");
      gets(t->szName);
      printf("得点:");
      gets(t->szPoint);
      return cnt + 1;
  }
  int amend(Numress *ap, int cnt)
  {
      Numress *t;
      char buf[BUFSIZE];
      int i;
      puts("何番を修正しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          t = ap + i - 1; /* 配列のアドレスの計算 */
          puts("変更しない場合は単に[return]を押して下さい");
          printf("番号: %s -> ", t->szNum);
          gets(buf);
          if (strlen(buf)) strcpy(t->szNum, buf);
          printf("氏名: %s -> ", t->szName);
          gets(buf);
          if (strlen(buf)) strcpy(t->szName, buf);
          printf("得点: %s -> ", t->szPoint);
          gets(buf);
          if (strlen(buf)) strcpy(t->szPoint, buf);
      }
      else
          puts("番号が不適切です");
      return cnt;
  }
  int del(Numress *ap, int cnt)
  {
      char buf[BUFSIZE];
      int i, j;
      puts("何番を削除しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          for (j = i - 1; j < cnt - 1; j++)
              ap[j] = ap[j + 1];
          return cnt - 1;
      }
      puts("番号が不適切です");
      return cnt;
  }
  int printall(Numress *ap, int cnt)
  {
      int i = 0;
      while (i < cnt) {
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", ++i, ap->szNum, ap->szName, ap->szPoint);
          ap++;
      }
      return cnt;
  }
```
  • C

    5650 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

3 追記

Inabahitsuji

Inabahitsuji score 6

2016/03/20 13:29  投稿

C言語 線形リスト
初歩的な質問で非情に申し訳ないのですがどなたかお力添えをして頂けないでしょうか。
下記のコードの機能を新規作成、追加、ソートに変更したいのですが一向にうまくいかず、詰まっている状態です。
「機能説明」
・新規作成…番号、氏名、得点を入力
・追加…新規作成によって入力されたものをリストに格納
・ソート…番号順や得点順を昇順降順に切り替えれるもの
 
 
・追記・  
質問内容の指摘ありがとうございます、こういった場で尋ねるのは初めてでどうお聞きすればいいのかさえ分からず本当に申し訳ありません…。  
 
新しく作る「新規作成機能」は下記の「追加機能」を利用したいのですが、そのままでは上記の機能説明で言うところの「新規作成」と「追加」を同時に行ってしまうため、新規作成で入力・追加で格納するといった形にしたいのです。  
 
構築環境  
win10  
visualStudio2915  
 
 
「実行結果のイメージ」  
メニューを入力して下さい  
1.新規作成2.追加3.ソート4.終了  
1  
番号:xx  
氏名:yy  
得点:zz  
 
新規作成が完了しました  
このデータを追加する場合はメニューにて追加を選択して下さい  
 
メニューを入力して下さい  
1.新規作成2.追加3.ソート4.終了  
 
まだ追加されていないデータがありますがよろしいですか?  
1.はい2.いいえ  
2  
 
メニューを入力して下さい  
1.新規作成2.追加3.ソート4.終了  
2  
 
追加が完了しました  
 
メニューを入力して下さい  
1.新規作成2.追加3.ソート4.終了  
3  
 
追加されたデータのソートを行います  
1.番号順2.得点順  
1  
 
番号1 氏名xx 得点yy  
```C言語
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 20
#define DATASIZE 100
   typedef struct address {
   int szNum; //番号
   char szName[10]; //氏名
   int szPoint; //得点
} Numress;
  int search(Numress *ap, int cnt);
  int add(Numress *ap, int cnt);
  int amend(Numress *ap, int cnt);
  int del(Numress *ap, int cnt);
  int printall(Numress *ap, int cnt);
  /* 関数のジャンプテーブル */
  int(*func[])(Numress *, int) = { search, add, amend, del, printall };
  /* 構造体の配列 -- 大きくてスタックを消費する可能性があるので静的に定義した */
  Numress ad[DATASIZE];
  //処理の選択
  int main(void)
  {
      char dummy[BUFSIZE];
      int i, cnt = 0;
      while (1) {
          puts("●メニューを入力して下さい");
          puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 5) cnt = func[i - 1](ad, cnt);
          else if (i == 6) break;
      }
      return 0;
  }
  int search(Numress *ap, int cnt)
  {
      char buf[BUFSIZE], dummy[BUFSIZE];
      char *target[] = { "番号", "氏名", "得点" };
      int i, j = 0, count = 0;
      Numress *t = ap;
      while (1) {
          puts("何で探しますか?\n1.番号 2.氏名 3.得点");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 3) break;
      }
      printf("%sを入力して下さい:", target[--i]);
      gets(buf);
      while (j++ < cnt) {
          switch (i) {
          case 0: /* 番号 */
              if (!strcmp(t->szNum, buf)) goto print;
              break;
          case 1: /* 氏名 */
              if (!strcmp(t->szName, buf)) goto print;
              break;
          case 2: /* 得点 */
              if (!strcmp(t->szPoint, buf)) goto print;
              break;
          default: /* no condition、ここには来ない */
              break;
          }
          t++;
          continue;
      print:;
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", j, t->szNum, t->szName, t->szPoint);
          t++;
          count++;
      }
      printf("%d件Hit\n", count);
      return cnt;
  }
  int add(Numress *ap, int cnt)
  {
      Numress *t = ap + cnt;
      if (cnt == DATASIZE) {
          puts("これ以上追加できません");
          return cnt;
      }
      printf("番号:");
      gets(t->szNum);
      printf("氏名:");
      gets(t->szName);
      printf("得点:");
      gets(t->szPoint);
      return cnt + 1;
  }
  int amend(Numress *ap, int cnt)
  {
      Numress *t;
      char buf[BUFSIZE];
      int i;
      puts("何番を修正しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          t = ap + i - 1; /* 配列のアドレスの計算 */
          puts("変更しない場合は単に[return]を押して下さい");
          printf("番号: %s -> ", t->szNum);
          gets(buf);
          if (strlen(buf)) strcpy(t->szNum, buf);
          printf("氏名: %s -> ", t->szName);
          gets(buf);
          if (strlen(buf)) strcpy(t->szName, buf);
          printf("得点: %s -> ", t->szPoint);
          gets(buf);
          if (strlen(buf)) strcpy(t->szPoint, buf);
      }
      else
          puts("番号が不適切です");
      return cnt;
  }
  int del(Numress *ap, int cnt)
  {
      char buf[BUFSIZE];
      int i, j;
      puts("何番を削除しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          for (j = i - 1; j < cnt - 1; j++)
              ap[j] = ap[j + 1];
          return cnt - 1;
      }
      puts("番号が不適切です");
      return cnt;
  }
  int printall(Numress *ap, int cnt)
  {
      int i = 0;
      while (i < cnt) {
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", ++i, ap->szNum, ap->szName, ap->szPoint);
          ap++;
      }
      return cnt;
  }
```
  • C

    5650 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2 誤字

Inabahitsuji

Inabahitsuji score 6

2016/03/20 03:34  投稿

C言語 線形リスト
初歩的な質問で非情に申し訳ないのですがどなたかお力添えをして頂けないでしょうか。
下記のコードの機能を新規作成、追加、ソートに変更したいのですが一向にうまくいかず、詰まっている状態です。
「機能説明」
・新規作成…番号、氏名、得点を入力
・追加…新規作成によって入力されたものをリストに格納
・ソート…番号順や得点順を昇順降順に切り替えれるもの
```C言語
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 20
#define DATASIZE 100
   typedef struct address {
   int szNum; //番号
   char szName[10]; //氏名
   int szPoint; //得点
} Numress;
  int search(Numress *ap, int cnt);
  int add(Numress *ap, int cnt);
  int amend(Numress *ap, int cnt);
  int del(Numress *ap, int cnt);
  int printall(Numress *ap, int cnt);
  /* 関数のジャンプテーブル */
  int(*func[])(Numress *, int) = { search, add, amend, del, printall };
  /* 構造体の配列 -- 大きくてスタックを消費する可能性があるので静的に定義した */
  Numress ad[DATASIZE];
  //処理の選択
  int main(void)
  {
      char dummy[BUFSIZE];
      int i, cnt = 0;
      while (1) {
          puts("●メニューを入力して下さい");
          puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 5) cnt = func[i - 1](ad, cnt);
          else if (i == 6) break;
      }
      return 0;
  }
  int search(Numress *ap, int cnt)
  {
      char buf[BUFSIZE], dummy[BUFSIZE];
      char *target[] = { "番号", "氏名", "得点" };
      int i, j = 0, count = 0;
      Numress *t = ap;
      while (1) {
          puts("何で探しますか?\n1.番号 2.氏名 3.得点");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 3) break;
      }
      printf("%sを入力して下さい:", target[--i]);
      gets(buf);
      while (j++ < cnt) {
          switch (i) {
          case 0: /* 番号 */
              if (!strcmp(t->szNum, buf)) goto print;
              break;
          case 1: /* 氏名 */
              if (!strcmp(t->szName, buf)) goto print;
              break;
          case 2: /* 得点 */
              if (!strcmp(t->szPoint, buf)) goto print;
              break;
          default: /* no condition、ここには来ない */
              break;
          }
          t++;
          continue;
      print:;
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", j, t->szNum, t->szName, t->szPoint);
          t++;
          count++;
      }
      printf("%d件Hit\n", count);
      return cnt;
  }
  int add(Numress *ap, int cnt)
  {
      Numress *t = ap + cnt;
```  
      if (cnt == DATASIZE) {
          puts("これ以上追加できません");
          return cnt;
      }
      printf("番号:");
      gets(t->szNum);
      printf("氏名:");
      gets(t->szName);
      printf("得点:");
      gets(t->szPoint);
      return cnt + 1;
  }
  int amend(Numress *ap, int cnt)
  {
      Numress *t;
      char buf[BUFSIZE];
      int i;
      puts("何番を修正しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          t = ap + i - 1; /* 配列のアドレスの計算 */
          puts("変更しない場合は単に[return]を押して下さい");
          printf("番号: %s -> ", t->szNum);
          gets(buf);
          if (strlen(buf)) strcpy(t->szNum, buf);
          printf("氏名: %s -> ", t->szName);
          gets(buf);
          if (strlen(buf)) strcpy(t->szName, buf);
          printf("得点: %s -> ", t->szPoint);
          gets(buf);
          if (strlen(buf)) strcpy(t->szPoint, buf);
      }
      else
          puts("番号が不適切です");
      return cnt;
  }
  int del(Numress *ap, int cnt)
  {
      char buf[BUFSIZE];
      int i, j;
      puts("何番を削除しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          for (j = i - 1; j < cnt - 1; j++)
              ap[j] = ap[j + 1];
          return cnt - 1;
      }
      puts("番号が不適切です");
      return cnt;
  }
  int printall(Numress *ap, int cnt)
  {
      int i = 0;
      while (i < cnt) {
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", ++i, ap->szNum, ap->szName, ap->szPoint);
          ap++;
      }
      return cnt;
  }
  }
```
  • C

    5650 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1 誤字

Inabahitsuji

Inabahitsuji score 6

2016/03/20 03:34  投稿

C言語 線形リスト
初歩的な質問で非情に申し訳ないのですがどなたかお力添えをして頂けないでしょうか。
下記のコードの機能を新規作成、追加、ソートに変更したいのですが一向にうまくいかず、詰まっている状態です。
「機能説明」
・新規作成…番号、氏名、得点を入力
・追加…新規作成によって入力されたものをリストに格納
・ソート…番号順や得点順を昇順降順に切り替えれるもの
```C言語
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 20
#define DATASIZE 100
   typedef struct address {
   int szNum; //番号
   char szName[10]; //氏名
   int szPoint; //得点
} Numress;
  int search(Numress *ap, int cnt);
  int add(Numress *ap, int cnt);
  int amend(Numress *ap, int cnt);
  int del(Numress *ap, int cnt);
  int printall(Numress *ap, int cnt);
  /* 関数のジャンプテーブル */
  int(*func[])(Numress *, int) = { search, add, amend, del, printall };
  /* 構造体の配列 -- 大きくてスタックを消費する可能性があるので静的に定義した */
  Numress ad[DATASIZE];
  //処理の選択
  int main(void)
  {
      char dummy[BUFSIZE];
      int i, cnt = 0;
      while (1) {
          puts("●メニューを入力して下さい");
          puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 5) cnt = func[i - 1](ad, cnt);
          else if (i == 6) break;
      }
      return 0;
  }
  int search(Numress *ap, int cnt)
  {
      char buf[BUFSIZE], dummy[BUFSIZE];
      char *target[] = { "番号", "氏名", "得点" };
      int i, j = 0, count = 0;
      Numress *t = ap;
      while (1) {
          puts("何で探しますか?\n1.番号 2.氏名 3.得点");
          scanf("%d", &i); gets(dummy);
          if (1 <= i && i <= 3) break;
      }
      printf("%sを入力して下さい:", target[--i]);
      gets(buf);
      while (j++ < cnt) {
          switch (i) {
          case 0: /* 番号 */
              if (!strcmp(t->szNum, buf)) goto print;
              break;
          case 1: /* 氏名 */
              if (!strcmp(t->szName, buf)) goto print;
              break;
          case 2: /* 得点 */
              if (!strcmp(t->szPoint, buf)) goto print;
              break;
          default: /* no condition、ここには来ない */
              break;
          }
          t++;
          continue;
      print:;
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", j, t->szNum, t->szName, t->szPoint);
          t++;
          count++;
      }
      printf("%d件Hit\n", count);
      return cnt;
  }
  int add(Numress *ap, int cnt)
  {
      Numress *t = ap + cnt;
```  
      if (cnt == DATASIZE) {
          puts("これ以上追加できません");
          return cnt;
      }
      printf("番号:");
      gets(t->szNum);
      printf("氏名:");
      gets(t->szName);
      printf("得点:");
      gets(t->szPoint);
      return cnt + 1;
  }
  int amend(Numress *ap, int cnt)
  {
      Numress *t;
      char buf[BUFSIZE];
      int i;
      puts("何番を修正しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          t = ap + i - 1; /* 配列のアドレスの計算 */
          puts("変更しない場合は単に[return]を押して下さい");
          printf("番号: %s -> ", t->szNum);
          gets(buf);
          if (strlen(buf)) strcpy(t->szNum, buf);
          printf("氏名: %s -> ", t->szName);
          gets(buf);
          if (strlen(buf)) strcpy(t->szName, buf);
          printf("得点: %s -> ", t->szPoint);
          gets(buf);
          if (strlen(buf)) strcpy(t->szPoint, buf);
      }
      else
          puts("番号が不適切です");
      return cnt;
  }
  int del(Numress *ap, int cnt)
  {
      char buf[BUFSIZE];
      int i, j;
      puts("何番を削除しますか?");
      scanf("%d", &i); gets(buf);
      if (i > 0 && i <= cnt) {
          for (j = i - 1; j < cnt - 1; j++)
              ap[j] = ap[j + 1];
          return cnt - 1;
      }
      puts("番号が不適切です");
      return cnt;
  }
  int printall(Numress *ap, int cnt)
  {
      int i = 0;
      while (i < cnt) {
          printf("%d: 番号:%s 氏名:%s 得点:%s\n", ++i, ap->szNum, ap->szName, ap->szPoint);
          ap++;
      }
      return cnt;
  }
  • C

    5650 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る