兩個for循環能處理哪些問題?

本人剛學c語言,


按我理解,本質上,兩個嵌套 for 循環可把兩個集合 A, B 生成 笛卡兒積(Cartesian product) A 	imes B

例如,撲克牌有 4 個花色,每花色 13 張,列印它們的組合。

#include &

int main() {
const char* A[] = { "??", "??", "??", "??" };
const char* B[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
for (int i = 0; i &< 4; i++) { for (int j = 0; j &< 13; j++) printf("%s%s ", A[i], B[j]); puts(""); } }

輸出:

??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K
??A ??2 ??3 ??4 ??5 ??6 ??7 ??8 ??9 ??10 ??J ??Q ??K

交換兩個 for 可以改變生成的次序:

#include &

int main() {
const char* A[] = { "??", "??", "??", "??" };
const char* B[] = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
for (int j = 0; j &< 13; j++) { for (int i = 0; i &< 4; i++) printf("%s%s ", A[i], B[j]); puts(""); } }

輸出:

??A ??A ??A ??A
??2 ??2 ??2 ??2
??3 ??3 ??3 ??3
??4 ??4 ??4 ??4
??5 ??5 ??5 ??5
??6 ??6 ??6 ??6
??7 ??7 ??7 ??7
??8 ??8 ??8 ??8
??9 ??9 ??9 ??9
??10 ??10 ??10 ??10
??J ??J ??J ??J
??Q ??Q ??Q ??Q
??K ??K ??K ??K

3 個嵌套 for 循環等價於 A 	imes B 	imes C ,如此類推。


足夠做計算機動畫了。

先從字元畫做起:

int w=10;

int h=10;

char text[width][height] = {

" * ",

" *** ",

....

}

bool drawText(int col, int row, text)

{

//兩個for循環,以col/row決定起始值,col+width/row+height為終值,把text定義的圖形畫到指定位置

//注意判斷是否超過行列最大值,超過則返回false,以避免把圖形畫到屏幕外

}

然後再搞一個循環,讀取鍵盤輸入(WSAD之類),從而增減傳給drawText的col/row值——現在你就能用鍵盤輸入控制屏幕上的字元畫移動了。

提高1:用多幅字元畫切換,在屏幕播放動畫。

提高2:嘗試找資料切換到圖形模式,通過直接畫點來顯示真正的圖片

提高3:找資料想辦法改善程序性能,避免顯示動畫時屏幕閃爍不止

提高4:想想淡入淡出之類效果怎麼做,給你的動畫加一些特技


如果有棧的話,基本上基礎邏輯都能做出來吧,你可以用棧模擬函數調用,於是就有了函數和遞歸,然後就無所不能了吧。。。


可以列印十遍這句話!

以列印十遍這句話!

列印十遍這句話!

印十遍這句話!

十遍這句話!

遍這句話!

這句話!

句話!

話!


按我理解,不帶for循環的C是圖靈完備的。

帶for循環的C也是圖靈完備的。

也就是說你可以解決C語言能解決的所有問題。

當然顯然樓主不是要問這個。

那Milo巨巨的答案是正解。


二維形式的數據, 可以用兩個循環來遍歷或構造.


沒有什麼是兩個for循環解決不了的,如果有,就在外面再套兩個 (可恥的跑了)


兩層for循環...沒說不能遞歸以及其他的函數調用...

我猜可以上天吧


本人競賽用的廣搜板子,代碼里多用了一個if,當然可以不用,用上三目運算符可以用比較醜陋的方法替代。

競賽代碼風格醜陋,諒解。

int qu[N], qh, qt, dis[N];
int bfs(int st, int ed) {
for (dis[qu[qh = qt = 0] = st] = 0; qh &<= qt; ++qh) for (int u = qu[qh], e = adj[u], v = gto[e]; ~e; v = gto[e = gnxt[e]]) if (v != st !dis[v]) dis[qu[++qt] = v] = dis[u] + 1; return dis[ed]; }

大概介紹一下幾個莫名奇妙的數組名,用的是鏈式前向星存的圖。

adj: adjacency list,鄰接表,存的是鏈表頭節點下標,一個節點是一條有向邊,保存指向的vertex編號。

gnxt[e]: 鄰接表節點e的下一個節點下標。

這裡adj和gnxt中保存-1表示鏈表中當前節點沒有後繼,因此用~e判斷終點。

gto[e]: 鄰接表節點e所在edge指向的vertex編號。

第一個for遍歷隊列,第二個for遍歷隊列頭的相鄰邊。

然後有廣搜自然有Bellman Ford (SPFA)……不過多用了一堆操作,加了循環隊列。用上三目運算符也可以用非常醜陋的方法替代。

int qu[N], qh, qt, dis[N], inq[N];
int bellman_ford(int st, int ed) {
memset(dis, 0x7f, sizeof dis); dis[st] = 0;
for (inq[qu[qh = qt = 0] = st] = 1; qh &<= qt; inq[qu[qh++ % N]] = 0) for (int u = qu[qh % N], e = adj[u], v = gto[e]; ~e; v = gto[e = gnxt[e]]) if (dis[v] &> dis[u] + gw[e]) {
dis[v] = dis[u] + gw[e];
if (!inq[v])
inq[qu[++qt % N] = v] = 1;
}
return dis[ed];
}

這裡鄰接表多保存了一個邊權gw,指的是邊長度。

剛剛手打的,如果出錯了請告知。


兩個for循環

可以便利一個二維列表

可以對一張圖片加個濾鏡

可以給這張圖片重置大小

可以把這張圖片的每個像素點變成一個字元

可以再把這些字元按行列印出來

就醬

這個圖看著不是很好看,再來張小的


你可以把代碼複雜度變成平方(


如果你喜歡,可以用goto徹底代替for循環。


任何二維離散空間的數值計算


雙傅里葉積分算PWM調製頻譜

總而言之本質上的二重積分都可以


for(universe : universes){

for(particle : universe ) {

if(particle.Observed()){

particle.show();

}

}

universe.tick();

}

話說知乎為啥自動吃掉了我的空格。


兩個for循環可以表示二維信息啊,一個就表示線性


現在的系統最外層也只是一個循環,你兩個循環真的可以上天了吧


你以後筆試或者面試的大部分問題都可以用兩層循環解決,包括圖論和動規問題。如果兩層都解決不了就要想想是不是思路有問題了。


排序,對數組的冒泡排序


兩個並列的 for 循環

for(int i = start1; i &< end1; i++) { // iteration body 1 // ... } for(int i = start2; i &< end2; i++) { // iteration body 2 // ... }

等價於一個 for 循環

bool firstIter = true;
for(int i = start1; (firstIter) || (!fistIter i &< end2); i++) { if(firstIter) { if(i &<= end1) { // iteration body 1 // ... } else { firstIter = false; i = start2; continue; } } else { // iteration body 2 // ... } }

那麼兩個嵌套的 for 循環(留做練習?)

綜上,一個 for 循環好像和兩個沒啥區別。


推薦閱讀:

作為程序員的你(或者即將成為程序員)何時意識到數學的重要性?
Rust中常量為什麼用let不用const,變數用let mut不用var?
c++現在有哪些GUI庫可以用?
計算機系學生的你,有哪些課程覺得自己沒有學明白?
為什麼函數能遞歸調用自己?

TAG:編程語言 | 編程 | C編程語言 | 編程學習 | C語言函數 |