普通には出来たのですが、配列や関数の使い方がよく分かりません。
助けてください。よろしくお願いします。
問
1~30の整数の範囲で、3辺a, b, c(cを斜辺)の三角形のうち、直角三角形が成立する場合を見つけて配列に入れる。その後、配列をもとにプログラムを作成。
※a, b, c辺を見つけて配列に入れる機能は関数にすること。
※a <= b、b <= cを仮定。
#include<stdio.h>
int myfunc(int x, int y, int z);
int main(){
int a, b, c;
for(a=1; a<=30; a++){
for(b=a; b<=30; b++){
for(c=b; c<=30; c++){
if(a*a + b*b == c*c){
printf("%d,%d,%d",a,b,c);
puts(" ");
}
}
}
}
return 0;
}
実行例
3,4,5
5,12,13
・
・
よろしくお願いします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
#4 です。
「追い詰められて」さんは、全部お任せを通すとはしぶといですね。
次に示すのはテストプログラムですが、渡し方と受け取り方でアドレスはどのように変わるかを示したものです。関数がわからない方はこのようにアドレスの動きを確認することが肝要です。
/* Test program of argument */
#include <stdio.h>
void myfunc(int array_a[], int array_b[], int array_c[]);
int main(void)
{
int array_a[20],array_b[20],array_c[20];
printf("a=%#x &b[0]=%#x *c=%#x\n", array_a, &array_b[0], array_c);
printf(" vvvv\n");
myfunc(array_a,&array_b[0],array_c);
return 0;
}
void myfunc(int array_a[], int array_b[], int *array_c)
{
printf("a=%#x &b[0]=%#x *c=%#x\n", array_a, &array_b[0], array_c);
//return 文がないから void型(何も返さない)の関数
}
↑のテストプログラムから、今回の「配列と関数の課題」は回答 #4 が発展して↓のようになります。
なお、設問は直角三角形ですからピタゴラスの定理が採用されます。
http://ja.wikipedia.org/wiki/%E3%83%94%E3%82%BF% …
#include <stdio.h>
#define MAX 30
//プロトタイプ宣言
int myfunc(int array_a[], int array_b[], int array_c[]);
int main(void)
{
int array_a[20],array_b[20],array_c[20];
int count,i;
//ピタゴラスの定理成立の確認
count = myfunc(array_a, array_b, array_c);
//配列を元に出力プログラムを作成
for(i=0; i<count; i++){
printf("%d: %d,%d,%d\n",i+1,array_a[i],array_b[i],array_c[i]);
}
return 0;
}
int myfunc(int array_a[], int array_b[], int array_c[])
{
int a,b,c,count;
count=0;
for(a=1; a<=MAX; a++){
for(b=a; b<=MAX; b++){
for(c=b; c<=MAX; c++){
if(a*a + b*b == c*c){
//ピタゴラスの定理が成立したら各配列に値を代入する
array_a[count]=a;
array_b[count]=b;
array_c[count]=c;
count++;
}
}
}
}
return count;
}
----- 実行結果 -----
1: 3,4,5
2: 5,12,13
3: 6,8,10
4: 7,24,25
5: 8,15,17
6: 9,12,15
7: 10,24,26
8: 12,16,20
9: 15,20,25
10: 18,24,30
11: 20,21,29
No.5
- 回答日時:
突っ込みを入れさせてもらうと
(1) 問題がおかしい
>※a <= b、b <= cを仮定
b=cの場合は直角二等辺三角形になるので、aが長辺になってしまい、矛盾します。
(2) 三角形の成立条件が加味されていない
三角形が成立するためには、a+b>cが成立していなければなりません。
(3) ループの中の演算が無駄
a*aとb*bはループのなかで毎回計算する必要はありません。
また奇数の二乗は奇数に、偶数の二乗は偶数になるため、cが奇数の場合にはa,bは奇数と偶数の組み合わせ、cが偶数であればa,bは偶数と偶数、奇数と奇数の組み合わせになります。
しらみ潰しに探すのならcからループさせる方が効率がよくなります。
ループの実行回数が多すぎますから、整理して少なくしましょう。
例としてこんな感じ
int a, b, c;
for(c=3;c<=30;c++){//c>bの条件からcは3以上
for(b=c/2+1;b<c;b++){//b>=aの条件からbはcの半分以上の長さが必要
int a1,a2;
a1=(c-b);
a2=a1*(c+b);//c*c-b*bの計算
a1+=1;//aの最小値、a>c-bは三角形の条件
//aに偶数か奇数をセットして2づつ加算する。
for(a=a2%2?a1+1:a1;a<=b;a+=2){
int aa=a*a;
if((a2==aa)){
//一致した場合の処理
}else if(a2<aa) brak;
}
}
}
No.4
- 回答日時:
>1~30の整数の範囲で、3辺a, b, c(cを斜辺)の三角形のうち、直角三角形が成立する場合を見つけて配列に入れる。
まず、自分にわかり易い配列名や変数を使い、プログラムを作成する。
#include <stdio.h>
#define MAX 30
int main(void)
{
int array_a[20],array_b[20],array_c[20]; //配列を用意する
int a,b,c,count;
int i; //その後の出力用
count=0;
for(a=1; a<=MAX; a++){
for(b=a; b<=MAX; b++){
for(c=b; c<=MAX; c++){
if(a*a + b*b == c*c){
//printf("%d,%d,%d\n",a,b,c); に代わって配列に入れる
array_a[count]=a;
array_b[count]=b;
array_c[count]=c;
count++; //カウントを増やすことを忘れないこと
}
}
}
}
//>その後、配列をもとにプログラムを作成
for(i=0; i<count; i++){
printf("%d: %d,%d,%d\n",i+1,array_a[i],array_b[i],array_c[i]);
{
return 0;
}
>※a, b, c辺を見つけて配列に入れる機能は関数にすること。
↑のプログラムの countなどの変数や for()文を抜き出して関数を作る。プログラムをそのままコピーするので、必要な部分を「ドラッグする」と考えるのが簡単です。
int myfunc(int array_a[], int array_b[], int array_c[])
{
//上記プログラムの一部をそのままコピペ
int a,b,c,count;
count=0;
for(a=1; a<=MAX; a++){
for(b=a; b<=MAX; b++){
for(c=b; c<=MAX; c++){
if(a*a + b*b == c*c){
array_a[count]=a;
array_b[count]=b;
array_c[count]=c;
count++;
}
}
}
}
//count値を返さないと main()関数は続けて動かないヨ!
return count;
}
これで myfunc()関数ができました。
さて、これを使ってあなた自身でプログラム完成してみてください。
No.3
- 回答日時:
>・・配列に入れる。
その後、配列をもとにプログラムを作成。「・・配列をもとに『出力する』プログラムを作成」と勝手に解釈・・。
#include<stdio.h>
int myfunc(int x, int y, int z);
int main(){
int a, b, c;
int i = 0, nn = 0, i90Sankaku[ 30 ][ 3 ] = {{ 0 }};
for(a=1; a<=30; a++){
for(b=a; b<=30; b++){
for(c=b; c<=30; c++){
if( 0 == myfunc( a, b, c ) )continue;
i90Sankaku[ nn ][ 0 ] = a;
i90Sankaku[ nn ][ 1 ] = b;
i90Sankaku[ nn ][ 2 ] = c;
nn++;
}
}
}
while( i90Sankaku[ i ][ 0 ] ){ // 配列をもとに出力する
printf( " %2d", i90Sankaku[ i ][ 0 ] );
printf( " %2d", i90Sankaku[ i ][ 1 ] );
printf( " %2d", i90Sankaku[ i ][ 2 ] );
puts( "" );
i++;
}
return 0;
}
int myfunc( int x, int y, int z )
{
if( ( x * x + y * y ) != ( z * z ) ) return( 0 );
return( 1 );
}
No.1
- 回答日時:
この問題の狙いは、関数に配列を渡すことができることを教えることでしょうね。
配列への値の代入方法は知っていますよね?
例:
int a[30];
a[0]=3;
a[1]=5;
など
関数には、次のように配列を代入することが可能です。
int a[30],b[30],c[30],L;
L=myfunc(a,b,c);
このとき、myfuncの宣言は、
int myfunc(int a[],int b[],int c[]);
または、
int myfunc(int *a,int *b,int *c);
と宣言することになります。(どちらでも大差ありません。)
この辺の話は、参考書でポインタと配列について記述してあるところに書かれていると思います。
基本的な話なので、敢えて回答は載せません。以上を踏まえて自分で作ってみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
比較回数と交換回数表示について
-
複数桁10進数の*桁目だけを抽出...
-
nCmの関数
-
構造体の勉強中です 合計点の高...
-
C言語 配列と関数の練習問題
-
[C言語] 関数を利用する計算
-
実数の整数部,小数部の取得
-
C言語での引数の省略方法
-
数字列を3桁ごとにカンマで区切...
-
アスタリスクでダイヤ型を作る
-
覆面算のプログラムが分かりません
-
C言語の基礎 . 2乗値の差につ...
-
c言語
-
プログラミング
-
【C++】関数ポインタの使い方
-
毎回違う乱数を生成するにはど...
-
if と配列の組み合わせ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語 配列と関数の練習問題
-
複数桁10進数の*桁目だけを抽出...
-
(int *)の意味
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
c言語
-
足して100になるような乱数のア...
-
C言語初心者です、、、お助けく...
-
数字列を3桁ごとにカンマで区切...
-
C言語 エラーの原因がわからな...
-
実数の整数部,小数部の取得
-
課題でつまってます・・・
-
商と剰余を同時に求める(C言語)
-
C言語の配列をC++のvectorに高...
-
std::set<int> で、ある値が何...
おすすめ情報