這個作業屬於哪個課程 | c語言程序設計2 |
---|---|
這個作業要求在哪 | 2019年春季學期第五周作業 |
我在這個課程的目標是 | 掌握字符(串)數組的相關知識 |
這個作業在哪個具體方面幫助我實現目標 | 通過PTA作業學習字符(串)數組使用方法並對代碼進行檢測 |
參考文獻 | C語言程序設計 |
預習題:7-1 統計一行文本的單詞個數 (15 分)
本題目要求編寫程序統計一行字符中單詞的個數。所謂“單詞”是指連續不含空格的字符串,各單詞之間用空格分隔,空格數可以是多個。
輸入格式:
輸入給出一行字符。
輸出格式:
在一行中輸出單詞個數。
輸入樣例:
Let's go to room 209.
輸出樣例:
5
1).實驗代碼
#include<stdio.h>
int main()
{
int n=0;
char a,m=' ';
while(a!='\n'){
scanf("%c",&a);
if(a==' '&&m!=' '||a=='\n'&&m!=' '){
n++;
}
m=a;
}
printf("%d",n);
return 0;
}
2).設計思路
主要思路:有一個空格就有一個單詞,連續多個空格只算一個單詞,末尾沒有空格也要算一個單詞。
第一步:定義兩個字符變量,一個用來存輸入的字符,一個用來存上一個輸入的字符,再定義一個整型變量計數器記錄單詞個數。
第二步:輸入一個字符判斷一個,當輸入字符為換行符時結束循環,當輸入的字符為空格且上一個字符不是空格或輸入的字符為換行符且上一個字符不是空格時計數器+1。
第三步:輸出計數器的值。
3).本題調試過程碰到的問題以及解決辦法
根據提示,連續多個空格時所有空格均會算一個單詞,故需要改變算一個單詞的條件,將第8行if(a32&&a!=m){改為if(a' '&&m!=' '){。
整理了一下,問題如下:1.以空格開頭會算一個單詞。2.結尾沒有空格所以最后一個單詞沒加。都是判斷條件問題。將if(a' '&&m!=' '){改為if(a' '&&m!=' '||a=='\n'&&m!=' '){,將第5行m改為m=' ',將11行改為m=a;,問題得以解決。
4).運行結果截圖
基礎作業:7-1 英文單詞排序 (25 分)
本題要求編寫程序,輸入若干英文單詞,對這些單詞按長度從小到大排序后輸出。如果長度相同,按照輸入的順序不變。
輸入格式:
輸入為若干英文單詞,每行一個,以#作為輸入結束標志。其中英文單詞總數不超過20個,英文單詞為長度小於10的僅由小寫英文字母組成的字符串。
輸出格式:
輸出為排序后的結果,每個單詞后面都額外輸出一個空格。
輸入樣例:
blue
red
yellow
green
purple
輸出樣例:
red blue green yellow purple
博客要求:1)通過以自己名字命名的文件輸入英文單詞,(2)英文單詞輸入的結束標記為你學號最后一位數+37所對應的ASCII字符。(例如:你的學號最后一位為9,則結束標記為9+37=46所對應的ASCII字符“.”)(3)在不刪除原有內容的情況下,將排序后的單詞輸出到文件。
1).實驗代碼
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main (void)
{
FILE*fp;
char ch[20][10],a[20];
int h,l,n;
if((fp=fopen("D:\\helei.txt","a+"))==NULL){
printf("File open error!\n");
exit(0);
}
while(1){
fscanf(fp,"%s", ch[n]);
if(ch[n][0]==','){
break;
}
n++;
}
for(h=0;h<n-1;h++)
for(l=0;l<n-1;l++)
{
if(strlen(ch[l])>strlen(ch[l+1]))
{
strcpy(a,ch[l]);
strcpy(ch[l],ch[l+1]);
strcpy(ch[l+1],a);
}
}
fprintf(fp,"\n",ch[h]);
for(h=0;h<n;h++)
{
fprintf(fp,"%s ",ch[h]);
}
if(fclose(fp)){
printf("Can not close the file!\n");
exit(0);
}
}
2).設計思路
第一步:通過while循環逐行輸入字符串,當輸入的字符為7+37對應的“,”時結束循環。
第二步:通過兩個for嵌套實現字符串的調用和長度對比,如果下標較小的字符串的長度大於下標較大的字符串的長度,則用strpy函數配合中間字符變量將內容交換,經過多輪循環下標從小到大的字符串的長度也變成從小到大。
第三步:用for循環將字符串下標從小到大的順序依次輸出。
3).本題調試過程碰到的問題以及解決辦法
除了測試點4其它都錯了,根據提示以及運行結果,仔細檢查代碼后發現第14、15行中應為<n-1,否則循環會進行到字符為'\n'才結束,從而導致答案錯誤,修改后問題得以解決。
4).運行結果截圖
挑戰作業:
繼續挑戰第二周的挑戰作業:返回整數數組中最大子數組的和,本周,我們要求二維數組的子數組必須是矩形的。
具體要求參看鄒欣老師博客 現代程序設計作業2
1).實驗代碼
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE*fp;
int b=0,m=0,k=0,i=0,x=0,y=0,z=0,n=0,sum2=0,sum3=0,h=0,l=0,c=0,d=0,e=0;
int a[10][10];
if((fp=fopen("D:\\helei.txt","a+"))==NULL){
printf("File open error!\n");
exit(0);
}
fscanf(fp,"%d",&n);
for(i=0;i<n;i++){
for(m=0;m<n;m++) {
fscanf(fp,"%d",&a[i][m]);
sum3=a[0][0]-1;
}
}
for(x=0;x<n;x++){
for(k=0;k<n;k++){
if(x<=k){
c=n-k;
}
if(x>k){
c=n-x;
}
for(b=0;b<c;b++){
for(z=x;z<=b+x;z++){
for(y=k;y<=b+k;y++){
sum2=sum2+a[z][y];
}
}
if(sum2>sum3){
h=x;
d=x;
l=b;
i=k;
e=k;
sum3=sum2;
}
sum2=0;
}
}
}
fprintf(fp,"\n");
for(h;h<=d+l;h++){
for(i=e;i<=e+l;i++){
fprintf(fp,"%d ",a[h][i]);
}
fprintf(fp,"\n");
}
fprintf(fp,"%d",sum3);
return 0;
}
2).設計思路
用窮舉法將所有情況求和,並保留最大和以及取到最大和時對應矩陣的行列數起點和終點。
3).本題調試過程碰到的問題以及解決辦法
碰到的問題太多了,然后也沒截圖,確定思路是對的后,經過3個多小時的編寫和調試后終於對了。
把矩形當成正方形了>_<|||,就一直按照正方形的思路在編寫,應該差別不大不想改了。
4).運行結果截圖
預習作業:
本周預習作業為選擇題,提交至博客的具體內容可調整為:1.預習的主要內容,2.完成情況截圖(要求有題目和答案),3.預習中存在的疑惑(至少寫出2條)
1.預習了指針的相關知識。
2.
3.指針具體是一個怎樣的存在?指針能用在哪寫具體的問題上?指針真有別人說的那么好用嗎?
二、學習進度統計
周/日期 | 這周所花的時間 | 代碼行 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
3/2-3/8 | 2h | 23行 | 數組 | 無 |
3/9-3/11 | 3h | 29行 | 讀取文件數據 | 無 |
3/12-3/18 | 5h | 70行 | 用數組輸出矩陣 | 無 |
3/19-3/25 | 8h | 140行 | 多種排序方法 | 無 |
3/26-4/1 | 5h | 82行 | 字符(串)數組的相關知識 | 無 |
三、學習感悟
這周學習了字符(串)數組的相關知識,新知識的學習提升了我的能力,以后可以解決更多問題了。
四、結對編程過程和結對編程的優缺點
忘了拍照了。。
隊員優點:1.對不懂的問題善於尋求幫助2.有靈性3.冷靜不浮躁
缺點:不主動和隊友交流
結對編程的優點:(1)在開發層次,結對編程能提供更好的設計質量和代碼質量,兩人合作能有更強的解決問題的能力。
(2)對開發人員自身來說,結對工作能帶來更多的信心,高質量的產出能帶來更高的滿足感。
(3)在心理上, 當有另一個人在你身邊和你緊密配合, 做同樣一件事情的時候, 你不好意思開小差, 也不好意思糊弄。
(4)在企業管理層次上,結對能更有效地交流,相互學習和傳遞經驗,能更好地處理人員流動。因為一個人的知識已經被其他人共享。
總之,如果運用得當,結對編程能得到更高的投入產出比(Return of Investment)。
不適合結對編程的情況:
並不是所有的項目都適合結對編程,下面是一些不適合使用的例子。
1)處於探索階段的項目,需要深入地研究,在這種情況下,一個人長時間的獨立鑽研是有必要的。
2)在做后期維護的時候,如果維護的技術含量不高,只需要做有效的復審即可,不必拘泥於形式,硬拉一個人來結對唱二人轉。
3)如果驗證測試需要運行很長時間,那么兩個人在那里等待結果是有點浪費時間。
4)如果團隊的人員要在多個項目中工作,不能充分保證足夠的結對編程時間,那么成員要經常處於等待的狀態,反而影響效率。
5)關鍵是如何最大限度地發揮“領航員”的作用,如果用處不大,也就無需結對。