#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 )」と表示されるのですが何でですか?
困ってます↓
No.6ベストアンサー
- 回答日時:
・「プログラムの流れ・終了が、判らない」ですかね。
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言語のサイトまでありがとうございます!
いろいろ助かりましたぁ^^
何かあったときはまたよろしくお願いします!
No.7
- 回答日時:
>fprintf(,"");
>と
>stderr
>の意味を教えていただけませんか??
fprintfはファイルへ出力する関数です。
stderr はエラー表示のための出力と思ってかまいませんので、エラー表示のための出力になります。printfだと標準出力(stdout)への出力となります。
stdoutとstderrはコマンドプロンプト上では同じコンソールへの出力となりますから、printfでやっても基本的にはかまわないのです。が、このプログラムの出力を別のプログラムの入力にしたい、などという場合(バッチファイルではパイプを使う場合など)を考えると、エラーメッセージと標準的な出力は分けた方が良い、とされています。
取り合えず、多分、質問者様のソースから「break;」を消せば、良し悪しは別としてコンパイルと実行は可能かと思います。
No.5
- 回答日時:
#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)が成立するだけです)
No.4
- 回答日時:
fprintf とか stderr くらい調べればいくらでも出てきそうな気がするんだけど....
どのくらい調べました?
No.3
- 回答日時:
break;はいらないかと思います。
ifでn>0のみの場合にfor文などを実行してますから、nが0以下の場合は貴方の希望通りに何も実行されずに終了すると思います(確かめてませんが)。
n<=0の場合にメッセージなどを出したい場合は、elseでやるとか。
むしろ、
if( n <= 0 ){
fprintf(stderr,"n <= 0\n");
exit(1);
}
などとやった方が読みやすいかもしれないですけど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for文の中にswitch文はいれられ...
-
構文エラー";"が型の前にあり...
-
while文を使った問題なのですが...
-
初心者です。for文、if文を使っ...
-
while文について、c言語...
-
c言語のwhile文を使った計算で...
-
#if 1 #elseの意味について
-
C言語で電卓を作成する。
-
C言語です
-
C言語で、2007年度が残り何日か...
-
教えてください
-
C言語プログラムが理解できなくて…
-
C言語基本 2次元配列(for文...
-
SIGALRMでプロセス終了
-
xのy乗を求める問題で…(ただし...
-
???ダメなんです(分からないん...
-
C言語で分からないことがあり...
-
計算結果がlong型以上になる場...
-
配列を関数に渡す方法
-
C言語で質問です。1~20までの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
for文の中にswitch文はいれられ...
-
#if 1 #elseの意味について
-
プログラミングで二番目に大き...
-
getcの改行判定
-
C言語プログラムが理解できなくて…
-
C言語 数字以外を入力させない...
-
配列を使って魔方陣
-
配列を関数に渡す方法
-
初心者です。for文、if文を使っ...
-
c言語for文
-
c言語で平均をだす
-
while文について、c言語...
-
scanf関数を用いての加減乗除%...
-
行列をべき乗させるプログラム
-
c言語プログラミングで1から100...
-
scanfが実行されません
-
C言語階乗の総和を求める
-
C言語の二分法のプログラムにつ...
-
階乗のプログラム!!
おすすめ情報