【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

標準体重計算のプログラミングを作成しています。身長(m)×身長(m)×22 での計算方法を採用していますが初心者なので全くでくません。全くなっていませんがここにのせます。
どなたか正しいプログラミングを教えてください
#include <stdio.h>
//標準体重の計算
int main (int argc, const char * argv[]) {
int height;
int weight;
double x;
double y;
printf("あなたの標準体重を計算します\n\n");
printf("あなたの身長(cm)、体重(kg)を入力してください\n");
scanf("%d %d",&height,&weight);
x=height/100;
y=x*x*22;
printf("これが標準体重です\n");
printf(" %y \n");

このQ&Aに関連する最新のQ&A

A 回答 (2件)

以下のようにして下さい。


#include <stdio.h>
//標準体重の計算
int main (int argc, const char * argv[]) {
int height;
int weight;
double x;
double y;
printf("あなたの標準体重を計算します\n\n");
printf("あなたの身長(cm)、体重(kg)を入力してください\n");
scanf("%d %d",&height,&weight);
printf("height=%d weight=%d\n",height,weight);
x=(double)height/100.0; //ここを変える
y=x*x*22;
printf("これが標準体重です\n");
printf(" %f \n",y); //ここを変える
}
------------------------
x=(double)height/100.0;
ですが、height/100だと整数型なので切り捨てが発生していまいます。
回答例のようにして、切り捨てが発生しないようにします。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございます。
プログラミングはまだまだ分からないことばかりなので
また機会がありましたらよろしくお願いします。

お礼日時:2009/07/15 12:24

>#1さん


>x=(double)height/100.0; //ここを変える

もちろん、これで正しいですが、分母・分子の少なくとも一方が
double型であれば右辺全体としてdouble型になりますので、

x = (double) height / 100;
x = height / 100.0;

でもOKです。
    • good
    • 0
この回答へのお礼

訂正してみると正しく表示されました。
ありがとうございました^^

お礼日時:2009/07/15 12:23

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエラーはでないが数値がおかしい(BMI値計算プログラム)

今以下のようなプログラムを製作中なのですがどうしてもうまくいきません;

(1)ユーザに身長と体重を入力してもらう
(2)(1)の値からBMI値を計算し、その結果から「太りすぎ」などの判定を表示し
(3)身長・体重から計算した標準体重と現在の体重との差を表示する

問題は以下です。
・身長と体重の数値を変えても結果(BMI値)は毎回同じで、
100万台の桁違いな数値がでる;(しかし「太りすぎ」などの判定は変化する)

どこがおかしいのかチェックするために(1)の部分のあとに改めて身長と体重を
表示させてみたところ、そこからすでに数値が変なことになっていたので、
おかしいとしたら(1)のscanfなどの部分か型宣言だと思うのですが…

回答よろしくお願いします;;

プログラム
------------------------------------------------
/* bmi.c */
#include <stdio.h>

main()
{
int sintyo, taizyu;
double sintyo2, bmi, hyozyun, sa;

//入力
printf("身長(cm)を入力してください\n");
scanf("%d", &sintyo);
printf("体重(kg)を入力してください\n");
scanf("%d", &taizyu);

//※チェック(身長・体重)
printf("%d\n", &sintyo);
printf("%d\n", &taizyu);

//計算
sintyo2 = sintyo / 100; //cm→m
bmi= taizyu / (sintyo2 *sintyo2); //BMI値計算
hyozyun = (sintyo2 *sintyo2) * 22;//標準体重
sa = hyozyun - taizyu;

//※チェック(BMI値)
printf("%d\n", &bmi);

//出力
if(bmi>=25)
printf("BMI値:%f\nあなたは太りすぎです\n", &bmi);
else if(bmi>=23 && bmi<25)
printf("BMI値:%f\nあなたは太りぎみです\n", &bmi);
else if(bmi>=21 && bmi<23)
printf("BMI値:%f\nあなたは標準です\n", &bmi);
else if(bmi>=18.5 && bmi<21)
printf("BMI値:%f\nあなたは痩せぎみです\n", &bmi);
else
printf("BMI値:%f\nあなたは痩せすぎです\n", &bmi);

if(sa>=0)
printf("標準体重:%fkg\n標準体重を+%fkgオーバーしています\n",&hyozyun, &sa);
else
printf("標準体重:%fkg\n標準体重より-%fkgです\n",&hyozyun, &sa);

return 0;
}

結果(身長160、体重50で入力)
------------------------------------------------
身長(cm)を入力してください
160
体重(kg)を入力してください
50

1310600 (←身長チェック 以下3つの値は不動です;)
1310596 (←体重チェック)

1310580 (←BMI値チェック)

BMI値:0.000000
あなたは太りすぎです
標準体重:0.000000kg
標準体重より-+NANkgです

今以下のようなプログラムを製作中なのですがどうしてもうまくいきません;

(1)ユーザに身長と体重を入力してもらう
(2)(1)の値からBMI値を計算し、その結果から「太りすぎ」などの判定を表示し
(3)身長・体重から計算した標準体重と現在の体重との差を表示する

問題は以下です。
・身長と体重の数値を変えても結果(BMI値)は毎回同じで、
100万台の桁違いな数値がでる;(しかし「太りすぎ」などの判定は変化する)

どこがおかしいのかチェックするために(1)の部分のあとに改めて身長と体重を
表...続きを読む

Aベストアンサー

ザッと見ただけですが…。

> //※チェック(身長・体重)
> printf("%d\n", &sintyo);
> printf("%d\n", &taizyu);

sintyoのアドレス値とtaizyuのアドレス値を出力しています。
& は、不要です。

> //計算
> sintyo2 = sintyo / 100; //cm→m

int型のsintyoをint型の100で割った結果、小数点以下を切り捨ててsintyo2に代入してしまっています。
これでは、正確なBMI値を求められません。

身長と体重を入力する際、整数値でよいのですか?
身長172.5cmとか、体重62.4kgなんていう入力があってもよいのではないでしょうか。

QC言語です

課題を出されましたC言語ですif文を用いてプログラムしてほしいです
身長と体重を入力して、BMI 体重(kg)÷身長(m)×身長(m)と標準体重(=22×身長×身長)を計算し判定結果を表示するプログラムをif文で作成してほしいです

ただし身長は5桁、体重は5桁、BMIは4桁標準体重は5桁で
表示し、小数点以下は1桁で表して下さい


18,5 やせぎみ
18,5-25未満
25-30未満 肥満ぎみ
30以上 高度肥満

実行例(身長を160、体重を60として入力して下さい

これからあなたのBMIを測定します
必要な情報を入力して下さい

あなたの身長は(cm)?
あなたの体重は(kg)?

あなたの身長は160.0cmです
あなたの体重は 60.0kgです
あなたのBMIは23.4です
身長160.0の方の標準体重は、56.3kgです
あなたのBMIの判定は、標準です

お願いします

Aベストアンサー

#include <stdio.h>
#include <math.h>

typedef struct data_tag{
 double height;
 double weight;
} data;

double BMI(data d);
double StandardWeight(data d);
data input(void);
void output(double bmi, double stdweight, data d);

int main(void) {
 data d;
 d = input();
 output(BMI(d), StandardWeight(d), d);
 return 0;
}

double BMI(data d) {
 return d.weight / pow(d.height/100, 2);
}

double StandardWeight(data d) {
 return 22 * pow(d.height/100, 2);
}

data input(void){
 data d;
 printf("あなたの身長は (cm) ?");
 scanf("%lf", &d.height);
 printf("あなたの体重は (kg) ?");
 scanf("%lf", &d.weight);
 return d;
}

void output(double bmi, double stdweight, data d) {
 char *p;
 if (bmi < 18.5) {
  p = "やせぎみ";
 } else if (bmi < 25) {
  p = "標準";
 } else if (bmi < 30) {
  p = "肥満ぎみ";
 } else {
  p = "高度肥満";
 }
 printf("あなたの身長は%5.1fcmです\n", d.height);
 printf("あなたの体重は%5.1fkgです\n", d.weight);
 printf("あなたのBMIは%4.1fです\n", bmi);
 printf("身長%5.1fの方の標準体重は%5.1fkgです\n", d.height, stdweight);
 printf("あなたのBMIの判定は%sです\n", p);
}

#include <stdio.h>
#include <math.h>

typedef struct data_tag{
 double height;
 double weight;
} data;

double BMI(data d);
double StandardWeight(data d);
data input(void);
void output(double bmi, double stdweight, data d);

int main(void) {
 data d;
 d = input();
 output(BMI(d), StandardWeight(d), d);
 return 0;
}

double BMI(data d) {
 return d.weight / pow(d.height/100, 2);
}

double StandardWeight(data d) {
 return 22 * pow(d.height/100, 2);
}

data input(void)...続きを読む

Q*をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください

はじめまして。
現在C言語の勉強している大学生です。

『*』をユーザーが入力した数字の数だけ表示するプログラムの作り方を教えてください。
例えばユーザーが5と入力したら*****とでるもの。

(本に載っている演習なのですが答えがのっていないのです。)
whileかforを使うのだと思うんですが。。
よろしくお願い致します。

Aベストアンサー

これで、OKです。
とても簡単なプログラムです。

#include<stdio.h>
int main(void)
{
int i,num;
printf("何個表示しますか?->");scanf("%d",&num);

for(i=0;i<num;i++)
{
printf("*");
}
printf("\n");

return 0;
}

QC# ログイン画面からメイン画面への画面遷移について

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示することがある為)

---------------------------------------------------------------------
private void LoginButton_Click(object sender, EventArgs e)
{
   /* ログイン処理 */

   //ログイン成功時
   //メイン画面インスタンス生成
   MainForm mainForm = new MainForm();
   //ログイン画面インスタンスを代入
   mainForm.loginForm = this;
   //メイン画面表示
   mainForm.Show();
   //ログイン画面非表示
   this.Visible = false;
}
---------------------------------------------------------------------

また上記の方法だとメイン画面を閉じても、アプリケーションは終了しない為
メイン画面の閉じるボタンを押した場合に以下の処理を行っています。

---------------------------------------------------------------------
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
   //ログイン画面クローズ
   loginForm.Close();
}
---------------------------------------------------------------------

以上、宜しくお願いします。

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示す...続きを読む

Aベストアンサー

#2です。
最初にログイン画面のみを表示したいなら
メイン画面のForm_menu_Load(loadイベント処理)
の中で、ログイン画面をモーダル表示し、
NGならメイン画面のcloseのほうがよいかも知れません。

Q最大値と最小値を表示したいのですが・・・

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]<num[j])
min=num[i];
}
}
printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

double numに入っている数字から最大値と最小値を求めたいのですが、このままだと両方とも1.000になってしまうんです・・・
どうやったらちゃんと最大値と最小値が表示されるのでしょうか??
初心者なものでスイマセンが教えてください!!


#include<stdio.h>

int main(void)
{
int i,j;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(num[i]>num[j])
max=num[i];
}
}

for(i=0; i<10;...続きを読む

Aベストアンサー

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4.5,3.1,7.0,9.2,1.0,5.7,9.3,2.3,0.3,1.0};
double max,min;

max=num[0];
for(i=0; i<10; i++)
{
if(num[i]>max)
max=num[i];
}

min=num[0]
for(i=0; i<10; i++)
{
if(num[i]<min)
min=num[i];
}

printf("最大値は%fです。",max);
printf("最小値は%fです。",min);

return 0;
}

なぜforループが2重になっているのかよくわかりませんが、
考え方として、
・とりあえず配列の最初の値を暫定の最大値としてセットする
・forループで配列を調べていき、配列の値が暫定の最大値より大きな場合、それを暫定の最大値とする。
・forループを抜けると、暫定の最大値は暫定ではなく、その配列の最大値となっている。
という流れが普通のやり方です。

以上を踏まえてコーディングを手直しすると、以下のようになります。

#include<stdio.h>

int main(void)
{
int i;
double num[]={4....続きを読む

QC言語 While文(ループ)内の文字入力

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }

   return 0;
}

【実行結果(キーボードからは「 e 」と入力」)】
1文字を入力:e
入力したのは e です。
1文字を入力:入力したのは
です。
1文字を入力:

【私が意図している結果】
1文字を入力:e
入力したのは e です。
1文字を入力:


 ちなみにC言語の環境は、インターネットで無料で入手できる試食版です。(LSI C-86 Ver3.30c 試食版)
 上記プログラムを見てもらえればお分かりだと思いますが、「xを入力するまで、永遠と1文字入力とその表示を行う」ことを意図しています。しかし実際の結果は意図に反しています。
 1回目は正常に動作しているようですが、問題は2回目以降。scnafで入力待ちをすることなく、なぜかscanfをスルーする形で3回目のscanf入力待ちとなっています。この理由を教えてください。お願いします。

While文で、1文字入力をやれば思うようにうまくいかない。数字(データ)入力や、文字列入力の場合(%d 及び %s)ならうまくいく。文面で説明するより実際のプログラムを見た方が分かりやすいと思うので、以下にプログラムとその実行結果、実行結果に対する私が意図している結果とを示します。

【プログラム部分】
#include<stdio.h>

int main(void)
{
   char a;

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);

   if(a == ...続きを読む

Aベストアンサー

>1文字を入力:入力したのは
>です。

は、[Enter]キーの入力によるためです。
[Enter]キーをスルーする必要があります。

   char a;
char dummy; /*[Enter]キー用*/

   while(1)
   {
   printf("1文字を入力:");
   scanf("%c",&a);
scanf("%c",&dummy); /*[Enter]キー用*/

   if(a == 'x')
     break;

   printf("入力したのは %c です。\n",a);
   }


で、どうでしょうか?

QC言語 最大値と最小値を求めて表示するプログラム

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
ヒント:配列の中に -1 があればデータの終わりだと判断できる。
ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。


●解答
#include <stdio.h>

void maxmin(int array[],int *max,int *min);

int main(void)
{
int i = 0,array[10],max,min;

do {
printf("%d 番目の数:",i + 1);
scanf("%d",&array[i]);
i++;
} while (array[i - 1] != -1);

maxmin(array,&max,&min);

printf("最大値 %d : 最小値 %d\n",max,min);

return 0;
}

void maxmin(int array[],int *max,int *min)
{
int i = 0;

*max = 0;
*min = 100;

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;
}
}

はじめまして。

C言語を学習中です。

下記の問題演習の解答として記載されているプログラムがどうしても理解できません。

特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。

while (array[i] != -1) {
if (array[i] > *max) *max = array[i];
if (array[i] < *min) *min = array[i];
i++;

具体的に教えてください。

よろしくお願い致します。


●問題
0~100の範囲で入力された複数の数値の中から、
最大値と最小値を求...続きを読む

Aベストアンサー

>while (array[i] != -1) {
>if (array[i] > *max) *max = array[i];
>if (array[i] < *min) *min = array[i];
>i++;

手でコードを追いかけていくのが上達への近道だとは思いますが…。

今回は、データの範囲が0~100と決まっていますので、
まずは、仮の最大値として下限の0を、仮の最小値として上限の100を、
それぞれセットしています。
そして、配列の中身を、その時点での最大値や最小値と比べて、
データの方がその時点での最大値よりも大きければ最大値の値を更新し、
データの方がその時点での最小値よりも小さければ最小値の値を更新する、
というアルゴリズムです。

ループを脱出した(つまり、すべてのデータをチェックし終わった)段階で
変数maxやminに入っている値が、(仮ではない)真の最大値や最小値となります。

Q戻り値の意味がわかりません…

戻り値とはどういう値なのか簡単な例文で教えて頂けますか?

Aベストアンサー

バカくさいかもしれませんが簡単な例えをだしてみます。
2人の子供がいて、名前をそれぞれ太郎・花子にしましょう。この2人の子にある役割を決めます。
・花子は飴をもらうと、それをチョコにする役割。(できるかは別として)
・太郎は花子を呼んで飴をあげる役割。

さてこの例では太郎の飴が引数(ひきすう)になり
花子のチョコが戻り値になります。

このイメージを元に次の文を読んでみてください。

「プログラム中の関数やサブルーチンが処理を終了し
呼び出し元に処理の結果として返す値。」

これが戻り値の正しい定義です。
そのほかにはNo1さんのような役割指すときも、それを「戻り値」と呼んだりします。

Qifとswitchはどのように使い分けたらいいのでしょうか?

ifとswitchはどんなところが違うのですか?
どのように使い分けたらいいのでしょうか?
よろしくお願いします

Aベストアンサー

単純な分岐ならif文、3つ以上の条件分岐がある場合はswitch文で切り分ければよいと思います。
例えば何度も呼び出される関数の a という引数の値が必ず 1 か 2 か 3 になると分かっている場合はswitch文で書いた方がわかりやすいです。
また、1 と 2 の処理だけまとめたい、という使い方も出来ます。(例2参照)

【例1】
void func( int a )
{
switch( a )
{
case 1:
// 処理A
break;

case 2:
// 処理B
break;

case 3:
// 処理C
break;

default:
// その他の値はコーディングミス
break;
}
}

【例2】
void func( int a )
{
switch( a )
{
case 1:
// a が 1 ならここを通過。このまま処理は case 2 へ遷移する
case 2:
// a が 1 か 2 であればここにくる
break;

case 3:
// 3 ならここにくる
break;

default:
// その他の値はコーディングミス
break;
}
}

単純な分岐ならif文、3つ以上の条件分岐がある場合はswitch文で切り分ければよいと思います。
例えば何度も呼び出される関数の a という引数の値が必ず 1 か 2 か 3 になると分かっている場合はswitch文で書いた方がわかりやすいです。
また、1 と 2 の処理だけまとめたい、という使い方も出来ます。(例2参照)

【例1】
void func( int a )
{
switch( a )
{
case 1:
// 処理A
break;

case 2:
// 処理B
b...続きを読む

Qif文を使わずに奇数・偶数を判断

はじめまして。C言語解説サイトを巡ってみたのですが、if文無しの奇数偶数判断にまで辿りつかず頭を抱えています。
任意の数字を(指定回数分)打ち込み、奇数だった場合のみ加算し合計を表示するというプログラムを作成したいのですが色々と規制がかかっており、if文・switch文は使用不可/ループも1回のみとなっています。
if文を使えれば x%2 == 1 で奇数と判断できるのですが・・・。

■ if文を使わず奇数・偶数かを判断→加算 の流れ

を是非教えて頂きたいです。お時間ありましたらご教授よろしくお願い致します。

Aベストアンサー

打ち込んだ数値が整数だったらの話ですが。

・偶数の場合2で割った余りは0 奇数の場合2で割った余りは1

・(上で余りとして出た)0を掛けた答えは0
・(上で余りとして出た)1を掛けた答えは奇数だった数値そのもの

というのを利用するとif文無しで奇数のみを加算できそうですね。


人気Q&Aランキング