跳轉到內容

D 入門指南/條件和迴圈/簡單迴圈

來自華夏公益教科書


D 中最簡單的迴圈之一是while迴圈。只要其條件為真,該迴圈就會一直迴圈。這也使得while迴圈非常靈活 - 幾乎任何型別的迴圈都可以寫成while迴圈,如果你足夠努力的話。一個while迴圈看起來像這樣

while(condition)
{
	//code goes here
}

while迴圈將檢查條件是否為真,如果為真,它將執行其中的程式碼。它將一直這樣做,直到條件變為假。

如上一節所示,foreach迴圈對於迴圈遍歷某種容器的內容非常有用。但是,當你不知道你有多少資料時該怎麼辦,比如當你從檔案中讀取資料時?一個while迴圈在這種情況下可以提供幫助。

import std.stdio;
import std.stream;

void main()
{
	char[][] names;
	File input = new File("names.txt");
	
	while(input.eof() == false)
		names ~= input.readLine();
		
	writefln("Read ", names.length, " names.");

	foreach(name; names)
		writefln(name);
}

因此,這裡我們建立一個名為names的字串陣列,用於儲存我們將從檔案中讀取的姓名列表。然後我們建立一個File物件。記得在基本輸入部分,我們使用din從控制檯讀取一行文字?din實際上是一種File物件,所以我們在這裡做同樣的事情,除了我們從磁碟上的檔案讀取而不是從使用者那裡讀取。

這裡重要的是while迴圈。讓我們仔細看看它

while(input.eof() == false)
	names ~= input.readLine();

條件是input.eof() == false. 該.eof()方法 ofFile表示“檔案末尾”。所以我們將使用這個迴圈來讀取資料,直到我們到達檔案末尾。換句話說,我們將讀取檔案中所有的資料。迴圈體就是這麼做的 - 它從檔案中讀取一行,並將它追加到我們的姓名列表的末尾。

在我們的程式結束時,我們使用熟悉的foreach迴圈輸出姓名列表。

另一種非常類似的迴圈是do-while迴圈。在一個while迴圈中,條件位於迴圈的開頭,但在一個do-while迴圈中,條件位於迴圈的末尾。之所以重要,是因為對於一個while迴圈,如果條件在第一次就為假,迴圈體將永遠不會執行,所以while迴圈可以執行其主體0 次或多次。但是對於一個do-while迴圈,迴圈體將執行至少一次,然後再檢查條件。do-while迴圈看起來像這樣

do
{
	code
} while(condition)

這種迴圈經常出現的一種情況是,當你試圖從使用者那裡獲取有效輸入時。通常你會要求使用者輸入一些內容,然後你檢查它是否有效,如果無效,你就會一直詢問他們,直到他們給你一個好的內容。這就是do-while迴圈的用處:它將至少執行一次輸入程式碼,並一直執行,直到條件滿足。

import std.stdio;
import std.cstream;

void main()
{
	bool valid = false;
	bool yes;

	do
	{
		writef("Delete all your data?  y/n: ");

		char[] response = din.readLine();

		if(response.length > 0)
		{
			if(response[0] == 'y')
			{
				yes = true;
				valid = true;
			}
			else if(response[0] == 'n')
			{
				yes = false;
				valid = true;
			}
		}
	} while(valid == false)
}

這段程式碼使用valid變數來跟蹤使用者輸入的內容是否有效。一旦他們輸入有效的內容,它將被設定為true. 然而,在那之前,do-while迴圈將一直迴圈,要求使用者輸入。

華夏公益教科書