質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1252閲覧

プロトタイプ宣言を使った計算の簡略化

bafubafu_

総合スコア16

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/12 15:09

編集2021/11/12 17:06

プロトタイプ宣言を使ってコードを書いたのですが長くなってしまいました。
もっと簡単にできる方法を教えてください。
実行例↓
イメージ説明

#include<stdio.h> #define SIZE 20 void get_score( int score[ ], int n); void error_message(int point); void show_array( int array[ ], int n); int max_array(int array[ ], int n); int min_array(int array[ ], int n); double average_array(int array[ ], int n); int array[SIZE]; int score[SIZE]; int main(){ int n,max,min; double ave; printf("データ数を入力してください(1~20):"); scanf("%d",&n); get_score(score,n); printf("\n"); printf("データを表示します\n"); show_array(array,n); printf("\n"); max=max_array(array,n); min=min_array(array,n); ave=average_array(array,n); printf("最大値は%dです\n",max); printf("最小値は%dです\n",min); printf("平均値は%.1lfです\n",ave); return 0; } void get_score( int score[ ], int n){ int i; for(i=0;i<n;i++){ printf("No.%d:",i+1); scanf("%d",&score[i]); array[i]=score[i]; while( score[i]<0 || score[i]>100){ error_message(score[i]); printf("No.%d:",i+1); scanf("%d",&score[i]); array[i]=score[i]; } } } void error_message(int point){ if( point<0){ printf("****入力ミス:%dは0未満です****\n",point); } if( point>100){ printf("****入力ミス:%dは100をこえています****\n",point); } } void show_array( int array[ ], int n){ int i; for(i=0;i<n;i++){ printf("No.%d:%d\n", i+1,array[i]); } } int max_array(int array[ ], int n){ int i,max; max=array[0]; for(i=1;i<n;i++){ if(array[i]>max){ max=array[i]; } } return max; } int min_array(int array[ ], int n){ int i,min; min=array[0]; for(i=1;i<n;i++){ if(array[i]<min){ min=array[i]; } } return min; } double average_array(int array[ ], int n){ int i,sum=0; double ave; for(i=0;i<n;i++){ sum += array[i]; } ave=(double)sum/n; return ave; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2021/11/12 16:20

このコードは実行例のように動作しているのでしょうか。
bafubafu_

2021/11/12 16:23

はい。入力ミスをするとエラーメッセージがでます。
jimbe

2021/11/12 16:46 編集

失礼しました、score と array と二つも配列があったので、ご提示のようにはならないかと思ってしまいました。 なぜ score に入力してarray に入れ直しているのでしょうか。
bafubafu_

2021/11/12 16:59

大学の授業で習って、友達と協力して書いた結果このようなかたちになりました。 正直自分でもあまりよくわかってないです。 申し訳ないです。
jimbe

2021/11/12 17:13

なるほど。 この場合は配列の中身や並び順は入力後は最後まで変わりませんので、つまり最後まで score と array は同じです。 ですので、 どちらかに統一したほうが良いでしょう。 さらに言えば、配列は各関数にパラメータとして渡していますので、グローバルである必要はありません。 int score[SIZE] (もしくは array, 統一した方 ) は main 関数内に入れた方が良いと思います。
bafubafu_

2021/11/12 17:29

丁寧にご教示いただき有難うございます。
guest

回答2

0

ベストアンサー

プロトタイプ宣言を無くしたい/減らしたいということでしたら、"呼ばれる関数" を "呼ぶ関数" より先に書いておくことで出来ます。


プロトタイプとは関係ありませんが、 get_score と error_message の箇所は次のようにしますと、入力の scanf 等や判定式が 1 ヶ所になります。
( error_message を is_error と名前を変えています。)

c

1 int is_error(int point){ 2 if( point<0){ 3 printf("****入力ミス:%dは0未満です****\n",point); 4 return 1; 5 } 6 if( point>100){ 7 printf("****入力ミス:%dは100をこえています****\n",point); 8 return 1; 9 } 10 return 0; 11 } 12 13void get_score( int score[ ], int n){ 14 int i; 15 for(i=0;i<n;i++){ 16 printf("No.%d:",i+1); 17 scanf("%d",&score[i]); 18 array[i]=score[i]; //必要? 19 if(is_error(score[i])){ 20 i--; 21 } 22 } 23}

投稿2021/11/12 15:43

編集2021/11/12 16:56
jimbe

総合スコア13209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bafubafu_

2021/11/12 15:58

ありがとうございます!
guest

0

タイトルが「プロトタイプ宣言を使った計算の簡略化」ということはプロトタイプ宣言を使うことに大きな意味があるかのように思えますが、しかしプロトタイプを使おうと使うまいとプログラムの長さには本質的な影響はありません。本質的でないところでは、プロトタイプの分だけ記述は多くなります。

プログラムの全長をすこしでも削りたければ最大/最小値や総和などはデータの入力中に計算してしまう、なんていうことも考えられますが、それは「簡単」かというとちょっと議論のあるところ。

短い=簡単、ということではありませんし、一文字でも短いほうがいいとかいう話でないのなら無理して短くすることもないかと思いますがいかが?

投稿2021/11/12 15:42

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bafubafu_

2021/11/12 15:58

たしかに言われてみればそうですね。。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問