修正処理の作成の仕方を教えていただけないでしょうか

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

修正処理の作成の仕方を教えていただけないでしょうか

#1

投稿記事 by komatyuwa » 13年前

OBJS = main.o input.o txtcorrect.o retrieval.o output.o
CC = gcc
name_manage:$(OBJS)
$(CC) $(OBJS) -o name_manage
main.o:main.c variable.h
$(CC) -c main.c
input.o:input.c variable.h
$(CC) -c input.c
txtcorrect.o: calcreate.c variable.h
$(CC) -c txtcorrect.c
retrieval.o:retrieval.c variable.h
$(CC) -c retrieval.c
output.o:output.c variable.h
$(CC) -c output.c
clean:
rm -f $(OBJS)

#include<stdio.h>
#define MAX 100

struct name{
int p_id;
char p_name[20];
int p_kokugo;
int p_suugaku;
int p_shakai;
int p_rika;
int p_eigo;
int sum;
double av;

}student[MAX];



#include "variable.h"

void input(void);
void output(void);
void retrieval(void);
void txtcorrect(void);

main(){
int mno;

END =0;
while(1){
printf("\n=====成績管理システムメニュー ======\n\n");
printf("1:入力処理\n");
printf("2:検索処理\n");
printf("3:出力処理\n");
printf("4:修正処理\n");
printf("5:終了\n");
printf("メニュー番号を選んでください:");
scanf("%d",&mno);

switch(mno){
case 1:
input();
break;

case 2:
retrieval();
break;
case 3:
output();
break;

case 4:
txtcorrect();
break;


default:
break;
}
if(mno ==5)
break;
}
}
#include "variable.h"

input(){
int i;

printf("\n===入力処理===\n\n");
printf("終了するときは0を入力してください。\n");

for(i=END;i<MAX;i++){
printf("%d番目の学生のIDを入力してください:",i+1);
scanf("%d",&student.p_id);
if(student.p_id==0)
break;
printf("%d番目の学生の名前を入力してください:",i+1);
scanf("%s",student.p_name);
printf("%d番目の学生の国語の成績を入力してください:",i+1);
scanf("%d",&student.p_kokugo);
printf("%d番目の学生の数学の成績を入力してください:",i+1);
scanf("%d",&student.p_suugaku);
printf("%d番目の学生の社会の成績を入力してください:",i+1);
scanf("%d",&student.p_shakai);
printf("%d番目の学生の理科の成績を入力してください:",i+1);
scanf("%d",&student.p_rika);
printf("%d番目の学生の英語の成績を入力してください:",i+1);
scanf("%d",&student.p_eigo);
}
END = i;
}

#include "variable.h"

retrieval(){
int i,no;
double av;
int sum=0, hyouka;


while(1){
printf("\n===検索処理===\n\n");
printf("終了する時は0を入力してください。\n");
printf("検索する学生のIDを入力してください:\n");
scanf ("%d",&no);

if(no==0)
break;

for(i=0;i<END;i++){
if(no==student.p_id){
printf("名前は%sで",student.p_name);
printf("国語の成績は%dで\n",student[i].p_kokugo);
printf("数学の成績は%dで\n",student[i].p_suugaku);
printf("社会の成績は%dで\n",student[i].p_shakai);
printf("理科の成績は%dで\n",student[i].p_rika);
printf("英語の成績は%dで\n",student[i].p_eigo);

sum+=student[i].p_kokugo+student[i].p_suugaku+student[i].p_shakai+student[i].p_rika+student[i].p_eigo;
student[i].sum=sum;
printf("合計は%dで\n",student[i].sum);

av=sum/i+1;
student[i].av=av;
printf("平均は%gです。\n",student[i].av);
break;
}
}
if(i==END)
printf("登録されいてません\n\n");
}
}

#include"variable.h"

output(){
int i;
printf("\n===出力処理===\n\n");

for(i=0;i<END;i++){
printf("%d番目の学生のIDは%dで",i+1,student[i].p_id);
printf("名前%sで",student[i].p_name);

}
}

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#2

投稿記事 by みけCAT » 13年前

意味がわかりません。
修正処理とはなんですか?メニューにありますね。仕様を教えてください。
コードはcodeタグで囲んでいただけるとありがたいです。

ここの処理は不自然に思えますが、正しい仕様ですか?

コード:

av=sum/i+1;
student[i].av=av;
printf("平均は%gです。\n",student[i].av);
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

komatyauwa

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#3

投稿記事 by komatyauwa » 13年前

おっしゃるとうりでした。
修正プログラムでは入力したデータが間違っていた場合のため、もう一度入力するようにしたかったです。
わかりづらくてすいません。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#4

投稿記事 by みけCAT » 13年前

入力処理のコードをもとにして、最初に修正する学生のIDを入力させます。
検索処理の要領で、そのIDの対応するstudentの添字を見つけます。
そのあと、入力処理のiの代わりにその添字を使用して、入力させます。
ループ、ENDの変更はせず、終了(メニューに戻る)します。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

komatyuwa

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#5

投稿記事 by komatyuwa » 13年前

ありがとうございます。やってみます。

komatyuwa

Re: 削除処理の作成の仕方を教えていただけないでしょうか

#6

投稿記事 by komatyuwa » 13年前

おかげさまで修正処理はできました。
次に削除処理を作りたいのですがどのようにすれば良いでしょうか?
学生のIDを入力してその学生のデータだけを削除したいです。
度々申し訳ありません。

non
記事: 1097
登録日時: 15年前

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#7

投稿記事 by non » 13年前

削除の方法として何通りかあると思いますが、どの方法をお望みでしょうか?

方法1 検索と同じように削除するデータを見つけ、それ以降のデータを前につめENDを一つ減らす。

方法2 削除するデータを見つけ、そのデータと最後のデータを交換し、ENDを一つ減らす。

方法3 削除するデータを見つけ、そのデータに削除した印(たとえばP_IDを0にするとか)をつける。
  ただし、新規追加する場合に、この印がついた場所にデータを格納することになる。

一番簡単なのは方法1かな。処理に一番時間がかかるけど。
non

komatyuwa

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#8

投稿記事 by komatyuwa » 13年前

削除処理を作ってみましたが格納される値が0になってしまいます。
やってることが根本的に間違っていると思うのですがどうですか?

コード:

#include "variable.h"

sakujo(){
    int i;
    int no;
    int kno;
    int ano;

   
    while(1){
    printf("\n===削除処理===\n\n");
    printf("終了する時は0を入力してください。\n");
    printf("削除する学生のIDを入力してください:\n");
    scanf ("%d",&no);

    if(no==0)
      break;

     
   for(i=0;i<END;i++){
     if(no==student[i].p_id){

    printf("全データをす削除る場合は1を、部分的に削除する場合は2を入力してください。\n");
    scanf("%d",&ano);

   if(ano==1){
     student[i].p_kokugo=student[END-1].p_kokugo;

     student[i].p_suugaku=student[END-1].p_suugaku;

     student[i].p_shakai=student[END-1].p_shakai;

     student[i].p_rika=student[END-1].p_rika;

     student[i].p_eigo=student[END-1].p_eigo;
    }
    if(ano==2)
    {
   
    printf("修正するデータを選んでください。\n");
    printf("1:名前 2:国語の成績 3:数学の成績 4:社会の成績 5:理科の成績 6:英語の成績\n");
    scanf("%d",&kno);
 
   switch(kno)
    {   
    case 1:
      break;
   
    case 2:
      student[i].p_kokugo=student[END-1].p_kokugo;
     break;

    case 3:
      student[i].p_suugaku=student[END-1].p_suugaku;
     break;

    case 4:
     student[i].p_shakai=student[END-1].p_shakai;
     break;

    case 5:
     student[i].p_rika=student[END-1].p_rika;
     break;

    case 6:
     student[i].p_eigo=student[END-1].p_eigo;
     break;

     default:
      break;
}
  }
   else{
     printf("数字が間違っています");
   }

 
   break;
     }
 }
    if(i==END)
      printf("登録されいてません\n\n");
   }
    }

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#9

投稿記事 by みけCAT » 13年前

この「部分的に削除」がある意味がわかりません。

擬似コードでアルゴリズムを書いてみました。わかりにくかったらすみません。

コード:

削除ID←削除する学生のIDを入力

loop {
	削除IDと同じIDを持つ学生を検索
		見つかれば、それを削除添字に代入して次へ
		見つからなければループを抜ける

	for i=削除添字,削除添字+1, ... ,データ数-1 {
		student[i]←student[i+1]
	}
	データ数を1減らす
}

終了(メニューへ)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

komatyuwa

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#10

投稿記事 by komatyuwa » 13年前

データ数を1減らすということがわかりません。
どうやれば、いいんですか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#11

投稿記事 by みけCAT » 13年前

コード:

END--;
ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

komatyuwa

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#12

投稿記事 by komatyuwa » 13年前

部分削除は難しいと思ったので後回しにします。
とりあえず全削除の方を作りたいと思うので修正すべき点をお願いします。
 

コード:

if(ano==1){

     student[i].p_name=student[i+1].p_name;;
   
     student[i].p_kokugo=student[i+1].p_kokugo;
 
     student[i].p_suugaku=student[i+1].p_suugaku;
 
     student[i].p_shakai=student[i+1].p_shakai;
 
     student[i].p_rika=student[i+1].p_rika;
 
     student[i].p_eigo=student[i+1].p_eigo;

     END--;
    }

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#13

投稿記事 by みけCAT » 13年前

ループで削除したい要素以降の全ての要素に対して処理を行ってください。

コード:

if(ano==1){
    int j;

    for(j=i;j+1<END;j++) {
        student[j].p_name=student[j+1].p_name;

        student[j].p_kokugo=student[j+1].p_kokugo;

        student[j].p_suugaku=student[j+1].p_suugaku;

        student[j].p_shakai=student[j+1].p_shakai;

        student[j].p_rika=student[j+1].p_rika;

        student[j].p_eigo=student[j+1].p_eigo;
    }

    END--;
    i--; /* 削除した要素の次の要素の処理をスキップしないため */
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
Tatu
記事: 445
登録日時: 15年前
住所: 北海道

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#14

投稿記事 by Tatu » 13年前

名前と5教科の成績のみ詰めているようですが
IDや成績の合計、平均は詰めなくてもよいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 修正処理の作成の仕方を教えていただけないでしょうか

#15

投稿記事 by みけCAT » 13年前

コード:

student[j]=student[j+1];
のようにして、構造体は直接代入ができます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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