ページ 1 / 1
配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月04日(月) 19:22
by たろ
コード:
int main(void)
{
int n, i, array[1000], times = 0, total = 0, max, min;
for (i = 0; i < 1000; i++)
{
array[i] = 0;
}
for (i = 0; i < 1000; i++)
{
printf("数字を入力してください(0を入力するとプログラムは終了します)");
scanf("%d", &n);
if (n == 0)
{
break;
}
else
{
array[i] = n;
times++;
}
if (times == 0)
{
max = min = n;
}
else
{
if (n > max)
{
max = n;
}
if (n < min)
{
min = n;
}
}
}
int newarray[times];
for (i = 0; i < times; i++)
{
newarray[i] = array[i];
total += newarray[i];
printf("%d\n", newarray[i]);
}
// printf("%d\n", newarray[0]);
printf("平均は %fです\n", (double) total / times);
printf("最大値は%dです\n", max);
printf("最小値は%dです\n", min);
}
0 が入力されるまで整数を配列に読み込み,0 が入力されたら,(最後の 0 を除いた)入力の最大値,最小値,平均値,中央値を出力するプログラムを作りたいのですが、現在のプログラムでは最大値にゴミ値が入ってしまいます。
またそもそもこのプログラムでは配列を使う意味があまりないような気がしているのですが、配列をつかったより良いプログラムがありましたら、ご教示いただきたいです。
素人質問で申し訳ございませんが、お教えいただけますと幸いです。
宜しくお願いいたします。
Re: 配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月04日(月) 20:47
by box
コード:
if (times == 0)
{
max = min = n;
}
初回入力時に、入力値を仮の最大値・最小値にするという発想自体は
ええと思うんやけど、いかんせん書く場所がちょっと違うてるみたいやね。
それから、中央値を求める際はデータがソートされてなあかんのやけど、
配列を使わんと中央値を求める方法(変にこねくり回さない)があるんやったらこっちが知りたいくらい。
つまりやね、配列を使うことで変なロジックを使わんでも
いろんな値が求められるんやったら、それでええんとちゃう?ってこと。
配列を使うことで楽できるんやったら、それがいちばんええやろ?
Re: 配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月04日(月) 22:04
by box
1000個も値を入力させる可能性があるのはあまり現実的とは思えないのと
main()に何でもかんでもやらせるのはあまりよろしくない(main()は全体の司令塔、
必要な処理は下請け関数に任せる)のとから、こんなサンプルを用意してみました。
関数分けが適切かどうかはよくわからないので、加工はお任せします。
コード:
#include <stdio.h>
#define N (30) // データの最大個数
void inputData(int *a, int *c, int *t)
{
int n;
while (1) {
printf("数字を入力(0で終了)");
scanf("%d", &n);
if (n == 0 || *c >= N) break;
a[(*c)++] = n, *t += n;
}
}
void sortData(int *a, int c)
{
int i, j;
for (i = 0; i < c - 1; i++) {
for (j = i; j < c; j++) {
if (a[i] > a[j]) {
int t = a[i];
a[i] = a[j], a[j] = t;
}
}
}
}
void printMaxMin(int *a, int c)
{
printf("最大値は%d\n", a[c-1]);
printf("最小値は%d\n", a[0]);
}
void printAverage(int t, int c)
{
printf("平均値は%f\n", (double) t / c);
}
void printMedian(int *a, int c)
{
if (c % 2 == 1) {
printf("中央値は%d\n", a[c/2]);
}
else {
printf("中央値は%f\n", (a[c/2-1] + a[c/2]) / 2.);
}
}
int main(void)
{
int array[N] = { 0 }, count = 0, total = 0;
inputData(array, &count, &total);
sortData(array, count);
printMaxMin(array, count);
printAverage(total, count);
printMedian(array, count);
return 0;
}
Re: 配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月05日(火) 00:42
by box
ちょっとだけ手直ししました。ご自由にどうぞ。
コード:
#include <stdio.h>
#define N (30) // データの最大個数
void inputData(int *a, int *c, int *t)
{
int n;
while (1) {
printf("数字を入力(0で終了)");
scanf("%d", &n);
if (n == 0 || *c >= N) break;
a[(*c)++] = n, *t += n;
}
}
void sortData(int *a, int c)
{
int i, j;
for (i = 0; i < c - 1; i++) {
for (j = i; j < c; j++) {
if (a[i] > a[j]) {
int t = a[i];
a[i] = a[j], a[j] = t;
}
}
}
}
void printMaxMin(int *a, int c)
{
printf("最大値は%d\n", a[c-1]);
printf("最小値は%d\n", a[0]);
}
void printAverage(int t, int c)
{
printf("平均値は%f\n", (double) t / c);
}
void printMedian(int *a, int c)
{
if (c % 2 == 1) {
printf("中央値は%d\n", a[c/2]);
}
else {
printf("中央値は%f\n", (a[c/2-1] + a[c/2]) / 2.);
}
}
int main(void)
{
int array[N] = { 0 }, count = 0, total = 0;
inputData(array, &count, &total);
sortData(array, count);
printMaxMin(array, count);
printAverage(total, count);
printMedian(array, count);
return 0;
}
Re: 配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月05日(火) 07:52
by みけCAT
box さんが書きました: ↑3年前
ちょっとだけ手直ししました。
貼ってあるコードは同じに見えます。
scanfの戻り値を無視している (値を読めたかを確認していない) のはあまり良くなさそうですね。
Re: 配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月06日(水) 03:25
by box
ちゃんと動くよう、適切に手直ししてください。>質問者さん
コード:
#include <stdio.h>
#define N (30) // データの最大個数
void inputData(int *a, int *c, int *t)
{
int n, x;
while (1) {
printf("数字を入力(0で終了)");
do {
x = scanf("%d", &n);
} while (x != 1);
if (n == 0 || *c >= N) break;
a[(*c)++] = n, *t += n;
}
}
void sortData(int *a, int c)
{
int i, j;
for (i = 0; i < c - 1; i++) {
for (j = i; j < c; j++) {
if (a[i] > a[j]) {
int t = a[i];
a[i] = a[j], a[j] = t;
}
}
}
}
void printMaxMin(int *a, int c)
{
printf("最大値は%d\n", a[c - 1]);
printf("最小値は%d\n", a[0]);
}
void printAverage(int t, int c)
{
printf("平均値は%f\n", (double) t / c);
}
void printMedian(int *a, int c)
{
if (c % 2 == 1) {
printf("中央値は%d\n", a[c/2]);
}
else {
printf("中央値は%f\n", (a[c/2 - 1] + a[c/2]) / 2.);
}
}
int main(void)
{
int array[N] = { 0 }, count = 0, total = 0;
inputData(array, &count, &total);
if (count == 0){
fprintf(stderr, "データ数が0のため、処理を中断します。\n");
}
else {
sortData(array, count);
printMaxMin(array, count);
printAverage(total, count);
printMedian(array, count);
}
return 0;
}
Re: 配列を使って様々な値を求める方法(素人質問ですみません)
Posted: 2022年7月06日(水) 03:35
by box
こんな時間に酒かっくらっていいかげんなコードしか
アップできなくてすまそ。
もう思考能力ゼロ。