ページ 1 / 1
C言語の課題
Posted: 2006年9月28日(木) 22:06
by ライアン
学校で「三つの実数を入力しそれぞれ数が5.0以上10.0未満のものに限りその総和を求めよ」という問題を出題されどう手をつけていいかわからないままです。
#include<stdio.h>
main(){
double a,b,c;
printf("%lf%lf\n",a,b,c);
if
私はここまでしたのですが、ifの後にどうすればいいか教えていただけませんか?できれば解説もお願いします。
Re:C言語の課題
Posted: 2006年9月29日(金) 01:43
by 管理人
ライアンさん、こんばんは^^
学校の宿題ですか?大変ですね。
最初は私も苦労した覚えがあります。
お書きになった文章ですが、printf文からちょっとおかしいので、一番最初からおさらいしてみてください。
C言語入門サイトは沢山ありますから、そこの一番最初の部分と、
if文、scanf文、ループ処理、を勉強したら解けると思います。
まず、何も変数に数を代入していないのに表示する事は出来ません。
よく何も代入していないのに表示する時、その表示されたものを「ゴミ」と表現します。
そして、printf文では%dや%fなどの変換指定文字は後につく変数の数と同じでないといけません。
printf("%f %f %f",a,b,c);
こんな風に。
次にキーボード入力から変数に数を格納するにはscanf文を使います。
aに浮動小数を格納したい時はこうかきます。
scanf("%lf",&a);
つまり、
printf("3回連続で実数を入力してください。");
scanf("%lf",&a);
scanf("%lf",&b);
scanf("%lf",&c);
と書くことで3つの変数に数が格納できます。
a,b,cの総和が5.0以上10.0未満とはどのように表現したらいいでしょうか。これらはそれぞれ
「総和が5.0以上」
=
if((a+b+c)>=5.0)
「総和が10.0以下」
=
if((a+b+c)<10.0)
と表現できますね?
2つ同時に判定したいときは「~かつ」という表現「&&」をしようします。
if( X && Y )
と書くと、「XかつYの時」という判定が可能です。
一方「または」は「||」で表現します。
つまり2つの条件を一度に判定したい時は
if( (a+b+c)>=5.0 && (a+b+c)<10.0 )
こう書けばいいわけですね。
最初からa+b+cの総和をdという数に代入しておけば、いいんですが
「それぞれ数が5.0以上10.0未満のものに『限り』その総和を求めよ」
という日本語表現からして後から求めた方がよさそうなのでちょっと無駄ですが、後から総和をdという変数に格納してみましょう。
総和を求めるというのは
double d;
でdを用意し、d=a+b+c;によってdに合計を代入します。
では以上の事をふまえてサンプルをみてください。
サンプル
#include<stdio.h>
void main(){
double a,b,c,d;
printf("3つの実数を連続で入力してください。\n");
scanf("%lf",&a);
scanf("%lf",&b);
scanf("%lf",&c);
if((a+b+c)>=5.0 && (a+b+c)<10.0){
d=a+b+c;
printf("合計=%lf\n",d);
}
else
printf("総数が規定の範囲内では無い。\n");
}
実行結果
3つの実数を連続で入力してください。
2.786
1.876
5.321
合計=9.983000
こんな感じです。
サンプルはこちらで
http://dixq.net/board/program/sum.cpp
判らない事があれば聞いてください^^
Re:C言語の課題
Posted: 2006年9月29日(金) 07:02
by バグ
>>「三つの実数を入力しそれぞれ数が5.0以上10.0未満のものに限りその総和を求めよ」
この問題文だったら…
double a,b,c,d = 0.0;
scanf( "1番目の数を入力して下さい " , &a );
scanf( "2番目の数を入力して下さい " , &b );
scanf( "3番目の数を入力して下さい " , &c );
if( a >= 5.0 && a <= 10.0 ) d += a;
else printf( "1番目の数字は範囲GUYですn" );
if( b >= 5.0 && b <= 10.0 ) d += b;
else printf( "2番目の数字は範囲GUYですn" );
if( c >= 5.0 && c <= 10.0 ) d += c;
else printf( "3番目の数字は範囲GUYですn" );
printf( "有効な数字の総和 = %dn" , d );
こんな感じじゃないですかね?携帯で書き込みなのでincludeとかmainとか色々と省略してますし、コンパイルしてないので、バグがあったら申し訳ないですが…(;^_^A
Re:C言語の課題
Posted: 2006年9月29日(金) 07:03
by 管理人
け、携帯で?!
さすがバグさんです(ノ^^)八(^^ )ノ
問題を読み違えていました・・すみません。。。
合計が規定範囲だったら・・じゃなかったんですね^^;
・・何故かまだ起きている管理人でした・・・。
Re:C言語の課題
Posted: 2006年9月29日(金) 07:43
by バグ
うわ!いきなりバグをみつけてしまいました(;´д`)
最後のprintfのところの%dではなく、%fでしたね…
あと変数a、b、cも、0で初期化しておいた方がよりベターですね…
失礼しました…m(__)m
Re:C言語の課題
Posted: 2006年9月29日(金) 08:39
by 管理人
バグさん、
scanf( "2番目の数を入力して下さい " , &b );
これってどういう意味ですか?
あと、ライアンさん、
if文のところを
if(a>=5.0 && a<10.0 && b>=5.0 && b<10.0 && c>=5.0 && c<10.0){
これに変更すればOKですよ。
Re:C言語の課題
Posted: 2006年9月29日(金) 09:37
by バグ
うわ、寝ぼけてたんでしょうか…重ね重ね申し訳ないです(T_T)
ちょっと、作り直してみましたのでお許しを…(苦笑)
#include <stdio.h>
void main()
{
double a = 0 , b = 0 , c = 0 , d = 0;
printf( "1番目の数値を入力して下さい " );
scanf( "%lf" , &a );
printf( "2番目の数値を入力して下さい " );
scanf( "%lf" , &b );
printf( "3番目の数値を入力して下さい " );
scanf( "%lf" , &c );
if( a >= 5.0 && a <= 10.0 )
{
d += a;
}
else
{
printf( "1番目の数値は予想GUYです\n" );
}
if( b >= 5.0 && b <= 10.0 )
{
d += b;
}
else
{
printf( "2番目の数値は予想GUYです\n" );
}
if( c >= 5.0 && c <= 10.0 )
{
d += c;
}
else
{
printf( "3番目の数値は予想GUYです\n" );
}
printf( "有効数値の総和 = %lf" , d );
}
ここからは、個人的にはこうした方がスッキリするなぁ…という方法です。まぁ、結果は同じなので、好みの問題ですけどね。
#include <stdio.h>
void main()
{
int i;
double val[4] = { 0 , };
for( i = 0 ; i < 3 ; i++ )
{
printf( "%d番目の数値を入力して下さい " , i + 1 );
scanf( "%lf" , &val );
if( val >= 5.0 && val <= 10.0 )
{
val[3] += val;
}
else
{
printf( "この数値は予想GUYです\n" , i + 1 );
}
}
printf( "有効数値の総和 = %lf" , val[3] );
}
Re:C言語の課題
Posted: 2006年9月29日(金) 09:40
by バグ
またまたミス発見…OTL
printf( "この数値は予想GUYです\n" , i + 1 );
この文は
printf( "この数値は予想GUYです\n" );
これに直してください…。
Re:C言語の課題
Posted: 2006年9月29日(金) 09:54
by 管理人
バグさん、わざわざありがとうございます^^
確かにループを使ったほうがすっきりしますね☆
ライアンさんが、今回はかなり入門者さんだったようですので、特に簡単に書きましたが、
ライアンさん、もし余裕があればバグさんのお書きになったプログラムも見てくださいね^^
Re:C言語の課題
Posted: 2006年9月29日(金) 10:35
by バグ
>>ライアンさん
もし、解説が必要でしたら、遠慮なく書き込みしてくださいね(^-^)
Re:C言語の課題
Posted: 2006年9月29日(金) 12:11
by ライアン
いろいろ教えていただいてありがとうございます。
くだらないことですが、バグさんの解答にd+=aの「+=」は何のために使うんでしょうか?
Re:C言語の課題
Posted: 2006年9月29日(金) 12:14
by 管理人
それは
d=d+a;
を短縮した形です。
式って色々短縮できるんです。
a = a + 1;
これは
a++;
このように短縮できますし、
a = a + 2;
これは
a += 2;
このように短縮できます。ほかの演算子も同様です。
a = a-3; は a-=3;
a = a*4; は a*=4;
など。極力同じ文字は何度も書かないように書くというのがプログラムの慣習
なので色々短縮できる形があるんですね。
Re:C言語の課題
Posted: 2006年9月29日(金) 12:39
by バグ
くだらなくなんてないですよ。
分からない事はドンドン潰していくのが、上達の早道です(^-^)
一番厄介なのは、自分が何を理解できていないのかを分からない事ですからね。疑問に思った事は調べるなり、聞くなりして解決していきましょう!!(^o^)/
Re:C言語の課題
Posted: 2006年9月29日(金) 14:16
by ライアン
いろいろありがとうございました。
これからもどんどん質問していくのでよろしくお願いします。
Re:C言語の課題
Posted: 2006年9月29日(金) 15:06
by 管理人
そうそう、何でも質問してくださいね~^^
宿題頑張ってください☆
Re:C言語の課題
Posted: 2006年9月29日(金) 19:17
by ライアン
また質問させていただきます。
今日もう一つの課題で「二つの整数を入力し、片方が偶数の場合に限りその値を2で割って1を足し、それらの平均を求めよ」という問題で、
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if(a%2==0 && b%2==1)
{
a=a/2+1;
printf("%d\n",(a+b)/2);}
else if(a%2==1 && b%2==0)
{
b=b/2+1;
printf("%d\n",(a+b)/2);}
return 0;
}
と入力したんですが、「答えを実数でだす」といわれました。
そうすると9行目と13行目の%dを%lf変えなければなれないのでしょうか?
Re:C言語の課題
Posted: 2006年9月29日(金) 19:57
by 管理人
答えを実数で出すのなら計算も実数で行わないといけないんじゃないですか?
答えだけ単純に実数にするんですか?
Re:C言語の課題
Posted: 2006年9月29日(金) 20:02
by 管理人
あ、プログラムの中身を見てみると偶数の時の割り算をそれぞれしているんですね、計算は全て整数しかならないんで実数計算する必要ありませんね。
それなら(double)を使って型変換すればいいですよ^^
Re:C言語の課題
Posted: 2006年9月29日(金) 20:08
by 管理人
どうすればいいかわかりますか?
2は2.0fと書くと実数になります。
2.0とすると有効数字小数点一桁になります。
(double)と書けば後ろにつくものがint型でもfloat型でもdouble型に型変換されます。
int型変数にと実数変数を代入するとint型にそろいますが
(double)(a+b)と2.0fを計算すると実数同時の計算なんで計算結果も実数です。
実数の変換指定文字は%fですから
printf("%d\n",(a+b)/2);
↓
printf("%f\n",(double)(a+b)/2.0f);
このように書けばいいわけですね。
Re:C言語の課題
Posted: 2006年9月29日(金) 22:01
by バグ
if( a % 2 == 1 || b % 2 == 1 )
ちなみに、判定文はこれ1つでいけますよ。
"|" は論理和を求める演算子で、判定式のいずれか1つでも条件を満たしていた場合に1を返します。
論理演算を覚えると便利ですよ(^-^)
Re:C言語の課題
Posted: 2006年9月29日(金) 22:10
by バグ
よく問題を読むと、私の勘違いでした…私が書き込みした判定文ではダメですね。しつれいしました(;^_^A
Re:C言語の課題
Posted: 2006年9月29日(金) 22:20
by 管理人
|| は または
&& は かつ
それぞれ論理和と論理積を表してるわけですね^^
Re:C言語の課題
Posted: 2006年9月30日(土) 11:00
by ライアン
またまた素早い返答ありがとうございました。
実を言うと学校で先生に聞くよりここのサイトで聞く方が分かりやすいと思います。なのでこれからもよろしくお願いします。<!--14-->