構造体のプログラム

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

構造体のプログラム

#1

投稿記事 by rayban.jp » 3年前

構造体についてのC言語のプログラミングです。

構造体を使用して家庭教師のとりますめをします。
希望金額をscanfで入力し、金額の差が少ない三人を表示するというものです。
順番に三人だけ表示することはできたのですが、並び替えをうまく行えません。
アロー演算子を使っていますがそれ以外でも大丈夫です。
お助けください

ソース

#include<stdio.h>
#include <string.h>
#include<math.h>

struct teacher {
int number;
char *name;
int kane;
int gakunen;
};

int main(){
struct teacher katei[15]={
1,"Andou",10000,2,
2,"Inoue",20000,1,
3,"Ueno",15000,2,
4,"Endou",18000,3,
5,"Okazaki",22000,3,
6,"Katou",13000,1,
7,"Simizu",17000,2,
8,"Tsuda",25000,3,
9,"Nemoto",21000,2,
10,"Hotta",19000,1,
11,"Miura",30000,3,
12,"Yamazaki",29000,3,
13,"Wada",14000,1,
14,"Fujii",23000,1,
15,"Jinbo",28000,2,
};
int i;
int x;
int j,tmp;

struct teacher *p;
p = katei;

scanf("%s",x);

/*x -= (p+i)->kane;
printf("%d\n",abs(x));
for(i=0;i<15;++i){
for(j=i+1;j<15;++j){
if(x>(p+i)->kane){
tmp=(p+i)->kane;
(p+i)->kane = (p+i)->kane[j];
(p+i)->kane[j] = tmp;
}
}
}
*/

for(i=0;i<3;i++){
printf("%d円、(%d) %s \n",(p+i)->kane,(p+i)->gakunen,(p+i)->name);
}

return 0;
}


実行したい結果
1 20000
1: 20000円、(2) Inoue
2: 19000円、(10) Hotta
3: 23000円、(14) Fujii

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: 構造体のプログラム

#2

投稿記事 by purin52002 » 3年前

希望金額をグローバル変数にして、希望金額と教師の金額の絶対値をとったものを比較するプレディケートを作って、qsortにぶち込んで、上から3人抜き出せば簡単そう^p^p^
[hr]
っていう冗談はさておき、
3人だけでいいなら、

コード:

結果保持用の配列 struct teacher kekka[3] を用意する。

データの数だけループ
 データを一つ見る。(kyousi)
 ->kekkaが埋まっていなかったら
  kekkaにデータを追加する。
 ->kekkaが埋まっていたら
  kekka[2]のデータとkyousiの金額を比較する。
  ->kyousiの金額差分の方が小さかったら
  kekka[2]にkyousiを代入する。
 kekka配列をバブルソート(ググってください^p^)
という感じでどうでしょう?
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

かずま

Re: 構造体のプログラム

#3

投稿記事 by かずま » 3年前

purin52002 さんが書きました:希望金額をグローバル変数にして、希望金額と教師の金額の絶対値をとったものを比較するプレディケートを作って、qsortにぶち込んで、上から3人抜き出せば簡単そう^p^p^

コード:

#include <stdio.h>
#include <stdlib.h>

struct teacher {
    int number;
    char *name;
    int kane;
    int gakunen;
};

struct teacher katei[15] = {
     1, "Andou",    10000, 2,
     2, "Inoue",    20000, 1,
     3, "Ueno",     15000, 2,
     4, "Endou",    18000, 3,
     5, "Okazaki",  22000, 3,
     6, "Katou",    13000, 1,
     7, "Simizu",   17000, 2,
     8, "Tsuda",    25000, 3,
     9, "Nemoto",   21000, 2,
    10, "Hotta",    19000, 1,
    11, "Miura",    30000, 3,
    12, "Yamazaki", 29000, 3,
    13, "Wada",     14000, 1,
    14, "Fujii",    23000, 1,
    15, "Jinbo",    28000, 2,
};

int kane;

int comp(const void *a, const void *b)
{
    int x = abs((*(struct teacher **)a)->kane - kane);
    int y = abs((*(struct teacher **)b)->kane - kane);
    return x < y ? -1 : x > y;
}

int main(void)
{
    int gakunen, i, n;
    struct teacher *p[15];

    printf("gakunen kane: ");
    if (scanf("%d%d", &gakunen, &kane) != 2) return 1;

    for (n = i = 0; i < 15; i++)
        if (katei[i].gakunen == gakunen) 
            p[n++] = katei + i;
    qsort(p, n, sizeof *p, comp);

    if (n > 3) n = 3;
    for (i = 0; i < n; i++)
        printf("%d円、(%d) %s \n", p[i]->kane, p[i]->number, p[i]->name);
    return 0;
}
実行結果

コード:


gakunen kane: 1 20000
20000円、(2) Inoue 
19000円、(10) Hotta 
23000円、(14) Fujii 

rayban.jp

Re: 構造体のプログラム

#4

投稿記事 by rayban.jp » 3年前

ありがとうございます!
無事完成しました!

返信

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