文字列を表示したいのに整数でしか返ってこない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
群馬県民

文字列を表示したいのに整数でしか返ってこない

#1

投稿記事 by 群馬県民 » 7年前

前回質問させていただいた後、原始的な方法でもできるのかと思い作ってみたのですが、

コード:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#pragma warning(disable:4996)


//ケッペンの気候区分 中2-5 金野 俊

int main(){
    double natu, huyu, kion_tuki, kouu_tuki,swf;
    unsigned char hanbetu;
    double r;
    double kion[13];
    double kouu[13];//順に各月の平均気温、降水量
    double maxkouu, worstkouu, totalkouu;//順に最多雨月降水量、最少雨月降水量、年降水量
    double maxkion, worstkion, avekion;//順に最暖月平均気温、最寒月平均気温、年平均気温
    //入力
    printf("1月から各月の平均気温、降水量の順に入力してください\nただし平均気温は小数または整数、降水量は0以上の小数または整数で入力してください\nまた、大きすぎる数が入力されると正しく判別されない場合があります\n");
    for (int i = 1; i<13; i++){
        printf("%d月平均気温(℃)", i);
        scanf("%lf", &kion[i]);
        printf("%d月降水量(mm)", i);
        scanf("%lf", &kouu[i]);
    }
    natu = kion[5] + kion[6] + kion[7] + kion[8];
    huyu = kion[11] + kion[12] + kion[1] + kion[2];

    //判別基準を確定
    maxkion = kion[1];
    worstkion = kion[1];
    maxkouu = kouu[1];
    worstkouu = kouu[1];
    for (int i = 1; i<12; i++){
        if (maxkion<kion[i + 1]){
            maxkion = kion[i + 1];
            kion_tuki = i + 1;
        }
        else if (maxkion == kion[i + 1])
        {
            maxkion = kion[1];
            kion_tuki = 1;
        }
        else if (maxkion>kion[i + 1]){
            maxkion = kion[1];
            kion_tuki = 1;
        }

        if (worstkion<kion[i + 1]){
            worstkion = worstkion;
        }
        else if (worstkion == kion[i + 1]){
            worstkion = worstkion;
        }
        else if (worstkion>kion[i + 1]){
            worstkion = kion[i + 1];
        }

        if (maxkouu<kouu[i + 1]){
            maxkouu = kouu[i + 1];
            kouu_tuki = i + 1;
        }
        else if (maxkouu == kouu[i + 1]){
            maxkouu = maxkouu;
            kouu_tuki = 1;
        }
        else if (maxkouu>kouu[i + 1]){
            maxkouu = maxkouu;
            kouu_tuki = 1;
        }

        if (worstkouu<kouu[i + 1]){
            worstkouu = worstkouu;
        }
        else if (worstkouu == kouu[i + 1]){
            worstkouu = worstkouu;
        }
        else if (worstkouu>kouu[i + 1]){
            worstkouu = kouu[i + 1];
        }



    }

    totalkouu = kouu[1] + kouu[2] + kouu[3] + kouu[4] + kouu[5] + kouu[6] + kouu[7] + kouu[8] + kouu[9] + kouu[10] + kouu[11] + kouu[12];
    avekion = (kion[1] + kion[2] + kion[3] + kion[4] + kion[5] + kion[6] + kion[7] + kion[8] + kion[9] + kion[10] + kion[11] + kion[12]) / 12;
    printf("\n最多雨月降水量 %lfmm\n最少雨月降水量 %lfmm\n年降水量 %lfmm\n最暖月平均気温 %lf℃\n最寒月平均気温 %lf℃\n年平均気温 %lf℃\n\n", maxkouu, worstkouu, totalkouu, maxkion, worstkion, avekion);

    //乾燥限界
    if (natu > huyu){

        if (kouu_tuki >= 5 && kouu_tuki <= 8){
            if (worstkouu * 10 < maxkouu){
                swf = 0;
            }
        }
        else if (kouu_tuki >= 1 && kouu_tuki <= 2){
            if (worstkouu * 3 < maxkouu){
                swf = 1;
            }
        }
        else if (kouu_tuki >= 11 && kouu_tuki <= 12){
            if (worstkouu * 3 < maxkouu){
                swf = 1;
            }
        }
        else{
            swf = 2;
        }
     if (natu < huyu){

        if (kouu_tuki >= 5 && kouu_tuki <= 8){
            if (worstkouu * 3 < maxkouu){
                swf = 1;
            }
        }
        else if (kouu_tuki >= 1 && kouu_tuki <= 2){
            if (worstkouu * 10 < maxkouu){
                swf = 0;
            }
        }
        else if (kouu_tuki >= 11 && kouu_tuki <= 12){
            if (worstkouu * 10 < maxkouu){
                swf = 0;
            }
        }
        else{
            swf = 2;
        }
    }



    }

    if (swf == 0){
        r = 20 * avekion;
    }
    else if (swf == 1){
        r = avekion + 7;
        r = r * 20;
    }
    else if (swf == 2){
        r = avekion + 14;
        r = r * 20;
    }




    //気候区分判別

    if (maxkion > 10) {
        if (totalkouu >= r) {
            if (worstkion > 18) {
                if (worstkouu > 60) {
                    hanbetu = 'Aw';

                }
                else if (totalkouu < 2500) {
                    hanbetu = 'Am';

                }
                else {
                    hanbetu = 'Af';

                }
            }
            if (worstkion < -3 && worstkion < 18) {
                if (swf == 0) {
                    hanbetu = 'Cw';

                }
                else if (swf == 1) {
                    hanbetu = 'Cs';

                }
                else if (swf == 2) {
                    if (maxkion > 22) {
                        hanbetu = 'Cfa';

                    }
                    else {
                        hanbetu = 'Cfb';

                    }
                }
            }
            if (worstkion < -3) {
                if (swf == 0) {
                    hanbetu = 'Dw';

                }
                else if (swf == 1) {
                    hanbetu = 'Ds';

                }
                else if (swf == 2) {
                    hanbetu = 'Df';

                }
            }
        }
        else if (totalkouu >= 0.5*r) {
            hanbetu = 'BS';

        }
        else {
            hanbetu = 'BW';

        }

    }
    else {
        if (maxkion < 0) {
            hanbetu = 'ET';

        }
        else {
            hanbetu = 'EF';

        }
    }





    //出力

    if (worstkouu < 0) { printf("条件通り入力されなかったため正しく判別されませんでした\nいずれかのキーで終了します\n"); }
    else{
        printf("判別結果は%dです\nいずれかのキーで終了します\n", hanbetu);

    }

  
    


    getch();
    return 0;
}
というソースなのですが、どうしても最後の出力でAwなどと表示されるのが理想なのですが
70やら255などの数字が表示されます。原因がわからないので回答お願いします

box
記事: 2002
登録日時: 13年前

Re: 文字列を表示したいのに整数でしか返ってこない

#2

投稿記事 by box » 7年前

群馬県民 さんが書きました: 文字列を表示したい
のであれば、
群馬県民 さんが書きました:

コード:

    unsigned char hanbetu;
ここの型を考え直してください。少なくともunsigned charではないはずです。
群馬県民 さんが書きました:

コード:

                    hanbetu = 'Aw';
                    hanbetu = 'Am';
                    hanbetu = 'Af';
                    hanbetu = 'Cw';
                    hanbetu = 'Cs';
                        hanbetu = 'Cfa';
                        hanbetu = 'Cfb';
                    hanbetu = 'Dw';
                    hanbetu = 'Ds';
                    hanbetu = 'Df';
            hanbetu = 'BS';
            hanbetu = 'BW';
            hanbetu = 'ET';
            hanbetu = 'EF';
コンパイル時に警告が出ませんか?
hanbetuという変数はunsigned char型なので、「1文字分の領域」しかありません。

それから、
群馬県民 さんが書きました:

コード:

    totalkouu = kouu[1] + kouu[2] + kouu[3] + kouu[4] + kouu[5] + kouu[6] + kouu[7] + kouu[8] + kouu[9] + kouu[10] + kouu[11] + kouu[12];
    avekion = (kion[1] + kion[2] + kion[3] + kion[4] + kion[5] + kion[6] + kion[7] + kion[8] + kion[9] + kion[10] + kion[11] + kion[12]) / 12;
ここはさすがにループを回すべきでありましょう。
[1]~[12]でなくて[1]~[100]だったらどうしますか?
[1] + [2] + [3] + ... + [98] + [99] + [100]
と書きますか?
avekion(たぶん平均値?)を求めるのに、せっかく直前で求めていたtotalkouu(たぶん合計値?)を使っていない点にも
再考の余地がありそうです。同じ計算を2回行なう必要がありますか?
群馬県民 さんが書きました:

コード:

        printf("判別結果は%dです\nいずれかのキーで終了します\n", hanbetu);
%dにしているから、そりゃ数値で出てくるでしょうね。

最後に老婆心ながら、ネットにあまり実名をさらさない方がいいと思います。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 文字列を表示したいのに整数でしか返ってこない

#3

投稿記事 by box » 7年前

ついでに…。
群馬県民 さんが書きました:

コード:

    for (int i = 1; i<12; i++){
        if (maxkion<kion[i + 1]){
            maxkion = kion[i + 1];
            kion_tuki = i + 1;
        }
せっかく[1]を基準にしたのですから、ふつうに[2]~[12]について回せばいいんじゃないですか?
群馬県民 さんが書きました:

コード:

        else if (maxkion == kion[i + 1])
        {
            maxkion = kion[1];
            kion_tuki = 1;
        }
        else if (maxkion>kion[i + 1]){
            maxkion = kion[1];
            kion_tuki = 1;
        }
if文のブロックの中でやっていることが同じなので、わざわざ別々に書く必要はないと思います。
同じようなことが他のif文においても見受けられます。
群馬県民 さんが書きました:

コード:

            if (worstkion < -3 && worstkion < 18) {
ここの条件、本当にそうしたいですか?
-3よりも小さく、かつ、18よりも小さいってことは、結局-3より小さいってことしか言ってないです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る