C博客作業02--循環結構


0.展示PTA總分



1.本章學習總結

1.1 學習內容總結

  • 循環結構的使用:

    • for循環結構:第一個是初始化,第二個是條件語句,第三個是自處理語句。 循環時第一個語句只使用一次,然后判斷是否滿足第二個語句,滿足則進入循環體。直到不滿足循環體再跳出。
    • while循環結構:先對while()括號內的條件進行判斷,若為真則進入循環,否則跳出循環。

    • do-while循環結構:先執行循環體中的表達式的內容,之后再進行循環條件的判斷,決定是否進行下一次的循環。

    • 總結

    1. while循環結構do-while循環結構的區別:while和do-while的區別在於判斷條件的先后,即while是先判斷,程序有可能不進入循環;do-while是后判斷,就是說do-while無論是否滿足條件都只是會進行一次循環。因此,同樣的條件,兩種循環的輸出結過可能不同。

例如:不相同的情況:兩種的輸入值與循環條件相同,但是輸入的值不滿足循環條件,此時while不進入循環而do while會循環一次

如:


此時兩種循環是不同的。

相同的情況:兩種輸入值與循環條件相同,同時進入循環的值與】滿足循環條件,兩者就是相同的。

如:


此時兩種循環是相同的。

2. **for循環結構**與**while循環結構**的區別:再使用for語句時,for語句中的成分直接完成了對變量的初始化,條件的控制以及自處理語句,使程序可以直接進行;而while語句因為只有一個條件,因此需要在循環之前做好對變量的初始化等工作。但在執行起來,兩者並沒有很多區別。
  • 循環語句的控制

    • break:在執行循環語句時,break也起到控制循環的作用。當滿足執行break的條件時,break強制循環結束,不再執行循環體中break之后的內容,並直接跳出循環。一般來說,在循環語句中,我們會用if與break搭配,當條件滿足時,起到跳出循環的作用。(注意!!!在嵌套循環中,break之后只能跳出它所在的那一次循環,而不是全部)
    • continue:與break不同,當執行到comtinue語句時,continue會跳過循環體中continue下面的語句,並結束本次循環,並進入下一次循環(注意!!!是只結束本次循環,而不是跳出循環!!!),在循環語句中,一般也是與 if搭配。
  • 嵌套循環

    • 顧名思義,嵌套循環就是在一個循環中包含着其他循環(也可以叫做外循環與內循環)。在使用嵌套循環時,我們需要保持自己的邏輯性,明確內外循環分別代表這什么,並控制好變量的初始化循環的條件結束,否則很容易出錯甚至會死循環。
      例如這道分硬幣的題目:

      只有首先明確了三個變量的初值(循環的開始),再一層層嵌套,最后利用if的判斷輸出結果。

1.2 本章學習體會

  • 兩周下來,我們又學習了嵌套循環,函數以及一點數據類型。現在學習起來已經開始有點難度以及吃力了,學習C語言的時間也在加長,希望可以通過大量有效的練習來鞏固已經學習完的知識。
    • 嵌套循環:嵌套循環涉及了多次循環,需要在代碼時有完整的邏輯。對於PTA中於龍的那道對日期合法性的判斷還是不是很明白,不知道要怎么利用利用循環取判斷日期的合法性。
    • 函數的定義與使用:個人感覺函數的使用大幅減少了主函數的代碼量,但是我在寫程序時一旦需要定自己定義的函數如果過多,我就開始有點吃力了,個人感覺使用函數還是要多練習。
  • 在這幾周的學習中,特別是經過了第一次的機房考試后,我才可以感受到:只有自己一句一句寫出來,經過調試和優化的代碼才能真正成為你自己的代碼,多與別人探討,多獨立思考,才能把學習到的知識真正變成自己的。從網上找的或是從同學那里參考的,或許短期之內會印象深刻,但是時間一長就會逐漸淡忘。你可以與同學討論,對比同學與自己的想法與思路,最后再考慮是根據自己的私利優化還是借鑒同學的思路,最后再自己寫出代碼。(個人認為:思路可以參考借鑒,但是代碼一定要自己寫!!!)。開學已經快兩個月了,但是直到現在,當寫出了代碼並全部正確時,心中還是會很高興和激動。希望在今后的學習中,我還可以保持這樣的狀態一直努力下去。
  • 代碼量:

2.PTA實驗作業


2.1 PTA題目1

c03-單循環結構
7-9 龜兔賽跑 (20 分)
本題要求:在一行中輸出比賽的結果:烏龜贏輸出@_@,兔子贏輸出^_^,平局則輸出-_-;后跟1空格,再輸出勝利者跑完的距離。

2.1.1 偽代碼

#include<stdio.h>  
int main()
{
	定義烏龜跑的總距離 tortoiseSum;定義兔子跑的總距離 rabbitSum;定義時間T;定義rest用於判斷是否休息,rest=0時奔跑,rest=30時休息;定義i;time用於循環
        輸入時間T。
	令tortoiseSum = 0;rabbitSum = 0;rest = 0;
	for time = 0 to T-1 
	{
		tortoiseSum = tortoiseSum + 3;
		if 時間為10的倍數time % 10 == 0 && rabbitSum兔子距離 > tortoiseSum烏龜距離&& 休息時間rest == 0
		{
			兔子休息時間加30;
		}
		if 休息時間等於0
		{
			兔子結束休息,開始奔跑rabbitSum = rabbitSum + 9;
		}
		else休息時間不為0
		{
			隨着時間過去,休息時間減少rest--;
		}
                 end if
	}
        end for
	if (烏龜跑的總距離 > 兔子跑的總距離)
	{
		輸出@_@ %d"和tortoiseSum
	}
	else if (烏龜跑的總距離 < 兔子跑的總距離)
	{
		輸出^_^ %d"和 rabbitSum
	}
	else
	{
		輸出-_- %d"和rabbitSum
	}
       end if
	return 0;
}

2.1.2 代碼截圖

2.1.3 造測試數據

2.1.4 PTA提交列表及說明

說明:
1.部分正確:在第一次提交之后,出現部分錯誤:問題出現在循環結構中,第一次將第一個if和第二個if-else的位置寫反,導致進入的條件判斷先后出現問題,在time=10的倍數時,先判斷
                     此時的rest,在第一個10分鍾時休息時間本應加上30分鍾,之后開始遞減,但是此時因為位置寫反,沒有進行應該進行的遞減,導致答案出現錯誤。
2.全部正確:將兩個if的判斷語句調換之后,全部正確。

2.2 PTA題目2

c03-單循環結構
7-10 jmu-c-二進制轉10進制
輸入一組二進制字符,輸出其對應的十進制數。當輸入回車鍵時,輸入結束。若輸入非二進制字符,輸出error input!

2.2.1 偽代碼

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	定義一個字符串num[1000]來儲存輸入的二進制數 ;定義i,item;sum;a
        令item = 0;sign = 1;sum = 0;
	輸入數字
	for i = 0 to num[i] > 0
	{
		if (num[i] != '0' && num[i] != '1')
		{
			item = 1;
			輸出error input!
			break;
		}
                end if
	}
        end for
	計算字符串的長度
	if item等於0
	{
		for i = a - 1 to 0
		{
			逐位計算每一位二級制數轉換的十進制數並累加sum = sum + sign * (num[i] - '0')
			sign = sign * 2;
		}
		輸出sum
	}
        end if
	return 0;
}

2.2.2 代碼截圖

2.2.3 造測試數據

2.2.4 PTA提交列表及說明

說明:
1.部分正確:第一次使用數組和循環,通過取余數來將輸入的數字一位一位取出來,並用數組來存儲分離出來的每一個數,對題目給的樣例也輸出了正確答案,但是提交后卻是部分正確,
                    之后調試發現,一旦輸入的二進制數超過了10位,數據就會溢出。因此嘗試把數組的定義改成long int。
2.部分正確:第一次改為long int之后提交仍然顯示部分正確。
3.在VS中經過多次調試發現數組仍會溢出,因此想到用字符串的形式來存儲數字字符,最終通過了所有測試點。 

2.3 PTA題目3

c03-單循環結構
7-2 求冪級數展開的部分和
已知函數ex可以展開為冪級數1+x+x^2/2!+...+x^k/k!,現給定一個實數x,要求利用此冪級數部分和求ex​​ 的近似值,求和一直繼續到最后一項的絕對值小於0.00001。

2.3.1 偽代碼

#include <stdio.h>
#include <math.h>

int main()
{
    定義x, sum ,result,i
    令sum,result=1.0
    輸入x
    int i;
    for  i = 1 to
    {
       后一項均為前一項再乘(x/i)result = result *(x/i);
        累加sum += result;
        if 出現一項的絕對值小於0.00001。
        {
            結束循環break;
        }
        end if
    }
    end for
    輸出4位小數sum
    return 0;
}

2.3.2 代碼截圖

2.3.3 造測試數據

2.3.4 PTA提交列表及說明

1.部分正確:一開始循環時將分子與分母都用pow函數進行計算,導致最后在程序在進行時運行超時了
2.全部正確:后來將循環過程中的pow函數計算改為根據前后項之間的聯系來進行累加,就不會出現超時,答案全部正確


3.代碼互評

3.1.1

7-10 任務06-02-02 於龍又又遇見日期,叕哭了!

同學代碼:

我的代碼:

兩段代碼異同

    1. 都能實現題目的要求,對輸入的日期進行合法的判斷。
    2. 兩段代碼的總體思路上都是通過窮舉法,將輸入三個數據進行6種排列判斷。
    1. 很明顯,同學的代碼雖然也是窮舉法,但是很簡潔;而我的代碼明顯太長了。
    2. 同學的代碼主要使用函數來解決閏年等需要判斷的量;而我全篇采用if來判斷。
    3. 同學利用數組對6種排列方法進行輸出;而我是用if語句對每一項進行判斷,造成代碼過長。

總結:這道題在寫代碼時一開始沒有想的很多,就是利用if對6種情況判斷,所以程序分成了三塊類似的代碼來判斷,造成代碼的過於冗長;而看來同學的代碼后,我才發現同樣是窮舉法,但是同學巧妙的運用函數與數組,在達到目的的同時代碼量不到我的三分之一。我同樣也會數組,但是我在思考時沒有想到使用它,因此,這也是我要向同學學習的地方,如何運用自己已經掌握的知識,而不是停留在最初級的寫法。

3.1.2

7-10 jmu-c-二進制轉10進制  

同學代碼:

我的代碼:

兩段代碼異同

    1. 兩段代碼都能實現題目要求,將二進制轉為十進制。
    2. 都將數字用字符型的數據進行輸入,來達到目的。
    3. 都使用了字符轉數據的計算
    1. 同學的代碼采用的時單個字符的存儲;而我采用的是字符串的方式進行存儲。
    2. 同學用來轉進制的方式是在while循環中進行判斷,合理時一邊讀取字符,一邊進行計算轉換;而我是在判斷輸入的二進制數合理時,對字符串的長度進行計算,最后利用循環計算。

總結:在這道題上,我和同學的想法大同小異,都想到了用字符型數據進行輸入,主要區別就在單個字符的輸入與字符串的輸入以及代碼的寫法。個人認為兩段代碼都有自己的長處,可以互相學習,多多討論。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM