#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コンパイルすると『breakの位置が誤っている』『elseの位置が誤っている』となるのは何故?

C言語初心者です。
テキストを真似たつもりで自作してみましたが、コンパイルすると下記のようにエラーが出ます。

エラー E2030 hello.cpp 11: break の位置が誤っている(関数 main() )
エラー E2054 hello.cpp 12: else の位置が誤っている(関数 main() )
エラー E2030 hello.cpp 14: break の位置が誤っている(関数 main() )

特に問題はないように思うのですが。何故でしょうか?
解説宜しくお願いします。

#include <stdio.h>

int main(void)
{
int a;

a = getchar();

if(a == 9)
printf("入力値は%dです。\n",a);
break;
else
printf("入力値は9ではなく %dです。\n",a);
break;
}

Aベストアンサー

if文は、

if(a==9){
 printf("入力値は9です。\n");
} else {
 printf("入力値は9ではなく%dです。\n",a);
}

のようになります。「break」はいりません。因みに、真の場合のprintf文では、"a"を出力させる必要もありません。a==9だからです。
また、こういう書き方も有りかなと…

printf("入力値は9");
if(a==9){
 printf("です。\n");
} else {
 printf("ではなく%dです。\n",a);
}

Qbreak文でループを一気に抜けるには

break文でループを一気に(2個以上)
抜けたい場合はどのようにすればいいのでしょうか?
たとえば下のプログラムで1から2に抜けたい
すなわちifとforの2つの中括弧を同時に抜けたい場合には
どうやってbreak文を記述すればいいのでしょうか?
(goto文は使わないということでお願いします。

int k=0;
int i;

for (i=1;i<10;i++){
  k++;
  printf("%d",k);
  if (k == 5){
    printf("a");
    break;・・・・・・・・・1→
  }
}
printf("finish");・・・・・・・・・2←

Aベストアンサー

No.2 です。

> for文を2つ一気に抜ける場合にはどうしたらいいんでしょうか?

この場合は、素直に goto 文を使うか、No.1 さんのようにフラグで制御するしかないでしょう。

私はC言語実務経験20年以上ですが、goto 文について言えば、「無闇やたらに使うべきではないが、使うべき所で使うのをためらってはいけない」ということです。
よく、「何が何でも絶対に goto は使うな!」と言う人がいますが、これは間違っています。
たった1個の goto 文を避けるために、フラグなどを組み合わせて複雑怪奇な構造にすることの害の方が、余程大きいです。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。


人気Q&Aランキング

おすすめ情報