![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
C言語の勉強をしはじめた者です。
よろしくお願いします。
「整数nを入力したときにn重for文にするにはどうしたらよいでしょうか?n個for文の中身の条件は、それぞれ異なりますが、nに依存した条件です。
」
たとえば、n=3と入力したとき、
for(i=1;i<=3;i++){
for(j=i+1;j<=4;j++){
for(k=j+1;j<=5;k++){
...
}}}
また、
たとえば、n=5と入力したとき、
for(i=1;i<=3;i++){
for(j=i+1;j<=4;j++){
for(k=j+1;k<=5;k++){
for(l=k+1;l<=6;l++){
for(m=l+1;m<=7;m++)}
...
}}}}}
という感じに整数nを入力すると、その分、for文がでて、機能するようなプログラムはどうすればいいでしょうか?
よければアドバイスください。
質問の仕方が下手くそですいません..
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
再帰呼び出しを使わないならこんな感じかな。
------------------------------------------------------------
#include <stdio.h>
int main(void){
int i,j,k,l,m;
int nest=5; /*ネストの数*/
int cnt[10]={0,1}; /*ループカウンタ用。必要な要素数 = nest+1*/
int d=1; /*今いるところのネストの深さ。初期値1*/
while(cnt[0]<=0){
if(cnt[d]>d+2){
/* ループ継続条件を満たさないので外側のforループへ。外側のループカウンタ++ */
d--;
cnt[d]++;
}
else if(d<nest){
/* 内側のforループへ。内側ループのカウンタ初期値は現在のループカウンタ+1 */
cnt[d+1]=cnt[d]+1;
d++;
}
else if(d==nest){
/* 一番内側のforループ。やりたい処理とカウントアップ */
for(i=1;i<=nest;i++)printf("%2d\t",cnt[i]);
printf("\n");
cnt[d]++;
}
}
/*普通にネストした場合*/
printf("\n");
for(i=1;i<=3;i++){
for(j=i+1;j<=4;j++){
for(k=j+1;k<=5;k++){
for(l=k+1;l<=6;l++){
for(m=l+1;m<=7;m++){
printf("%2d\t%2d\t%2d\t%2d\t%2d\t\n",i,j,k,l,m);
}
}
}
}
}
return 0;
}
No.9
- 回答日時:
C言語で、ループの入れ子レベルを可変にするには、次の方法があります。
1. (既に回答が出ているように)再帰呼出しを使用する。
2. インタプリタを実装し、その上で動作するプログラムを記述する。
3. C言語のインタプリタを使用し、動的にソースファイルを編集しながら実行させる。
4. m4などのマクロ言語プロセッサを使用し、コンパイラのフロントエンドとする。
5. ソースコードジェネレータを自作する。
もし、C++であれば、上記の4.と同様のことを、C++のテンプレートを用いればできるような気がします。
まあ、いずれの方法を用いるにしても、決して簡単とはいえません。少なくとも、
> C言語の勉強をしはじめた者
には無理だと思いますので、別の方法を考えた方がよいでしょう。
No.8
- 回答日時:
No3です。
私の回答は完全にお門違いです。
失礼致しました。
単純にNに依存する違う条件のループを不定数N回、回したいのだと思ったんですけど不定数N個、回したいという質問のようですね。
今更ですが、皆さんの回答にあるように再帰処理が最良だと思います。
ただC言語学び始めで再帰処理はちょっと・・・って感じですね。
一応 階乗計算(再帰処理お約束)の参考URL貼っておきます。
個人的には質問者がどのような物を作成しているのか気になりますが。
参考URL:http://www.pro.or.jp/~fuji/puzzlestudy/recursive …
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?a65a0e2)
No.7
- 回答日時:
もっとも、簡単でかつ確実な方法は、入力されるであろうnの値毎に、サーブルーチンをあらかじめ作成しておき、それを呼び出すことです。
例えば、nが3,5,7と入力されることが、わかっているなら、そのnの値専用に、sub3,sub5,sub7のような関数をつくっておき、それを呼び出せばよいでしょう。ただし、そうでは、なくで1つの関数でそれを実装したいということであれば、それを実現する一般的な方法はありません。私としては、どうしてこのような質問をされたのかということ自体に非常に興味があります。どうしてこのような質問をされたのか、差し支えなければ教えていただけませんでしょうか。
No.6
- 回答日時:
>C言語の勉強をしはじめた者です。
ということなら、
>n重for文にするにはどうしたらよいでしょうか?
普通そのようなことをする必要はありません。
まず、普通のCのやりかたを学びましょう。
Cプログラムを出力するプログラムを作ればそれは可能かと思いますが、今そういうことをやる必要は無いでしょう。
そういうのが好きなら lisp とかを学ぶのが吉かもしれませんが。
No.5
- 回答日時:
即席で作ったので、間違っているかもしれませんが
やりたいことはこんな感じでしょうか?
#include <stdio.h>
#include <stdlib.h>
int* p;
int n = 5;
void Fnc(int start , int end , int depth , int maxdepth ){
int i,nPrintCnt;
int nowdep = maxdepth - depth;
for( i = start ; i <= end ; i++ ){
p[nowdep] = i;
if (depth > 0){
Fnc( i+1,end+1,depth-1,maxdepth);
}else{
// ここでfor文内部の処理
for(nPrintCnt = 0 ; nPrintCnt < nowdep+1 ; nPrintCnt++ ){
printf("%2d",p[nPrintCnt]);
}
printf("\n");
}
}
}
int main()
{
p = (int*)malloc(sizeof(int)*n);
if (p){
Fnc( 1 , 3 , n-1 , n-1 );
}
free(p);
return 0;
}
n=5の結果
1 2 3 4 5
1 2 3 4 6
1 2 3 4 7
1 2 3 5 6
1 2 3 5 7
1 2 3 6 7
1 2 4 5 6
1 2 4 5 7
1 2 4 6 7
1 2 5 6 7
1 3 4 5 6
1 3 4 5 7
1 3 4 6 7
1 3 5 6 7
1 4 5 6 7
2 3 4 5 6
2 3 4 5 7
2 3 4 6 7
2 3 5 6 7
2 4 5 6 7
3 4 5 6 7
n=3の結果
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
No.4
- 回答日時:
>整数nを入力すると、その分、for文がでて
一般にC言語は、コンパイラ言語なので、LISPに代表されるような動的にシンタックス(文)を構成して評価することができません。
なので、プログラム中で入力された値で"for 文がでて"というのはできません。
そのようなCコンパイラで処理できるソースを出力するプログラムというのは、作れるかもしれません。そういう意味ですか?
プログラムが動作中に入力された値で多重ループを構成するというのは、そのように実行できるようにプログラムを構成します。
見た目は質問文にあるようなfor文にはなりません。
#1,2の方の回答は、そのようなループを構成する方法として再帰呼び出しを使うと言っておられます。
No.3
- 回答日時:
for文の中でどのような処理をするかわかりませんが上にもうひとつ
for被せればいいんじゃないでしょうか?
n=5;
for(i=0; i<n; i++) //N回分ループ
{
for() //ここの条件はNに依存するということなので工夫して下さい。
{
}
}
これじゃ駄目でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- 英語 Is to play soccer fun for you? は、正しい英文ですか? 1 2023/05/08 12:37
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- その他(プログラミング・Web制作) atcoder python コードへの助言 2 2022/08/12 15:31
- Visual Basic(VBA) ExcelVBAで、index、match関数を使用して、指定範囲に出力したい 3 2022/10/18 21:53
- その他(プログラミング・Web制作) プログラミング python 3 2023/06/14 03:55
- C言語・C++・C# c言語で自然数nを入力、2以上n以下の偶数の累積sumを求めるプログラムをfor文を使って作りたいで 4 2022/11/09 14:10
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
do-while文が禁止される理由
-
n重のfor文にするには?
-
エクセルVBAで Do While (1)って?
-
Excel VBAで年度をまたぐ期間の...
-
C++ DirectX カーソルの移動処...
-
break文でループを一気に抜ける...
-
for文while文の無限ループの違...
-
入力した数値を倍々するプログラム
-
C言語 for文を使った一例について
-
C言語のプログラムみてください...
-
猫でもわかる、がわかりません。
-
H8/3048マイコンAD/DA変換について
-
C言語forループが完結した場合...
-
if文の中にfor文なのか、for文...
-
C言語 数字を削除する関数
-
C++のvolatileについて
-
Cプログラムが終了しない
-
C言語の関数の戻り値がおかしい?
-
Aの値からBの値を除するとは??
-
エクセルで可視セルにのみ値貼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
do-while文が禁止される理由
-
break文でループを一気に抜ける...
-
ループを途中で抜けたいのですが。
-
Excel VBAで年度をまたぐ期間の...
-
C言語forループが完結した場合...
-
For文の終了値を関数にしても問...
-
プログラムで関数は使わない方...
-
Cプログラムが終了しない
-
for文while文の無限ループの違...
-
入力した数値を倍々するプログラム
-
if文を使わずに奇数・偶数を判断
-
UWSCにてある一定の動作を無限...
-
入力した文字列から母音だけを...
-
エクセルでC言語のfor文と同じ...
-
猫でもわかる、がわかりません。
-
PIC のプログラムについて ど...
-
C言語、whileループを抜け出す...
-
VBScriptでSQLに接続し、CSV出...
-
エクセルVBAで Do While (1)って?
-
ループの特定入力終了
おすすめ情報