for語句:
for (表達式1;表達式2;表達式3)
{
循環語句
}
- 表達式1 給循環變量賦初值
- 表達式2 為循環條件
- 表達式3 用來修改循環變量的值,稱為循環步長。
for語句的執行流程:
for語句的執行流程.png
例:編程計算:1+2+3+...+99+100的結果。
這是累加問題,累加問題的通用表達式為:S = S + T;
其中,S是一個變量,用來存儲累加最后的結果,稱之為累加器;T是一個表達式,代表每次需要加入累加器的中的值。
累加一般是通過循環結構實現的。循環之前要設置累加器S的初始值為0。
累加項T可以是很簡單的表達式,也有可能是一個通過分析得到的較復雜的表達式。
int S = 0;
for (int i = 1; i <= 100; i++)
{
S = S + i;
}
printf("%d\n",S);
注意:
1)對于已經確定是累加算法的題目,首先確定累加項與循環變量的關系;
2)然后,考慮第一個累加項的值是多少,以確定循環變量的初值;
3)其次,確定最后一個累加項的值,確定循環條件;
4)最后,考慮每個累加項之間的關系,以確定循環變量的變化(步長值)。
例:編程計算S = a + aa + aaa + aaaa + ... 的前n項之和。
例如:如果a = 3,n = 5,則表達式為:S = 3 + 33 + 333 + 3333 + 33333。
int S = 0;
int t = 0;
for (int i = 0;i < 5;i++ )
{
t = t * 10 + 3;
S = S + t;
}
printf("%d\n",S);
累加算法也可以演化為連乘的形式:S = 1 * 2 * 3 * ... * n。
連乘的算法和累加算法相似,循環體實現的是S = S * T的形式。需要注意的S的初值不是0,而是要設為1。
在求連乘時,由于每乘一次結果增長都非??欤詰撟⒁馐欠駮霈F溢出的問題。
循環程序設計思路:
(1)輸入是什么?用來確定原始值。
(2)輸出是什么?確定應該輸出的結果。
(3)從輸入轉換為輸出需要怎樣的步驟,是否需要重復(確定是否需要使用循環語句以及循環語句的內容)。
(4)如果需要重復,能否提前預知重復的次數?用來確定使用while、do while、for中的哪種循環語句。
(5)何時不再需要重復?用來確定循環條件以及循環體中使循環條件趨近于0的語句。
例:水仙花數、四葉玫瑰數、五角星數、六位數的問題。
水仙花數:每位數字的3次冪之和等于它本身。例:1^3 + 5^3 + 3^3 = 153。
四葉玫瑰數:每位數字的4次冪之和等于它本身。
五角星數:每位數字的5次冪之和等于它本身。
六位數:每位數字的6次冪之和等于它本身。
// 打印出所有的水仙花數
int i,j,k,n,s;
for(i = 1;i <= 9;i++)
for(j = 0;j <= 9;j++)
for(k = 0;k <= 9;k++)
{
n = k * k * k + j * j * j + i * i * i;
s = i * 100 + j * 10 + k;
if (n == s)
{
printf("%d\n",n);
}
}
或:
// 打印出所有水仙花數
int i,j,k,n,s;
printf("水仙花數有:\n");
for(n = 100;n < 1000;n++)
{
i = n / 100; /*分解出百位*/
j = n / 10 % 10; /*分解出十位*/
k = n % 10; /*分解出個位*/
s = i * i * i + j * j * j + k * k * k;
if(s == n)
{
printf("%-5d\n",n);
}
}