Userが何度も質問を繰り返せるような,下のようなプログラミングが書きたいのですが、どうしたらいいのわかりません。ちなみに私の書いたものでは、一度しか実行できません。わかる方がいらしゃったら教えてください。
--------------------------------------------------------------------
問題:ユーザーがセールスを入れると、$200+コミッション(セールスの9%)がサラリーとしてもらえる。
-------------------------------------------------------------------
実行例:
Enter Sales(-1to end):
Salary is:

Enter Slaes(1 to End):
-------------------------------------------------------
私の書いたプログラム:
#Include<iostream.h>
int main(){
int x;
float;

cout<<"Enter Sales in Dollars"
cin>>x;

y=200+x*0.09;
return 0;
}

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

A 回答 (4件)

No.2での補足に書かれたプログラムですが、if文の位置が正しくありませんね。


-1の判定はxの入力の直後にすべきです。
-1が入力されたときはその後の計算や結果表示は不要なのですから。
    • good
    • 0
この回答へのお礼

私はいつもプログラミングするとき、すこし複雑になると何をどこにおいたらいいのかいまいちわかりません。
実行するときにWarnngがでるだけで、たいして大きい問題にならないので、違っているってわかってても、自分で調べるのにも限界があるし、学校の先生は適当にそれをみて点数しかつけないし、いったい何が悪いのかもよくわからないまま終わってしまいます。
Naturalさんのような、位置の違いを指摘して下さるとすごく助かるし、勉強になります。

お礼日時:2002/02/19 08:20

#2のclow_hです。


warningの理由ですが、ちょいと調べたところ
yをfloat型で宣言しているの原因だと思われます。

なにやら、float型を計算するときはいったんdouble型へ変換し、再びfloat型へ戻すという作業をするらしいので、
float(32bit 符号付き浮動小数点数) < double(64bit 符号付き浮動小数点数)
の図式により、いったんdouble型に変換されて戻すときにDataが失われる可能性があることをコンパイラが警告していると思われます。

実行上では問題ないでしょう。何しろ使用していないと思われるビットで警告を受けているだけなので・・・
もしかしたら、まれにこの領域を使ってしまう可能性がある。というぐらいです。

この警告が出てくるのがいやだったら、yの宣言をdouble型にしましょう。
警告が消えるはずです。

参考URL
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4 …
(このページに、float、doubleのことが書いてありました)
下のURLはこのページのトップページです。

参考URL:http://www.pro.or.jp/~fuji/mybooks/cdiag/index.h …
    • good
    • 0
この回答へのお礼

ほんとにWarningきえました! ご丁寧なアドバイスどうもありがとうございました。
URLも細かいことはまだ理解できないのですが、参考になりました。 
しかし、プログラミングは本当に少しのことで、いろいろ変わってしまうんですね

お礼日時:2002/02/19 08:10

こんにちは


蛇足ながら、ご質問(追加のほう)へお答えします。
>なぜwhile (1),if ( x==-1)なのですか? その1とかー1は一体どういう意味なんでしょうか?

本を読めばわかると思いますが、
while文は条件式(カッコの中身)が真(0以外、条件に合う)なら実行し、偽(0、条件に合わない)なら実行しません。
よって、while(1)は条件に合うので{}の中を実行します。もちろんwhile(0)なら実行しません。

>また、Ifのときは、()に文を実行する文を入れるらしいのですが、なぜ(-1)なんですか

if(x==-1)はEnter Sales(-1to end): で指定されているとおり、-1を入力したら終了せよなので、 xの値が-1だったときと言う意味ですね。
x == -1 は xが-1と等しいときなので条件に合っています。

それでは、蛇足でしたが、がんばってください。

この回答への補足

ご回答ありがとうございました。プログラムを書き直すことができました。とりあえず下記のプログラムで実行はできるのですが、コンパイル上でWarningが出てしまいます。いろいろ試してみたのですが、いっこうにWarningが消えません。なぜ、これではDataが失われる可能性があるのでしょうか? 実行上では何の問題もなかったのですが、、、。
--------------------------------------------------------------------
#include <iostream.h>
int main()
{
int x;
float y;

while(1)
{

cout << "Enter Gross Sales in Dollars :";
cin >> x;
y= 200 + x * 0.09;
cout <<" The Commision of "<< x << " is " << y << endl;

if (x==-1
{
break;// Break loop only if x is -1
}
}
return 0;
}
-----------------------------------------------------------------
Compiling...
commision.cpp
A:\commision.cpp(37) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data

commision.obj - 0 error(s), 1 warning(s)

補足日時:2002/02/18 19:21
    • good
    • 0

ご質問文の様に「永遠に」ということでしたら永久ループを使用すればよいと思います。


但し、実行例には(-1 to end)という但し書きがついていますので、その条件に合致した場合はループを抜けるようにします。

恐らく課題か何かだと思いますのでプログラム全体はあえて記載しませんが、ヒントだけ…。

while(1){
  ・
  ・
  ・
  if(x == -1){
    break;
  }
  ・
  ・
  ・
}

尚、lilnoさんのプログラムは実行例とメッセージ等が微妙に違っていますので御確認下さい。
恐らく写し間違いだと思いますが、floatの後にあるべきyが定義されていないこと、計算後の結果が表示されていないこと(Salary is:に続いて表示される筈)も指摘しておきます。

この回答への補足

naturalさん重大なHintありがとうございました。私はまだプログラミングの超初心者なので、いまいち本を読んでも、実際に自分で書くとかならず行き詰ってしまいます。
すごく基本な質問でごめんなさい。

なぜwhile (1),if ( x==-1)なのですか? その1とかー1は一体どういう意味なんでしょうか?

 本にはwhile(0),この場合は条件文が0なのでcoutで始まる文は実行されない。と書いてあります。While(2)とかの場合もあるのですか?

 また、Ifのときは、()に文を実行する文を入れるらしいのですが、なぜ(-1)なんですか?

補足日時:2002/02/18 16:47
    • good
    • 0

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

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

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

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

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む

Qint *a = new int; エラー

下記をコンパイルすると、'int' 型は 'int *' 型に変換できない(関数 main() )
とエラーが出てしまいました。 何がおかしいのでしょうか ?
初歩的な間違いをしていると思いますが、アドバイスお願いします。

#include<iostream>
#include<stdlib>
#include<ctime>
using namespace std;

void main(void)
{
int *a = new int;
a=rand();
cout<<a<<endl;
delete a;

}

Aベストアンサー

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main(void)
{
srand ( time(NULL));
int *a = new int;
*a=rand();
cout<<*a<<endl;
delete a;
return 0;
}

/*
多分こうだと思う。
想像以上に乱数の精度が悪いような気がする。
*/

Qint i, int i[1];

C++で、
 int i;
と、
 int i[1];
は、どっちで宣言をしても、iは同じ振るまいですか?

Aベストアンサー

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス値(またはアドレス式)です。
代入式の右に配置可能な値を右辺値といいます。

代入式の左に配置出来るのは『領域』です。
変数であっても良いし、配列要素でもかまいません。
また、領域を示す式(int i[1]のときの*iなど)でもかまいません。
配列名(int i[1]のときのi)や定数は領域を持たないため、左辺に配置することが出来ません。
代入式の左に配置可能な領域を左辺値といいます。

int i[1] ;
この形で宣言されたiは右辺値に利用できます。
int *a ;
a = i ;
しかし、iだけでは領域を持たないため左辺値になりえません。
i = 1 ; //コンパイルエラーが出る。

コンパイル時に「有効な左辺値でない」と言う意味のエラーが出るのは「領域を示さない値を左辺値として使っている時」です。

どちらかと言うと「基礎理論」の部類なのでプログラム言語の本などには書いてないのですが、実は最も大切なのが「基礎理論」です。
頑張って勉強してください。

配列、ポインタなどよりももっと基礎的な概念である「右辺値」、「左辺値」を理解しましょう。

int i ;
この形で宣言されたiは代入式の右辺(代入する値)にも左辺(代入される領域)にも使うことが出来ます。
int a ;
a = i ;
i = 10 ;

C言語でも他のほとんどの言語でも「変数は右辺の時と左辺の時とでは解釈が違う」という原則があります。

代入式の右辺に配置出来るのは『値』です。
変数であっても良いし定数であっても、式であってもかまいません。
左辺がポインタ変数の場合は右辺はアドレス...続きを読む


人気Q&Aランキング

おすすめ情報