2019春第五周作業:
| 作業課程 | C語言程序設計II |
| 作業要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2824 |
| 課程目標 | 背熟棧,隊列,向量函數及熟練指針 |
| 從作業中得到的幫助 | 熟練使用Vector |
| 參考文獻 | 挑戰程序設計 |
7-1 英文單詞排序 (25 分)
本題要求編寫程序,輸入若干英文單詞,對這些單詞按長度從小到大排序后輸出。如果長度相同,按照輸入的順序不變。
輸入格式:
輸入為若干英文單詞,每行一個,以#作為輸入結束標志。其中英文單詞總數不超過20個,英文單詞為長度小於10的僅由小寫英文字母組成的字符串。
輸出格式:
輸出為排序后的結果,每個單詞后面都額外輸出一個空格。
輸入樣例:
blue
red
yellow
green
purple
#
輸出樣例:
red blue green yellow purple
簡單思路:一開始本來想用結構體記錄單詞長度及位置,后面覺得太麻煩了,想到為何不用數據結構來直接處理字符串呢?然后理所當然地就用到了之前博客提到Vector(向量)數組,可以將輸入的字符串內容存進里面逐一處理,這樣問題就變的很簡單了。
老規矩,先把解決算法寫上來,之后再擺文件代碼,便於理解(此次文件代碼用的是C++中的函數,可以去百度了解一下)
實驗代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main ( int argc , const char * argv[]) 5 { 6 string zf;//定義一個字符串變量 7 vector<string> str;//聲明一個存string類型的vector數組 8 int count=0;//記錄單詞數 9 while(cin>>zf){if(zf[0]=='#')break;str.push_back(zf);count++;}//如果不是#號則壓入Vector 10 for(int i = 0 ; i < count - 1 ; i++) 11 for(int j = i ; j < count ; j++){if(str[i].length()>str[j].length()){string s = str[i];str[i]=str[j];str[j]=s;}}//交換位置 12 for(int i = 0 ; i < count ; i++)cout<<str[i]<<" "; 13 return 0; 14 }
實驗代碼(文件)
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main ( int argc , const char * argv[]) 5 { 6 7 fstream fp("D:\\wj.txt"); 8 fp.is_open()?cout<<"OK"<<endl:cout<<"fail"<<endl; 9 char zf[100]; 10 vector<string> str; 11 int count=0; 12 /* while(!fp.eof()){ //注釋代碼可以自己去掉注釋,可以觀察取值過程 13 fp.getline(zf,100); 14 cout<<zf<<endl; 15 } 16 */ 17 while(fp.getline(zf,100)){if(zf[0]=='#')break;str.push_back(zf);count++;} 18 for(int i = 0 ; i < count - 1 ; i++) 19 for(int j = i ; j < count ; j++){if(str[i].length()>str[j].length()){string s = str[i]; str[i]=str[j];str[j]=s;}} 20 for(int i = 0 ; i < count ; i++)cout<<str[i]<<" "; 21 22 23 for(int i = 0 ; i < count ; i++) 24 fp<<str[i]<<" "; 25 26 27 28 return 0; 29 }
設計思路

實驗過程中遇到的問題及解決方案
問題:Vector數組相應類型變量的聲明和對應變量的調用方式使用過程生硬
解決方案:反復使用標准庫中的模板去嘗試,逐漸熟練。
運行結果截圖


----------------------------------------------------------------------------------------------------------------------------
選擇題
預習內容:其實也不能算是預習內容..指針很久之前就過了一遍,算是半知半解吧,現在回過頭來復習,主要內容就是連接鏈表,多級指針的運用,以及自定義函數中利用指針可以非常非常非常方便的有多個返回值(簡單來說自定義函數中一般只能return一個特定值,但指針沒有這個限制,想返回多少返回多少,可以說是特別方便了),不過現在大部分用不着,因為一般解題一個返回值或者直接用布爾類型的就解決了,暫時沒有刷到需要多個返回值的題(可能我太菜了),總的來說本章最重要的了解指針變量是什么,指針是用來干嘛的,給你一個指針你可以用來完成什么操作,這就是預習的內容了。
預習中的疑惑:1.一個指針訪問一次內存地址的耗時
2.創建一次鏈表需要的時間對整個程序的影響
3.如何能夠有效避免浪費內存空間
下面是這次預習題的我選的答案,僅限參考,全錯就尷尬了,畢竟概念這種東西很久沒去看了(手動滑稽)
2-1
下列語句定義 x 為指向 int 類型變量 a 的指針,正確的是()。 (2分)
2-2
int *p 的含義是 (2分)
2-3
如果有定義:int m, n = 5, *p = &m; 與m = n 等價的語句是 () 。 (1分)
2-4
變量的指針,其含義是指該變量的( )。 (1分)
2-5
有如下程序段
int *p,a=10,b=1; p=&a; a=*p + b;
執行該程序段后,a的值是 (2分)
2-6
對於下列程序,正確的是() 。 (2分)
void f(int *p) { *p = 5; } int main(void) { int a, *p; a = 10; p = &a; f(p); printf(“%d”, (*p)++); return 0; }
2-7
執行如下程序段,打印輸出的內容是: (2分)
#include <stdio.h> void fun (int c, int *d) { c++; (*d)++; } int main ( ){ int a=5, b=9; fun(a, &b); printf("%d, %d", a, b); return 0; }
| 學習總結: | 存在的問題 | 心得 | 完成作業消耗時間 | 本周學習內容 |
| 第一周 | 對文件讀取數據的運用不是很熟練 | 多去看關於刷題的書籍,有助於提高自己寫題能力,實在不會的可以參考大佬的代碼,加以自己理解之后去默寫幾遍 | 半個小時左右 | 文件輸入,BFS,DFS,PARTITION算法及簡單的貪心算法 |
| 第二周 | 對單純用數組完成雙向鏈表的操作還是太生疏了,說明對雙向鏈表的運作原理不熟 | 推薦兩本比較好的書《挑戰程序設計》《算法競賽》 | 半個小時左右 | vector數組及list雙向鏈表操作 |
| 第三周 | 指針的概念太久沒記有點生疏了 | 對vector數組使用愈加熟練 | 一小時左右 | 數據結構 |
結對編程感想:我的搭檔不止一個..結對編程的過程中很有趣,能互相收獲許多知識,許多忘掉的知識點在搭檔們的幫助下又漸漸回憶起來,而且能夠互補,許多地方我可能並不是很清楚,但一起查資料並且互相解釋一遍后,對知識點的鞏固特別有幫助,希望和搭檔一起加油!
