請將pta做業編程題目的解題思路和調試過程記錄在博客中,每道題目的具體格式以下:node
題目6-1 輸出月份英文名c++
1.設計思路git
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),如:
第一步:定義月份對應的指針數組與整形變量i
第二步:用for循環遍歷數組
第三步:if條件語句用來判斷不一樣條件下的返回值並輸出 算法
(2)流程圖編程
2.實驗代碼數組
char *getmonth( int n ) { char *month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"}; int i=0; for(i=0;i<13;i++) { if(i==0) { continue; }else if(n==i) { return *(month+i-1); } } if(n>=13||n<=0) { return NULL; } }
3.本題調試過程碰到問題及解決辦法函數
錯誤信息:
錯誤緣由:n=i時的返回值取地址錯誤
改正方法:改成*(month+i-1)便可,爲第n-1行首元素的地址學習
6-2 查找星期spa
1.設計思路
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
第一步:定義整形變量 i 和星期對應的指針數組
第二步:利用for循環遍歷數組
第三步:用if語句與strcmp函數進行分類討論,當查找到相應元素時返回整形變量值.net
2.實驗代碼
int getindex( char *s ) { int i; char *week[7]= { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" }; for (i = 0; i < 7; i++) { if (strcmp(s, week[i]) == 0) { break; } } if (i==7) { i = -1; } return i; }
3.本題調試過程碰到問題及解決辦法
錯誤信息:
錯誤緣由:輸入函數接口定義時在後方加了多餘的分號" ; "
改正方法:經過dev-c++提醒找出,低級錯誤
6-3 計算最長的字符串長度
1.設計思路
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
第一步:定義兩個整形變量 i,l
第二步:用for循環遍歷數組
第三步:if語句中調用strlen函數進行計算並比較,最後返回 l 值
2.實驗代碼
int max_len( char *s[], int n ) { int i,l=0; for(i=0;i<n;i++) { if(l<strlen(*(s+i))) { l=strlen(*(s+i)); } } return l; }
3.本題調試過程碰到問題及解決辦法
錯誤信息:無
6-4 指定位置輸出字符串
1.設計思路
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
第一步:定義整形變量i,j,經過一個for循環將ch1的值賦給*(s+i)
第二步:設計一個指針變量,判斷*(s+j)!的值
第三步:總體遍歷後,輸出並返回(s+i)的值
2.實驗代碼
char *match( char *s, char ch1, char ch2 ){ int i,j; for(i=0;*(s+i)!='\0';i++) { if(*(s+i)==ch1) { char *a= &s[i]; for(j=i;(*(s+j)!=ch2)&&(*(s+j)!='\0');j++) { printf("%c",*(s+j)); } if(*(s+j)!='\0') printf("%c",*(s+j)); printf("\n"); return a; } } printf("\n"); return s+i; }
3.本題調試過程碰到問題及解決辦法
錯誤信息:
錯誤緣由:函數接口定義編寫錯誤,致使代碼沒法正常編譯
改正方法:改變思路並改正定義,用一個for循環和if語句進行遍歷和輸出
2)一道編程題:
有一個axb的數組,該數組裏面順序存放了從1到a*b的數字。其中a是你大學號的前三位數字,b是你大學號的後四位數字,好比你的學號是2017023936,那麼數組大小是201 x 3936,數組中順序存放了1到791136(201和3936的積)的整數. 要求用篩選法,把該數組裏的質數找出並打印出來,打印格式爲5個質數一行,數字間用空格隔開。
篩選法具體作法是:先把N個天然數按次序排列起來。1不是質數,也不是合數,要劃去。第二個數2是質數留下來,而把2後面全部能被2整除的數都劃去。2後面第一個沒劃去的數是3,把3留下,再把3後面全部能被3整除的數都劃去。3後面第一個沒劃去的數是5,把5留下,再把5後面全部能被5整除的數都劃去。這樣一直作下去,就會把不超過N的所有合數都篩掉,留下的就是不超過N的所有質數。
#include <stdio.h> int main () { int a=201,b=3947; int *p = (int *)malloc((a*b) *sizeof(int)); int *q = (int *)malloc((a*b) *sizeof(int)); int i=0,j; for(i=0;i<(a*b);i++) { p[i] = i+1; } for(i=0;i<(a*b);i++) { for(j = i+1;j<=(a*b);j++) { if((p[i] !=1) && ( p[j] != 1) ){ if(p[j]%p[i] ==0) { p[j] = 1; } } } } j=0; for(i=0;i<(a*b);i++) { if(p[i] != 1) { printf(" %d",p[i]); j++; } if(j == 5) { printf("\n"); j=0; } } }
6-1 奇數值結點鏈表
1.設計思路
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
第一步:定義整形變量n,在readlist函數中,將輸入的值存儲在鏈表裏,在while循環內對p進行動態分配內存,最後返回鏈表的頭結點。
第二步:在getodd函數中,根據題目要求的條件對鏈表結點中date的值進行分類判斷。
第三步:需考慮若最後新建鏈表有可能爲空的狀況,最後按照要求返回要求鏈表的頭結點。
(2)流程圖
2.實驗代碼
struct ListNode *readlist() { int n; struct ListNode *p = NULL,*head = NULL,*tail = NULL; scanf("%d",&n); while(n!=-1 && n>0 ) { p = (struct ListNode*)malloc(sizeof(struct ListNode)); p->data = n; if(head == NULL) { head = p; } else { tail->next = p; } tail = p; scanf("%d",&n); } if(head == NULL) { return NULL; } tail->next = NULL; return head; } struct ListNode *getodd( struct ListNode **L ) { struct ListNode *p = *L,*head1 = NULL,*r = NULL,*L1 = NULL,*r1 = NULL; while(p!=NULL&&p->data>0) { if(p->data%2!=0) { if(head1 == NULL) { head1 = p; } else { r->next = p; } r = p; } else { if(L1 ==NULL) { L1 = p; } else { r1->next = p; } r1 = p; } p = p->next; } if(head1==NULL) { return NULL; } else { r->next = NULL; } if(L1==NULL) { *L = NULL; } else { r1->next = NULL; *L = L1; } return head1; }
3.本題調試過程碰到問題及解決辦法
無。
6-2 學生成績鏈表處理
1.設計思路
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
第一步:在createlist函數中將輸入的學號,姓名和分數存儲到鏈表中
第二步:在deletelist函數中遍歷鏈表的結點,若結點中的分數小於規定的值則釋放此結點的內存,需注意若最終結點全被釋放完內存,即返回的頭結點爲空的狀況
第三步:將判斷後鏈表的頭結點返回主函數。
2.實驗代碼
struct stud_node *createlist() { int num; char name[20]; int score; struct stud_node *p,*head=NULL,*tail=NULL; scanf("%d",&num); while (num != 0) { p = (struct stud_node *)malloc (sizeof (struct stud_node)); scanf ("%s %d", p->name, &p->score); p->num = num; if (head == NULL) head = p; else tail->next = p; tail = p; scanf ("%d", &num); } return head; } struct stud_node *deletelist( struct stud_node *head, int min_score ) { struct stud_node *L=head,*head1=NULL,*tail1=NULL; while(L!=NULL) { if(L->score>=min_score) { if(head1==NULL) { head1 = L; } else { tail1->next = L; } tail1 = L; } L=L->next; } if(head1==NULL) { return NULL; } else { tail1->next =NULL; } return head1; }
3.本題調試過程碰到問題及解決辦法
錯誤信息:
錯誤緣由:定義時未定義score而定義了兩次num,低級錯誤
改正方法:從新定義整形變量score
6-3 鏈表拼接
1.設計思路
(1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
第一步:
第二步:
......
2.實驗代碼
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) { struct ListNode *p1=list1; int length=0; int array[100]; for(p1=list1;p1!=NULL;p1=p1->next) { array[length] = p1->data; length++; } p1=list2; for(;p1!=NULL;p1=p1->next) { array[length] = p1->data; length++; } int i,j,t; for(i=0;i<length-1;i++) { for(j=i+1;j<length;j++) { if(array[j]<array[i]) { t =array[j]; array[j]=array[i]; array[i] = t; } } } struct ListNode *q,*head1 = NULL,*tail1=NULL; i=0; while(i<length) { q = (struct ListNode *)malloc(sizeof(struct ListNode)); q->data = array[i]; if(head1 == NULL) { head1 = q; } else { tail1->next = q; } tail1 = q; tail1->next = NULL; i++; } return head1; }
3.本題調試過程碰到問題及解決辦法
錯誤信息1:
錯誤緣由:結尾tail1 = q與tail1->next = NULL的順序錯誤
錯誤信息2:
錯誤緣由:最後缺乏i++進行循環
改正方法:
一、總結兩週裏所學的知識點,回答下列問題?
(1)如何理解指針數組,它與指針、數組有何關係?爲什麼能夠用二級指針對指針數組進行操做?
數組的各個元素都是指針類型,用於存放內存地址,那麼這個數組就是指針數組。二級指針通常定義爲「類型名 **變量名」,取得兩次地址便可以對指針數組進行操做。
(2)將C高級第三次PTA做業(1)任何一個題目改成使用二級指針對指針數組進行操做。
(3)用指針數組處理多個字符串有何優點?能夠直接輸入多個字符串給未初始化的指針數組嗎?爲何?
節省空間,可自由決定數組長度。不能夠,未初始化會將指針存入一個不肯定的地址,破壞系統正常工做。
二、將PTA做業的源代碼使用git提交到託管平臺上,要求給出上傳成功截圖和你的git地址。
個人git地址:https://git.coding.net/Downager/180422.git
三、點評3個同窗的本週做業(在做業中給出被點評同窗博客的連接),並邀請3名同窗點評你的做業,無點評做業(你的做業未被3人點評)/或者沒有回覆同窗或老師的點評都倒扣該題分數。
孫銘婧:www.cnblogs.com/sun031915/
吳曉明:http://www.cnblogs.com/gu-an-cheng-wxm/
王姝雯:http://www.cnblogs.com/phsudie/
四、請用表格和折線圖呈現你本週(4/9 8:00~4/23 8:00)的代碼行數和所用時間、博客字數和所用時間。