#include <stdio.h>
int main(void)
{
struct cand {
char name[30];
int box, number, order;
float get;
} c[5], t;
int i, j, n, o;
int vote, total, valid, invalid;
/* 候補者名の入力 */
printf("1番から5番の候補者名を入力して下さい。\n");
for (i = 0; i < 5; i++) {
printf("%d番:", i+1);
scanf("%s", &c.name);
c.box = 0; //投票箱を空にする
c.number = i+1; //届け出順に番号を設定
}
valid = invalid = 0; //集計用変数を初期化
/* 0が入力されるまで投票を繰り返す */
printf("\n投票を開始します。1番から5番の候補者番号で投票して下さい。(0で終了)\n");
for (;;) {
printf("何番に投票しますか:");
scanf("%d", &vote);
if (vote == 0) break;
else if (vote >= 1 && vote <= 5) {
c[vote-1].box++;
valid++;
}
else invalid++;
}
printf("投票を終了しました。\n\n");
total = valid + invalid;
printf("有効投票数:%d(投票総数:%d、うち無効票数:%d)\n", valid, total, invalid);
/* 投票結果を表示 */
for (i = 0; i < 5; i++) {
if (valid != 0) c.get=c.box/(float)valid*100;
else c.get = 0;
printf("%d番:%3d票(得票率:%6.2f%)\n", i+1, c.box, c.get);
}
printf("\n");
/* 投票数の大きい順に並べ替えを行う */
for (i = 0; i < 5-1; i++) {
for (j = i+1; j < 5; j++) {
if (c.box < c[j].box || (c.box == c[j].box && c[i].number > c[j].number)) { // 票数が同じ場合は候補者番号順に
t = c[i];
c[i] = c[j];
c[j] = t;
}
}
}
/* 同数の場合を考慮した順位づけ 改良版 */
n = 1; //同じ順位の人数を初期化
c[0].order = o = 1; //大きい順になっているので1位から
for (i = 1; i < 5; i++) {
if (c[i - 1].box > c[i].box) { //前の人より票数が少ない場合
o += n; //順位が変わる
n = 1; //同じ順位の人数を初期化
}
else n++; //同じ順位の人数を1つ増やす
c[i].order = o; //順位を代入
}
/* 得票数の多い順に最終結果を表示 */
for (i = 0; i < 5; i++) {
printf("[%d位]%d番:%3d票(得票率:%6.2f%) %s\n", c[i].order, c[i].number, c[i].box, c[i].get, c[i].name);
}
printf("\n");
/* 候補者番号順にもう一度並べ替えを行う */
for (i = 0; i < 5-1; i++) {
for (j = i+1; j < 5; j++) {
if (c[i].number > c[j].number) {
t = c[i];
c[i] = c[j];
c[j] = t;
}
}
}
/* 候補者番号順に最終結果を表示 */
for (i = 0; i < 5; i++) {
printf("%d番:%3d票(得票率:%6.2f%)[%d位] %s\n", c[i].number, c[i].box, c[i].get, c[i].order, c[i].name);
}
return 0;
}
↑ このプログラムは選挙の投票率などを表すプログラムになっています。
現状のプログラムは5人立候補者の名前を決めて投票をしていくプログラムになっています。
これを20人までの立候補者数を自由に入力できるようにしたいです。数を入力したらその数分だけ名前を入力できるようにしたいです。
この部分だけわかりません。自分の実力がないのは重々承知です。
解答よろしくおねがいします。
急いでます(;ω;)
Re: 急いでます(;ω;)
返信ありがとうございます。
私は投票が多い順に並び替えるプログラムと投票率を出すプログラムしか自分で考えていません。他の部分はもともと問題として載っていたプログラムです。
変数をkとして考えた場合どのようなプログラムを作ればいいですか?
私は投票が多い順に並び替えるプログラムと投票率を出すプログラムしか自分で考えていません。他の部分はもともと問題として載っていたプログラムです。
変数をkとして考えた場合どのようなプログラムを作ればいいですか?
Re: 急いでます(;ω;)
まずはとっちさんのアドバイスの通りに、定数である候補者数を変数で置き換えるところからやってみてはどうでしょう?
Re: 急いでます(;ω;)
struct cand {
char name[30];
int box, number, order;
float get;
} c[20], t; // 5 --> 20
k = sizeof(c) / sizeof(c[0]); // 最初、k は 20
int i, j, n, o;
int vote, total, valid, invalid;
/* 候補者名の入力 */
printf("1番から%d番の候補者名を入力して下さい。("." で終了)\n", k); // k
for (i = 0; i < k; i++) { // k
printf("%d番:", i+1);
scanf("%s", c[i].name); // & は不要
if (strcmp(c[i].name, ".") == 0) break; // 終了
c[i].box = 0; //投票箱を空にする
c[i].number = i+1; //届け出順に番号を設定
}
k = i; // k は実際の人数
valid = invalid = 0; //集計用変数を初期化
/* 0が入力されるまで投票を繰り返す */
printf("\n投票を開始します。1番から%d番の候補者番号で投票して下さい。(0で終了)\n", k); // k