for文が上手く回せません。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ジーラ

for文が上手く回せません。

#1

投稿記事 by ジーラ » 4年前

データベース(構造体)に登録してるキャラデータを削除する関数の動作テストをしています。
キャラデータを削除する部分のfor分が一回しか動いていないので困っています。
delete関数のcase2がキャラデータを削除する部分です。
キャラ番号1を削除すると入力した場合、
1,A 1:b 2:c 3:
2,B 1:e 2:f 3:
3,C 1:h 2:i 3:
4,D 1:k 2:l 3:
5,E 1:n 2:o 3:
となって欲しいのですが、
1,A 1:b 2:c 3:
2,B 1:d 2:e 3:f
3,C 1:g 2:h 3:i
4,D 1:j 2:k 3:l
5,E 1:m 2:n 3:o
となり、一回分しか処理できてないのです。
どう変えたらいいのか教えてください。
OSはwindows,コンパイラはgccです。

コード:

 
/*ファイルの取り込み*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*マクロ定義*/
#define max_data 100						//最大データ数の上限
#define max_item 100						//最大項目数の上限
#define max_word 50							//最大文字数の上限

/*グローバル変数宣言*/
struct Saved_data							//保存されている全データをまとめる構造体
{
	char item_name[max_word];				//item_name[(文字数)] この項目の名前
	char data[max_data][max_word];			//data[(データ番号)][(文字数)] 各データのこの項目に対する内容
} item[max_item];							//item[(項目番号)] 各項目についての構造体

int max_data_number;						//現在の全データ数
int max_item_number;						//現在の全項目数

void output(){
  if(max_item_number==0 && max_data_number==0){
    printf("ALL DELETED\n");
  }
  for(int i=0;i<5;i++){
    printf("%d,%s  ",i+1,item[i].item_name);			//項目番号と項目名
    for(int j=0;j<3;j++){
      printf("%d:%s ", j+1,item[i].data[j]);			//各項目の各キャラのデータ
    }
    printf("\n");
  }
}


void delete(int mode_delete){

int del_num;
int end=1;
switch (mode_delete){
	case 1:					//全データの削除
		max_data_number = 0;
		max_item_number = 0;
		for(int a = 0; a < max_item; a++){
			for(int b = 0; b < max_data; b++){
				for(int c = 0; c < max_word; c++){
					if(b == 0) item[a].item_name[c] = '\0';
					item[a].data[b][c] = '\0';
				}
			}
		}
		break;


	case 2:						//1キャラ削除
	while(end==1){
		output();
		while(1){
			del_num=0;
			printf("削除するキャラデータの番号を入力してください。\n");
			scanf("%d",&del_num);
			if(del_num>=1 && del_num<=max_data_number){
        del_num=del_num-1;
				break;
			} else {
				printf("無効な入力です。\n");
			}
		}
		for(int j=0;j<max_item_number;j++){
			for(del_num;del_num<max_data_number;del_num++){
				strcpy(item[j].data[del_num],item[j].data[del_num+1]);
			}
      for(int r=0;r<=max_word;r++){
			  item[j].data[max_data_number][r]='\0';
      }
    }
		max_data_number=max_data_number-1;		//1キャラ削除の終わり

    printf("他のキャラデータも削除しますか?\n");	//続行するか?
		while(1){
			printf("1:続行 2:終了\n");
			scanf("%d",&end);
				if(end!=1 && end!=2){
					printf("無効な入力です。\n");
				} else {
					break;
				}
			}
  }


  case 3:						//1項目の削除
  while (end==1) {
    output();
    while(1){
      del_num=0;
      printf("削除する項目の番号を入力してください。\n");
      scanf("%d",&del_num);
      if(del_num>=0 && del_num<=max_item_number){
        del_num=del_num-1;
        break;
      } else {
        printf("無効な入力です。\n");
      }
    }
    for(del_num;del_num<max_item_number;del_num++){
      item[del_num]=item[del_num+1];
    }
    for(int s=0;s<=max_word;s++){
      item[max_item_number].item_name[s]='\0';
    }
    for(int n=0;n<=max_data_number;n++){
      for(int t=0;t<=max_word;t++){
        item[max_item_number].data[n][t]='\0';
      }
    }							//項目削除の終わり。
    printf("他の項目も削除しますか?\n");	//続行するか?
    while(1){
      printf("1:続行 2:終了\n");
      scanf("%d",&end);
        if(end!=1 && end!=2){
          printf("無効な入力です。\n");
        } else {
          break;
        }
      }
  }
  default:
    break;
}
}

void input() {
  max_data_number=3;
  max_item_number=5;
  /*koumoku*/
    item[0].item_name[0]='A';
    item[1].item_name[0]='B';
    item[2].item_name[0]='C';
    item[3].item_name[0]='D';
    item[4].item_name[0]='E';
  /*de-ta*/
    item[0].data[0][0]='a';
    item[0].data[1][0]='b';
    item[0].data[2][0]='c';
    item[1].data[0][0]='d';
    item[1].data[1][0]='e';
    item[1].data[2][0]='f';
    item[2].data[0][0]='g';
    item[2].data[1][0]='h';
    item[2].data[2][0]='i';
    item[3].data[0][0]='j';
    item[3].data[1][0]='k';
    item[3].data[2][0]='l';
    item[4].data[0][0]='m';
    item[4].data[1][0]='n';
    item[4].data[2][0]='o';
}

int main(){
  int mode_delete;
  input();
  output();
  printf("どの様にデータを削除しますか? 対応する番号を入力してください。\n");
  printf("1:全データの削除、2:個別にキャラデータ削除、3:個別に項目削除\n");
  scanf("%d",&mode_delete);
  delete(mode_delete);
  output();
  return 0;
}


box
記事: 2002
登録日時: 13年前

Re: for文が上手く回せません。

#2

投稿記事 by box » 4年前

インデントがグダグダで読みづらいので、
整形し直したコードを貼ってください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

ジーラ

Re: for文が上手く回せません。

#3

投稿記事 by ジーラ » 4年前

言われて見直したら酷いことになってましたね。すいません。これでマシになったと思います。

コード:

/*ファイルの取り込み*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*マクロ定義*/
#define max_data 100	//最大データ数の上限
#define max_item 100	//最大項目数の上限
#define max_word 50		//最大文字数の上限

/*グローバル変数宣言*/
struct Saved_data	//保存されている全データをまとめる構造体
{
  char item_name[max_word];   //item_name[(文字数)] この項目の名前
  char data[max_data][max_word];   //data[(データ番号)][(文字数)] 各データのこの項目に対する内容
} item[max_item];	//item[(項目番号)] 各項目についての構造体

int max_data_number;	//現在の全データ数
int max_item_number;	//現在の全項目数

void output(){
  if(max_item_number==0 && max_data_number==0){
    printf("ALL DELETED\n");
  }
  for(int i=0;i<5;i++){
    printf("%d,%s  ",i+1,item[i].item_name);
    for(int j=0;j<3;j++){
      printf("%d:%s ", j+1,item[i].data[j]);
    }
    printf("\n");
  }
}


void delete(int mode_delete){

int del_num;
int end=1;
switch (mode_delete){
  case 1:	//全データの削除
  max_data_number = 0;
  max_item_number = 0;
  for(int a = 0; a < max_item; a++){
    for(int b = 0; b < max_data; b++){
      for(int c = 0; c < max_word; c++){
	if(b == 0) item[a].item_name[c] = '\0';
	item[a].data[b][c] = '\0';
      }
    }
  }
  break;


  case 2:	//1キャラ削除
  while(end==1){
    output();
    while(1){
      del_num=0;
      printf("削除するキャラデータの番号を入力してください。\n");
      scanf("%d",&del_num);
        if(del_num>=1 && del_num<=max_data_number){
          del_num=del_num-1;
	  break;
	} else {
	  printf("無効な入力です。\n");
	  }
	}
	for(int j=0;j<max_item_number;j++){
	  for(del_num;del_num<max_data_number;del_num++){
	    strcpy(item[j].data[del_num],item[j].data[del_num+1]);
	  }
          for(int r=0;r<=max_word;r++){
	    item[j].data[max_data_number][r]='\0';
          }
        }
	max_data_number=max_data_number-1;	//1キャラ削除の終わり

        printf("他のキャラデータも削除しますか?\n");	//続行するか?
	  while(1){
	    printf("1:続行 2:終了\n");
	    scanf("%d",&end);
	      if(end!=1 && end!=2){
	        printf("無効な入力です。\n");
	      } else {
	        break;
		}
	  }
  }


  case 3:	//1項目の削除
  while (end==1) {
    output();
    while(1){
      del_num=0;
      printf("削除する項目の番号を入力してください。\n");
      scanf("%d",&del_num);
      if(del_num>=0 && del_num<=max_item_number){
        del_num=del_num-1;
        break;
      } else {
        printf("無効な入力です。\n");
      }
    }
    for(del_num;del_num<max_item_number;del_num++){
      item[del_num]=item[del_num+1];
    }
    for(int s=0;s<=max_word;s++){
      item[max_item_number].item_name[s]='\0';
    }
    for(int n=0;n<=max_data_number;n++){
      for(int t=0;t<=max_word;t++){
        item[max_item_number].data[n][t]='\0';
      }
    }	//項目削除の終わり。
    printf("他の項目も削除しますか?\n");	//続行するか?
    while(1){
      printf("1:続行 2:終了\n");
      scanf("%d",&end);
        if(end!=1 && end!=2){
          printf("無効な入力です。\n");
        } else {
          break;
          }
    }
  }
  default:
    break;
}
}

void input() {
  max_data_number=3;
  max_item_number=5;
  /*仮項目*/
    item[0].item_name[0]='A';
    item[1].item_name[0]='B';
    item[2].item_name[0]='C';
    item[3].item_name[0]='D';
    item[4].item_name[0]='E';
  /*仮キャラデータ*/
    item[0].data[0][0]='a';
    item[0].data[1][0]='b';
    item[0].data[2][0]='c';
    item[1].data[0][0]='d';
    item[1].data[1][0]='e';
    item[1].data[2][0]='f';
    item[2].data[0][0]='g';
    item[2].data[1][0]='h';
    item[2].data[2][0]='i';
    item[3].data[0][0]='j';
    item[3].data[1][0]='k';
    item[3].data[2][0]='l';
    item[4].data[0][0]='m';
    item[4].data[1][0]='n';
    item[4].data[2][0]='o';
}

int main(){
  int mode_delete;
  input();
  output();
  printf("どの様にデータを削除しますか? 対応する番号を入力してください。\n");
  printf("1:全データの削除、2:個別にキャラデータ削除、3:個別に項目削除\n");
  scanf("%d",&mode_delete);
  delete(mode_delete);
  output();
  return 0;
}

加えて、

コード:

while(1){
  del_num=0;
  printf("削除するキャラデータの番号を入力してください。\n");
  scanf("%d",&del_num);
  if(del_num>=1 && del_num<=max_data_number){
    del_num=del_num-1;
    break;
  } else {
    printf("無効な入力です。\n");
    }
この部分も間違っているようで、実際に間違った入力をすると、延々と「無効な入力です。」が繰り返されてしまいます。ここも訂正点を教えていただければ幸いです。

ジーラ

Re: for文が上手く回せません。

#4

投稿記事 by ジーラ » 4年前

下の方は自己解決しました。

返信

“C言語何でも質問掲示板” へ戻る