実行結果がおかしい・・
実行結果がおかしい・・
1 月の平均気温は 5.8 度です。
2 月の平均気温は 6.1 度です。
3 月の平均気温は 9.3 度です。
4 月の平均気温は 14.4 度です。
5 月の平均気温は 18.4 度です。
6 月の平均気温は 21.8 度です。
7 月の平均気温は 25.3 度です。
8 月の平均気温は 26.7 度です。
9 月の平均気温は 23.7 度です。
10 月の平均気温は 18.5 度です。
11 月の平均気温は 13.4 度です。
12 月の平均気温は 8.3 度です。
ここから最も暑い月とその最高気温を求めたいんですけど・・・。
やり方としては
最大値を格納する変数(ここではmaxとする)を定義する
暫定的に、1月の気温をmaxに代入する(=1月が最高気温だと仮定する)
2月から12月までの各月について、以下の処理を行う{
もし、いま着目している月の気温が max よりも高ければ、
その月の気温をmaxに代入する(=その月が最高気温だと仮定する)
}
このように書いてありました。
なのでそれに従ったつもりで私はif(maxkion < kion[month]){
maxkion = kion[month];
maxmonth == month;
printf("最も暑い月は%d月でその時の気温は%.1f℃です。\n", maxmonth, maxkion);
と書きましたが そうすると
最も暑い月は0月で最高気温は8.3℃です。とでてしまいます。
ちなみに私が書いたプログラムは
#include<stdio.h>
int main(void)
{
float kion[13];
int month;
int maxkion=kion[1];
int maxmonth;
kion[1] = 5.8;
kion[2] = 6.1;
kion[3] = 9.3;
kion[4] = 14.4;
kion[5] = 18.4;
kion[6] = 21.8;
kion[7] = 25.3;
kion[8] = 26.7;
kion[9] = 23.7;
kion[10] = 18.5;
kion[11] = 13.4;
kion[12] = 8.3;
for(month = 1 ; month<13 ; month++){
printf("%d 月の平均気温は%.1f℃です。\n", month, kion[month] );
}
if(maxkion < kion[month]){
maxkion = kion[month];
maxmonth == month;
printf("最も暑い月は%d月でその時の気温は%.1f℃です。\n", maxmonth, maxkion);
}
return 0;
}
それで予定としては最も暑い月は8月でその時の気温は26.7℃です。
と出力されるようにしたいのですが・・・。
ちなみに使用ソフトはMeadow、OSはWindowsです。
お願いします。
2 月の平均気温は 6.1 度です。
3 月の平均気温は 9.3 度です。
4 月の平均気温は 14.4 度です。
5 月の平均気温は 18.4 度です。
6 月の平均気温は 21.8 度です。
7 月の平均気温は 25.3 度です。
8 月の平均気温は 26.7 度です。
9 月の平均気温は 23.7 度です。
10 月の平均気温は 18.5 度です。
11 月の平均気温は 13.4 度です。
12 月の平均気温は 8.3 度です。
ここから最も暑い月とその最高気温を求めたいんですけど・・・。
やり方としては
最大値を格納する変数(ここではmaxとする)を定義する
暫定的に、1月の気温をmaxに代入する(=1月が最高気温だと仮定する)
2月から12月までの各月について、以下の処理を行う{
もし、いま着目している月の気温が max よりも高ければ、
その月の気温をmaxに代入する(=その月が最高気温だと仮定する)
}
このように書いてありました。
なのでそれに従ったつもりで私はif(maxkion < kion[month]){
maxkion = kion[month];
maxmonth == month;
printf("最も暑い月は%d月でその時の気温は%.1f℃です。\n", maxmonth, maxkion);
と書きましたが そうすると
最も暑い月は0月で最高気温は8.3℃です。とでてしまいます。
ちなみに私が書いたプログラムは
#include<stdio.h>
int main(void)
{
float kion[13];
int month;
int maxkion=kion[1];
int maxmonth;
kion[1] = 5.8;
kion[2] = 6.1;
kion[3] = 9.3;
kion[4] = 14.4;
kion[5] = 18.4;
kion[6] = 21.8;
kion[7] = 25.3;
kion[8] = 26.7;
kion[9] = 23.7;
kion[10] = 18.5;
kion[11] = 13.4;
kion[12] = 8.3;
for(month = 1 ; month<13 ; month++){
printf("%d 月の平均気温は%.1f℃です。\n", month, kion[month] );
}
if(maxkion < kion[month]){
maxkion = kion[month];
maxmonth == month;
printf("最も暑い月は%d月でその時の気温は%.1f℃です。\n", maxmonth, maxkion);
}
return 0;
}
それで予定としては最も暑い月は8月でその時の気温は26.7℃です。
と出力されるようにしたいのですが・・・。
ちなみに使用ソフトはMeadow、OSはWindowsです。
お願いします。
Re:実行結果がおかしい・・
> int maxkion=kion[1]; int型ではまずいです。 > if(maxkion < kion[month]){ > maxkion = kion[month]; > maxmonth == month; この3つの文は、for文のループの中に入れてください。 それから、3つ目の文の等号は2つあるとまずいです。 > printf("最も暑い月は%d月でその時の気温は%.1f℃です。\n", maxmonth, maxkion); この文は、for文のループの外に出してください。
Re:実行結果がおかしい・・
まず、コンパイル時に出るエラーメッセージ、警告などをよく読むことが大事です。
上のプログラムをコンパイルするとこのように出ます。
1>.\test.cpp(7) : warning C4244: '初期化中' : 'float' から 'int' への変換です。データが失われる可能性があります。
1>.\test.cpp(9) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(10) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(11) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(12) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(13) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(14) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(15) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(16) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(17) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(19) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(20) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(27) : warning C4244: '=' : 'float' から 'int' への変換です。データが失われる可能性があります。
1>.\test.cpp(28) : warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか?
1>リンクしています...
1>コード生成しています。
1>c:\documents and settings\\my documents\visual studio 2005\projects\test\test.cpp(7) : warning C4700: 初期化されていないローカル変数 'kion' が使用されます
1>c:\documents and settings\\my documents\visual studio 2005\projects\test\test.cpp(29) : warning C4700: 初期化されていないローカル変数 'maxmonth' が使用されます
1>コード生成が終了しました。
まず、floatで格納したものをintに格納しなおしています。
つまり少数扱い可能箱にいれたデータを少数扱い不可能箱に入れなおしているので。データが失われます。
少数を扱うのならint型ではなく、floatかdoubleにしてください。
floatは扱う利点があまりないので、より高精度なdouble型を使ってください。
3.4 などと書くとそれはdouble型を意味します。float型で3.4を表す時は 3.4f と書きます。
そして、プログラムというものは上から下に処理がなされます。
①float kion[13];
②int month;
③int maxkion=kion[1];
④kion[1] = 5.8;
これは①で、領域が用意され、その中には何も入っていません。何も入っていないわけではなく、そのまま扱ってはいけないデータが入っています。変数は用意したら初期化が必要です。
②で、変数が用意されます。
③で変数を用意し、先ほど何も入ってないといった、そのままでは扱ってはいけないデータをいれています。
④デ扱いたいデータを代入しています。
つまり③の処理は行いたい処理が出来ていません。
処理の順番を考えて書き直してみてください。
後普通配列は0から使います。0~11まで使うのが普通でしょう。
そして、for文はprintしかしていません。
12回文字を表示しているだけです。
投稿されている記事の原文を確認しても、字下げした形跡が見られませんでした。
プログラムは字下げをして、どこの括弧がどこに対応しているか確認しながら書かないと間違いを引き起こすので字下げしてください。
こんな感じです。
プログラムをキレイに書き直して、対応と、処理の順番を考えてもう一度書いてみてください。
上のプログラムをコンパイルするとこのように出ます。
1>.\test.cpp(7) : warning C4244: '初期化中' : 'float' から 'int' への変換です。データが失われる可能性があります。
1>.\test.cpp(9) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(10) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(11) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(12) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(13) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(14) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(15) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(16) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(17) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(19) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(20) : warning C4305: '=' : 'double' から 'float' へ切り詰めます。
1>.\test.cpp(27) : warning C4244: '=' : 'float' から 'int' への変換です。データが失われる可能性があります。
1>.\test.cpp(28) : warning C4553: '==' : 演算子にプログラム上の作用がありません。'=' を意図しましたか?
1>リンクしています...
1>コード生成しています。
1>c:\documents and settings\\my documents\visual studio 2005\projects\test\test.cpp(7) : warning C4700: 初期化されていないローカル変数 'kion' が使用されます
1>c:\documents and settings\\my documents\visual studio 2005\projects\test\test.cpp(29) : warning C4700: 初期化されていないローカル変数 'maxmonth' が使用されます
1>コード生成が終了しました。
まず、floatで格納したものをintに格納しなおしています。
つまり少数扱い可能箱にいれたデータを少数扱い不可能箱に入れなおしているので。データが失われます。
少数を扱うのならint型ではなく、floatかdoubleにしてください。
floatは扱う利点があまりないので、より高精度なdouble型を使ってください。
3.4 などと書くとそれはdouble型を意味します。float型で3.4を表す時は 3.4f と書きます。
そして、プログラムというものは上から下に処理がなされます。
①float kion[13];
②int month;
③int maxkion=kion[1];
④kion[1] = 5.8;
これは①で、領域が用意され、その中には何も入っていません。何も入っていないわけではなく、そのまま扱ってはいけないデータが入っています。変数は用意したら初期化が必要です。
②で、変数が用意されます。
③で変数を用意し、先ほど何も入ってないといった、そのままでは扱ってはいけないデータをいれています。
④デ扱いたいデータを代入しています。
つまり③の処理は行いたい処理が出来ていません。
処理の順番を考えて書き直してみてください。
後普通配列は0から使います。0~11まで使うのが普通でしょう。
そして、for文はprintしかしていません。
12回文字を表示しているだけです。
投稿されている記事の原文を確認しても、字下げした形跡が見られませんでした。
プログラムは字下げをして、どこの括弧がどこに対応しているか確認しながら書かないと間違いを引き起こすので字下げしてください。
こんな感じです。
#include<stdio.h> int main(void){ int (略)maxmonth; for(month = 1 ; month<13 ; month++){ printf("%d 月の平均気温は%.1f℃です。\n", month, kion[month] ); } if(maxkion < kion[month]){ maxkion = kion[month]; } return 0; }さらに、①==②は比較しか行えないので、条件文以外に書く機会はほぼありません。
プログラムをキレイに書き直して、対応と、処理の順番を考えてもう一度書いてみてください。
Re:実行結果がおかしい・・
> 後普通配列は0から使います。0~11まで使うのが普通でしょう。
月のように1で始まるデータを扱うとき、n月分のデータが配列の(n-1)番目の要素に
入っていると直感的にわかりにくい場合があります。
そこで、わざと1つ余計に配列の要素を確保し、
先頭要素を使わないことで、n月分のデータが配列のn番目の要素に入るという、
人間にとって非常にわかりやすい状態にすることがあります。
月のように1で始まるデータを扱うとき、n月分のデータが配列の(n-1)番目の要素に
入っていると直感的にわかりにくい場合があります。
そこで、わざと1つ余計に配列の要素を確保し、
先頭要素を使わないことで、n月分のデータが配列のn番目の要素に入るという、
人間にとって非常にわかりやすい状態にすることがあります。
Re:実行結果がおかしい・・
>boxさん本当にありがとうございました。
この通りにやったらできました。
>管理人さん
コンパイルでエラーは出ませんでしたけど実行ソフトがおそらく違うんでしょうかね?ちなみに
私はCygwinでやってますがそのソフトは何でしょうか?そちらのソフトの方がエラーが見つけやすそうなので
教えてくれるとありがたいですね。質問に答えていただきありがとうございます。
この通りにやったらできました。
>管理人さん
コンパイルでエラーは出ませんでしたけど実行ソフトがおそらく違うんでしょうかね?ちなみに
私はCygwinでやってますがそのソフトは何でしょうか?そちらのソフトの方がエラーが見つけやすそうなので
教えてくれるとありがたいですね。質問に答えていただきありがとうございます。
Re:実行結果がおかしい・・
Cygwinは使った事が無いですが、設定で警告の出る程度が決められるのではないでしょうか。
私が使っているのはVC++でシェアソフトですが、無料版もありますので、よければお使い下さい。
http://www.microsoft.com/japan/msdn/vst ... s/visualc/
配列は絶対0から使わないといけないって決まりは無いので、その辺は自由ですが、何も使わない領域を確保するというのは何だかすっきりしない気がしましたので。
プログラムは可読性なども重要なので、その辺は自由に書いていいですね。
私が使っているのはVC++でシェアソフトですが、無料版もありますので、よければお使い下さい。
http://www.microsoft.com/japan/msdn/vst ... s/visualc/
配列は絶対0から使わないといけないって決まりは無いので、その辺は自由ですが、何も使わない領域を確保するというのは何だかすっきりしない気がしましたので。
プログラムは可読性なども重要なので、その辺は自由に書いていいですね。
Re:実行結果がおかしい・・
>管理人さん成程・・・0から入力すると0が1月で1が2月で
という風にずれが生じるから、それによって勘違いするらしいって言ってましたね。
1が1月の方がわかりやすいからだと思います。
ところでboxさんの言っている風にやるとできるのに私がやるのではなぜできないんでしょうかね?
かっこの外に出したり、かっこの中から外に出すというちょっとした変更で全然違う答えになるんですね。
しっかりと理解したいので誰かわかる範囲でお願いします。いまだにかっこの中に入れれば
いいのか外に出さなければいけないというのが分らない今日この頃・・・。今までは適当にやったら
できたって感じであったのですが、今回もこれで済ますと何もならないのでどうしてなのか学びたいです。
という風にずれが生じるから、それによって勘違いするらしいって言ってましたね。
1が1月の方がわかりやすいからだと思います。
ところでboxさんの言っている風にやるとできるのに私がやるのではなぜできないんでしょうかね?
かっこの外に出したり、かっこの中から外に出すというちょっとした変更で全然違う答えになるんですね。
しっかりと理解したいので誰かわかる範囲でお願いします。いまだにかっこの中に入れれば
いいのか外に出さなければいけないというのが分らない今日この頃・・・。今までは適当にやったら
できたって感じであったのですが、今回もこれで済ますと何もならないのでどうしてなのか学びたいです。
Re:実行結果がおかしい・・
いやいや、括弧の中にあるか外に有るかは大違いですよ。
ちょっとした変更ではありません。
これでは処理の順番がどうであるか、答えられますか?
Cというものは基本的に括弧で始まり括弧で終わります。
有効範囲を示します。
プログラムというものはif文さえあればある程度かけますが、有効範囲がどこまでなのかわからないものなら作れません。
ネットでもかなり勉強できるのでこういうところを覗いてみて下さい。
http://www.google.co.jp/search?hl=ja&q= ... %96%80&lr=
ちょっとした変更ではありません。
for(i=0;i<100;i++){ ①; } ②; これと for(i=0;i<100;i++){ ①; ②; }
これでは処理の順番がどうであるか、答えられますか?
Cというものは基本的に括弧で始まり括弧で終わります。
有効範囲を示します。
プログラムというものはif文さえあればある程度かけますが、有効範囲がどこまでなのかわからないものなら作れません。
ネットでもかなり勉強できるのでこういうところを覗いてみて下さい。
http://www.google.co.jp/search?hl=ja&q= ... %96%80&lr=
Re:Releaseが
開発環境はVS2005を使っています
コードは
#define _CRT_SECURE_NO_DEPRECATE 1 /* VisualC++2005 での警告抑制 */
#include <stdio.h>
#include "DxLib.h"
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
FILE *fp;
int Num;
fp=fopen("test.txt","r");
if(fp == NULL) return 0;
fscanf(fp,"%d",&Num);
SetGraphMode( 800 , 600 , 32 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
SetMouseDispFlag( TRUE ) ;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){
DrawFormatString( 100 , 0 , GetColor(255,255,255) , "%d" ,Num) ;
ScreenFlip();
}
fclose(fp);
DxLib_End();
return 0;
}
main.obj : error LNK2001: 外部シンボル "__imp__fscanf" は未解決です。
C:\Documents and Settings\Tenka\My Documents\Visual Studio 2005\Projects\vcqma\Release\vcqma.exe : fatal error LNK1120: 外部参照 1 が未解決です。
こんな感じに出てきます
コードは
#define _CRT_SECURE_NO_DEPRECATE 1 /* VisualC++2005 での警告抑制 */
#include <stdio.h>
#include "DxLib.h"
char Key[256];
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
FILE *fp;
int Num;
fp=fopen("test.txt","r");
if(fp == NULL) return 0;
fscanf(fp,"%d",&Num);
SetGraphMode( 800 , 600 , 32 ) ;
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1;
SetDrawScreen( DX_SCREEN_BACK );
SetMouseDispFlag( TRUE ) ;
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && Key[KEY_INPUT_ESCAPE]==0){
DrawFormatString( 100 , 0 , GetColor(255,255,255) , "%d" ,Num) ;
ScreenFlip();
}
fclose(fp);
DxLib_End();
return 0;
}
main.obj : error LNK2001: 外部シンボル "__imp__fscanf" は未解決です。
C:\Documents and Settings\Tenka\My Documents\Visual Studio 2005\Projects\vcqma\Release\vcqma.exe : fatal error LNK1120: 外部参照 1 が未解決です。
こんな感じに出てきます