#include<stdio.h>
int main(void){

int n,i,j,k;
char c='*';

printf("正の整数:");
scanf("%d",&n);
if(n>0){

for(i=1;i<=n;i++){
printf("%d",i);

for(j=1;j<=n+1-i;j++){
if(j==1){
if(i-1>0){
for(k=i-1;k>0;k--){
printf(" ");
}
}
}
printf("%c",c);
}
printf("\n");

}

}

break;
return 0;
}

これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか?
困ってます↓

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

A 回答 (7件)

・「プログラムの流れ・終了が、判らない」ですかね。



 if, for 文など、基本的な部分を勉強してみては如何でしょう。

 なお、末尾の return 0; は、「プログラム終了」の命令です。
 質問者様が break; を入れた場所は、ここを「nが0以下のとき『は』通過する」と
 理解できていたから、ですよね。

☆となると、「プログラム終了直前に、なにを(どこへ)ブレイクさせればいいんだ」となりませんか。

  http://www.kumei.ne.jp/c_lang/

>これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか?

 No.2 さんのとおり、
 質問者様の break; が、エラー(誤った使い方)だからです。

>でもnが0以下のとき、プログラムを終了させたいんですよ

 if 文を勉強すると、「nが0以下のとき」を簡単に記述できるようになります。
 今回のように「nが0を超えるとき」の if 文があるなら、
 ちょうど反対の条件なので、else 文で簡略化できます。

 今回の break; は、少なくとも else break; とすれば、それでも誤った使い方ですが、
 少しは救い?があったかと・・。

 というか、
 「なにもしないで」終了ですよね。でしたら、なんの「命令」も不要です。
 冒頭で述べた、末尾の return 0; は、「プログラム終了」の命令です。

 ここへ、「nが0以下のとき」は、直行します(◆)。
+++++++++++++++++++++++++++++++++++++++++++++++++++
蛇足
 質問者様のソースで、

  >if(n>0){
  >for(i=1;i<=n;i++){

  >if(i-1>0){
  >for(k=i-1;k>0;k--){

 について、if 文と for 文の条件式とが、機能的に重複( if 文不要)しています。

 以下に、その部分を整理してみました( n → iVal )。
 0 や負の数で試してください。

#include <stdio.h>

int main( void )
{
 int iVal, i, j, k;

 printf( "正の整数:" );

 scanf( "%d", &iVal );

 for( i = 1; i <= iVal; i++ ){ // ◆ iVal が 0 以下のとき、当 for 構文スルー

  printf( "%2d", i );

  for( j = 1; j <= ( iVal + 1 - i ); j++ ){

   if( 1 == j ){

    for( k = ( i - 1 ); k > 0; k-- ) printf( " " );
   }
   printf( "*" );
  }
  printf( "\n" );
 }
 return( 0 ); // プログラム終了
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

この回答への補足

そうなんですよ
breakの位置は間違えたんじゃないんです;
あれで正しいと思ってたんです。。
ただきちんとbreakを理解してなかったんですよね。。
しかも自分のプログラムに条件の重複があったのも気づきませんでしたしほんと関心しました。
さらにC言語のサイトまでありがとうございます!
いろいろ助かりましたぁ^^
何かあったときはまたよろしくお願いします!

補足日時:2009/05/16 00:12
    • good
    • 0

>fprintf(,"");


>と
>stderr
>の意味を教えていただけませんか??

fprintfはファイルへ出力する関数です。
stderr はエラー表示のための出力と思ってかまいませんので、エラー表示のための出力になります。printfだと標準出力(stdout)への出力となります。
stdoutとstderrはコマンドプロンプト上では同じコンソールへの出力となりますから、printfでやっても基本的にはかまわないのです。が、このプログラムの出力を別のプログラムの入力にしたい、などという場合(バッチファイルではパイプを使う場合など)を考えると、エラーメッセージと標準的な出力は分けた方が良い、とされています。

取り合えず、多分、質問者様のソースから「break;」を消せば、良し悪しは別としてコンパイルと実行は可能かと思います。

この回答への補足

まだ自分の知識が足りないのであまり理解できなかったです><
わざわざ答えてくださってありがとうございます。。

補足日時:2009/05/16 00:21
    • good
    • 0

#2です。


>ありがとうございます!
>でも下でも書いたんですが、nが0以下のときプログラムを終了させたいんですよ;
>どうしたらいいでしょうか??

printf("正の整数:");
scanf("%d",&n);
の次の行へ
if (n<=0) return 0;
を入れて下さい。
これで、nが0以下の時は、そこで終了します。
ですから、 if (n<=0) return 0; の次の行は、
nが1以上であることを前提にしたコーディングをすれば良いです。
つまり if(n>0)の文は、不要です。(あってもエラーにはなりません。必ずif(n>0)が成立するだけです)

この回答への補足

ありがとうございます!
すごいわかりやすかったです^
助かりました。

補足日時:2009/05/15 23:55
    • good
    • 0

fprintf とか stderr くらい調べればいくらでも出てきそうな気がするんだけど....


どのくらい調べました?

この回答への補足

すいません。
全く調べてませんでした><

補足日時:2009/05/15 23:53
    • good
    • 0

break;はいらないかと思います。


ifでn>0のみの場合にfor文などを実行してますから、nが0以下の場合は貴方の希望通りに何も実行されずに終了すると思います(確かめてませんが)。

n<=0の場合にメッセージなどを出したい場合は、elseでやるとか。
むしろ、
if( n <= 0 ){
fprintf(stderr,"n <= 0\n");
exit(1);
}
などとやった方が読みやすいかもしれないですけど。

この回答への補足

ありがとうございます↑
質問なんですけど
fprintf(,"");

stderr
の意味を教えていただけませんか??

補足日時:2009/05/15 00:31
    • good
    • 0

break文は、for文やwhile文の括弧の内側でのみ使用可能です。

括弧の外側では使用できません。
for(なにがしかの条件){
・・・ここは使用可能
}
・・・ここでは使用できません。

この回答への補足

ありがとうございます!
でも下でも書いたんですが、nが0以下のときプログラムを終了させたいんですよ;
どうしたらいいでしょうか??

補足日時:2009/05/14 19:52
    • good
    • 0

いや、だからbreakの位置がおかしいいってコンパイラが教えてくれてますって。


breakは、switchブロックやループから脱出するのに使用しますが…、
あたなのプログラムのbreakの位置を確認してみては?

ループからすでに抜けた後に呼び出してるでしょ??

この回答への補足

そうですね;
でもnが0以下のとき、プログラムを終了させたいんですよ↓

どうしたらいいでしょうか?↓

補足日時:2009/05/14 19:49
    • good
    • 0

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

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

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

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

Q英訳(not only ~ but の挿入位置)を教えてください。

次の文を英訳したいのですが、not only, fromの挿入位置はどちらが
正しいでしょうか。または英訳は正しいでしょうか。
文法の説明も一緒に御説明いただけますでしょうか。

In this commercial, Alison, whose vivid beauty comes not only from her appearance but from within herself, shows her natural facial expressions as much as possible, in the costume she has never worn in the film.

In this commerscial, Alison, whose vivid beauty comes from not only her appearance but within herself, shows her natural facial expressions as much as possible, in the costume she has never worn in the film.

このコマーシャルに、外見だけではなく、内面から美しく輝いたアリソンが、限りなくありのままの素顔に近い表情や、これまでに見せたことのない衣装で登場します。

次の文を英訳したいのですが、not only, fromの挿入位置はどちらが
正しいでしょうか。または英訳は正しいでしょうか。
文法の説明も一緒に御説明いただけますでしょうか。

In this commercial, Alison, whose vivid beauty comes not only from her appearance but from within herself, shows her natural facial expressions as much as possible, in the costume she has never worn in the film.

In this commerscial, Alison, whose vivid beauty comes from not only her appearance but within he...続きを読む

Aベストアンサー

not only ~ but 英語的にも前者。 

within より 直前の韻から from her inside
as much as possible は少し陳腐。

shows more ....expressions/ beautiful face than ever seen before、或いは
is expressing herself as close to her mind/heart as she can.
等 としたい。

in the costume より with the costume,
worn より is dressed uo の受身が。

film なら映画であるがそれがふさわしいか?
video clip のような気もする。 

経験的、感覚的、英語によると個人的感想です.

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q①その衛生は私達に位置を正確に教えてくれる ②沖縄に台風が近づいている ③彼らは新しいエンジンを開発

①その衛生は私達に位置を正確に教えてくれる
②沖縄に台風が近づいている
③彼らは新しいエンジンを開発している
④誰かが特効薬を見つけるまで人々はその病気を恐れるでしょう

この①~④を英訳してください!

Aベストアンサー

1. The satellite shows us the accurate position.
2. The typhoon is approaching to Okinawa.
3. They are developing a new engine.
4. People would keep fearing the disease until someone finds a silver bullet.

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q修飾語句の位置

とても初歩的な質問です!!
僕は英作の問題でいつも修飾語句の位置に苦戦します!!
名詞の前に置くのか・・・・
名詞の後に置くのか・・・・

例えば、『病気の年老いた人々』を英訳する際、

『old people of sick』なのか『sick old peaple』なのか混乱します!!

どなたか、【修飾語句の位置】に関するルールみたいなものを教えてください!!お願いします!!

Aベストアンサー

Milancomです! う~ん、またまたお褒めのお言葉、かたじけない。
そのように、褒め上手なtigakuさんこそ、お若いのになかなかご優秀であられると感心いたします。

「同じ英文を何回も音読するのと、いろんな英文を一回ずつ読むのはどちらがベストなのでしょうか??やっぱ『いろんな文章を何回も読む』でしょうか??^^;笑」

確かに、よい文章をいろいろと、かつ何回も読むのが最良ではありましょう。が、一日は二十四時間、出せるエネルギーにも限界があります。

私が好きなやり方は、いろいろな文章を手当たり次第読んでみます。中には、難しすぎたり、興味が続かなくて途中でやめるものもありますが、そういうのは気にせずやめます。そんな中で、時に相性のよい文章に出会うことがありますから、これを何回も音読します。

ご参考までに!

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Qshall we now do what you want?のnowの位置

あなたが今してほしいことをしましょうか?の英訳なんですけど、
nowの位置を変更して、

1) shall we do now what you want?

2) shall we do what you want now?

3) now shall we do what you want?

にしても文法的におかしくないですか?

Aベストアンサー

1)この場所にnowは普通入れないと思います。

2)文法的にはおかしくはないのですが、この場合は、「あなたがしてほしいことを今しましょうか?」ということで、「今」がかかるものが違ってきます。

3)この場合は、
Now, shall we do what you want?
と、Nowの後にカンマを入れれば文法的におかしくないですが、やはり意味が違ってきます。この場合のNowは、「さあ、」「さて、」「では」といった呼びかけの意味が強くなり、
「では(今から)、あなたが望むことをしましょうか」という感じになります。

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つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q副詞の位置について。

副詞の位置について質問です。
たとえば、「彼は短い髪の私の友達とたくさん話した。」
を英訳する場合、

He talked with my friend with short hair a lot.という風に、a lotは文末でいいのでしょうか?

また、

Tom goes to school by bus every day.

という文でも、every dayは文末でいいのでしょうか?
それとも、Tom goes to school every day by bus.のほうがよいのでしょうか?

副詞の位置について、漠然としていて困っています。(頻度や程度を表す副詞の位置に関しては理解しているつもりですが、それ以外の副詞に関しては、ほぼ感覚で位置を決めてます;;)

副詞の位置について、どなたか詳しくご教示ください。お願いします!

Aベストアンサー

はじめまして。

ご質問1:
<He talked with my friend with short hair a lot.という風に、a lotは文末でいいのでしょうか?>

1.こでのa lotは副詞として使われています。副詞のa lotは「たくさん」という意味になり、ここで使われているような「とても(短髪)」の意味にはなりません。

2.この文は
He talked with my friend with very short hair.
にした方がいいでしょう。

3.veryは「とても」という、形容詞short「短い」を修飾する副詞ですが、このように文中に置かれることもあります。

4.程度を表す副詞、much、so、very、littleなどは、文頭、文中、文末など、自由に置かれます。例:

文頭:
Little did I study yesterday.
「昨日はほとんど勉強しなかった」
Little「ほとんど~ない」という副詞を強調するため、前に出て主語・動詞の倒置が起こっているのです。(動詞は助動詞+原形にわかれ、助動詞が主語の前にきます)

文中:
I studied so much in the library.
「図書館で沢山勉強した」

文末:
I studied English so much
「英語を沢山勉強した」


ご質問2:
<Tom goes to school by bus every day.
という文でも、every dayは文末でいいのでしょうか?>

1.正しいです。

時を表す副詞は、場所・程度・手段・様子などを表す副詞の後、つまり最後に持ってきます。

ここでは、by busが手段を表す副詞ですので、every dayはやはり最後に置かれます。

2.一般に、「程度・様子→手段→場所→時間」の順で置かれます。

例:
I study very hard with useful books in the library every day.
「私は、毎日、図書館で、役に立つ本を使って、一生懸命、勉強する」

ここでも
程度・様子very hard→手段with useful books→場所in the library→時間every day
の順になっています。

以上ご参考までに。

はじめまして。

ご質問1:
<He talked with my friend with short hair a lot.という風に、a lotは文末でいいのでしょうか?>

1.こでのa lotは副詞として使われています。副詞のa lotは「たくさん」という意味になり、ここで使われているような「とても(短髪)」の意味にはなりません。

2.この文は
He talked with my friend with very short hair.
にした方がいいでしょう。

3.veryは「とても」という、形容詞short「短い」を修飾する副詞ですが、このように文中に置かれることもありま...続きを読む

Qvoid main(void){...}だとDosWindowが開くので

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=NULL;
wc.cbWndExtra=NULL;
wc.hIcon=LoadIcon(NULL,IDI_EXCLAMATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
RegisterClass(&wc);
hW=CreateWindow
(
"goo",
"教えて!goo",
WS_OVERLAPPED,
0,
0,
640,
456,
NULL,
NULL,
hI,
NULL
);
ShowWindow(hW,nCS);
UpdateWindow(hW);
while(GetMessage(&ms,NULL,NULL,NULL))
{
TranslateMessage(&ms);
DispatchMessage(&ms);
}
return (ms.wParam);
}

もっと簡単にDosWindowが開かないようにする方法はないのでしょうか?
もしないとすると上記記述でもっと簡単にできないでしょうか?

わざわざWindowsアプリにして以下のようにするしかないのでしょうか?

LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP)
{
//ここに宣言を置く
switch(wM)
{
case WM_CREATE:
//ここに処理を置く
return 0;
default:
return(DefWindowProc(hW,wM,wP,lP));
}
}
WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
WNDCLASSwc;
HWNDhW,hPW;
MSGms;

wc.lpszClassName="goo";
wc.lpfnWndProc=(WNDPROC)WinProcedure;
wc.hInstance=hI;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc...続きを読む

Aベストアンサー

ウィンドウを開く必要がないなら、mainをWinMainに変更するだけで良いのでは? ウィンドウクラス登録、ウィンドウ作成、メッセージループ、ウィンドウプロシージャは全て不要な気がしますが。

WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS)
{
  //処理内容

  return 0;
}


人気Q&Aランキング

おすすめ情報