#作業要求一 (20分) ##(1)C高級第三次PTA作業(1)
##(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的全部質數。 ###2.實驗代碼(2分) #include <stdio.h> int main () { int a=201,b=3945; int p = (int )malloc((ab) sizeof(int)); int q = (int )malloc((ab) sizeof(int)); int i=0,j; for(i=0;i<(ab);i++) { p[i] = i+1; } for(i=0;i<(ab);i++) { for(j = i+1;j<=(ab);j++) { if((p[i] !=1) && ( p[j] != 1) ){ if(p[j]%p[i] ==0) { p[j] = 1; } } } } j=0; for(i=0;i<(ab);i++) { if(p[i] != 1) { printf(" %d",p[i]); j++; } if(j == 5) { printf("\n"); j=0; } } } #作業要求二(65分) ##6-1 輸出月份英文名 ###1.設計思路(6分) 第一步:本題要求通過字符串指針實現函數,可以返回一個給定月份的英文名稱。 第二步:定義整形變量n,通過switch語句,判斷每一條語句,如果是就按數字輸出月份,否則執行default,輸出NULL 第三步:按要求返回主函數並輸出。 ###2.實驗代碼(2分) ####部分代碼: char *getmonth( int n ) { switch(n) { case 1:return "January"; case 2:return "February"; case 3:return "March"; case 4:return "April"; case 5:return "May"; case 6:return "June"; case 7:return "July"; case 8:return "August"; case 9:return "September"; case 10:return "October"; case 11:return "November"; case 12:return "December"; default:return NULL; } }
###3.本題調試過程碰到問題及解決辦法(4分) 錯誤原因:n=i時的返回值取地址錯誤 改正方法:改為*(month+i-1)即可,為第n-1行首元素的地址
##6-2 查找星期(15 分)
###1.設計思路(6分) 第一步:將一個星期每天的英文分別賦值給一維數組指針,定義一個整型變量,賦初值為-1。 第二步:遍歷一維數組,用strmcp函數比較數組中每行元素與輸入的字符串是否相同,若相同,則令此時的行數等於一開始定義的整型變量,且跳出循環。 第三步:返回整型變量值。 (2)流程圖(4分)
###2.實驗代碼(2分) ####部分代碼 int getindex( char *s ) { int c=-1,a; char *week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; for(a=0;a<7;a++) { if(strcmp(s,week[a])==0) { c=a; break; } } return c; } ###3.本題調試過程碰到問題及解決辦法(4分)
##6-3 計算最長的字符串長度(15 分)
###1.設計思路(6分) (1)主要描述題目算法(2分) 第一步:遍歷s數組,運用strlen函計算出每行元素的長度。利用for循環遍歷數組,使用strlen函數求出每個字符串的長度,max最初為首個字符串的長度,遇到比它長的就把len賦給 max。 第二步:定義循環變量i,最大值max和長度len。 第三步:返回max的值。 (2)流程圖(4分) ###2.實驗代碼(2分) ####部分代碼 int max_len( char s[], int n ) { int a,c=0,b,q[20]={0}; for(a=0;a<n;a++) { for(b=0;(*(s+a)+b)!='\0';b++) q[a]=b; } c=q[0]; for(a=0;a<n;a++) { if(q[a]>c) } return c; }
###3.本題調試過程碰到問題及解決辦法(4分) 遇到的問題:指針*(*(s+i)+j)!='\0'弄錯了 改正方法:應該是用指針的指針來判斷。 ##6-4 指定位置輸出字符串(20 分)
###1.設計思路(6分) (1)主要描述題目算法(2分) 第一步:先遍歷s字符數組,找到與ch1相同時s的下標,並將下標值賦給一個整型變量,定義為b。 第二步:在確定下標后,定義一個指針字符c,將&s[i]賦給c,后跳出循環。 第三步:從上面的j開始,循環字符數組s,在循環中分情況,若*(s+a) != ch2,則輸出*(s+a),反之則輸出*(s+a)加換行,且返回c。 ###2.實驗代碼(2分) ####部分代碼 char match( char s, char ch1, char ch2 ) { int a,b; for(a=0;(s+a)!='\0';a++) { if((s+a)==ch1) { char c= &s[a]; for(b=a;((s+b)!=ch2)&((s+b)!='\0');b++) { printf("%c",(s+b)); } if((s+b)!='\0') printf("%c",(s+b)); printf("\n"); return c; } } printf("\n"); return s+a; } ###3.本題調試過程碰到問題及解決辦法(4分) 遇到的問題:%c輸出的應該是指針*(s+i),而不是s+i 改正方法:將s+i改成*(s+i),程序運行成功。
##6-1 奇數值結點鏈表(20 分) ###1.設計思路(6分) (1)主要描述題目算法(2分) 第一步:在struct ListNode *readlist函數中,將輸入的值存儲在鏈表里,且用while循環時條件為輸入的值不為-1,在while循環內對p進行動態分配,切記在完全輸入以后,末尾結點 的next為空,返回鏈表的頭結點。 第二步:在getodd函數中,根據要求對鏈表結點中date的值進行分類判斷,將數值為偶數的date存儲在一個新的鏈表中,另將為奇數的存儲在一個新的列表中。 第三步:需考慮若最后新建鏈表有可能為空的情況。最后按照要求返回要求鏈表的頭結點。 (2)流程圖(4分) ###2.實驗代碼(2分) ####部分代碼 struct ListNode *readlist() { int number; struct ListNode *p = NULL,*head = NULL,tail = NULL; scanf("%d",&number); while(number!=-1 && number>0 ) { p = (struct ListNode)malloc(sizeof(struct ListNode)); p->data = number; if(head == NULL) else { tail->next = p; } tail = p; scanf("%d",&number); } if(head == NULL) { return NULL; } tail->next = NULL; return head; } struct ListNode *getodd( struct ListNode **L ) { struct ListNode *p = *L,*head1 = NULL,*r = NULL,*r1 = NULL,*L1 = NULL; while(p!=NULL&&p->data>0) { if(p->data%2!=0) { if(head1 == NULL) else { r->next = p; } r = p; } else { if(L1 NULL) else { r1->next = p; } r1 = p; } p = p->next; } if(head1NULL) { return NULL; } else { r->next = NULL; } if(L1==NULL) { *L = NULL; } else { r1->next = NULL; *L = L1; } return head1; } ###3.本題調試過程碰到問題及解決辦法(4分) 課程學習過程中,對鏈表的結構,表示很不清晰。 改正方法:詢問同學后才明白。 ##(1)C高級第三次PTA作業(2)
6-1 奇數值結點鏈表
###1.設計思路(6分) (1)主要描述題目算法(2分) 第一步:在struct stud_node *createlist() 函數中將輸入的學號,姓名和分數存儲到鏈表中,while循環的條件為學號不為0,因當學號為0時不需要輸入姓名及分數,即結束,因此需 明確必須在判斷學號不為0的情況下才可以輸入姓名和成績,返回鏈表的頭結點。 第二步:在deletelist函數中遍歷鏈表的結點,若結點中的分數小於規定的值則釋放此結點的內存,需注意若最終結點全被釋放完內存,即返回的頭結點為空的情況。 第三步:將判斷后鏈表的頭結點返回主函數。 (2)流程圖(4分)
###2.實驗代碼(2分) struct stud_node *createlist() { int num,score; char name[20]; struct stud_node *p,*head=NULL,tail=NULL; p = (struct stud_node)malloc(sizeof(struct stud_node)); 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;
} else
{
}
L=L->next;
}
if(head1==NULL) {
return NULL;
} else
{
tail1->next =NULL;
}
return head1;
}
###3.本題調試過程碰到問題及解決辦法(4分) 未在readList子函數中加上tail->next = p. 改正方法:加上了tail->next = p。
6-2 學生成績鏈表處理(20 分)
###1.設計思路(6分) (1)主要描述題目算法(2分) 第一步:在createlist函數中將輸入的學號,姓名和分數存儲到鏈表中,while循環的條件為學號不為0,因當學號為0時不需要輸入姓名及分數,即結束,因此需明確必須在判斷學號不為0的情況下才可以輸入姓名和成績,返回鏈表的頭結點。 第二步:在deletelist函數中遍歷鏈表的結點,若結點中的分數小於規定的值則釋放此結點的內存,需注意若最終結點全被釋放完內存,即返回的頭結點為空的情況。 第三步:將判斷后鏈表的頭結點返回主函數。 (2)流程圖(4分) ###2.實驗代碼(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) else { tail1->next = q; } tail1 = q; tail1->next = NULL; i++; } return head1; }
###3.本題調試過程碰到問題及解決辦法(4分) 在函數deletelist中while循環的結束后,忘記加tail1->next =NULL 改正方法:加上tail1->next =NULL。
6-3 鏈表拼接(20 分)
###1.設計思路(6分) (1)主要描述題目算法(2分) 第一步: 根據題目要求,題目是進行鏈表排序,定義一個數組,先將鏈表里的數據儲存在數組中,通過數組進行排序操作; 第二步:數組排序完之后,再通過for語句遍歷; 第三步:把數組里的值重新賦給鏈表; ###2.實驗代碼(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) else { tail1->next = q; } tail1 = q; tail1->next = NULL; i++; } return head1; } ###3.本題調試過程碰到問題及解決辦法(4分)
#要求三、學習總結和進度(15分) ##1、總結兩周里所學的知識點,回答下列問題?(用自己的話表達出你的理解,網上復制粘貼沒有分數)(5分) ###(1)如何理解指針數組,它與指針、數組有何關系?為何可以用二級指針對指針數組進行操作? 答:指針數組是存放指針的數組,即是數組的形式,但數組中的元素為指針,而指針又叫指針變量是存放指針的變量,即存放地址的變量;二級指針可以對指針數組的地址進行操作。 ###(2)將C高級第三次PTA作業(1)任何一個題目改為使用二級指針對指針數組進行操作。 char *getmonth( int n ) { char *month[12] = {"January","February","March","April","May","June","July","August","September","October","November","December"}; char **p = &month[0]; char *pc = '\0'; if(n>0 && n<=12) return pc; } ###(3)用指針數組處理多個字符串有何優勢?可以直接輸入多個字符串給未初始化的指針數組嗎?為什么? 答:當每個字符串長度不同時,可以節省空間,而且不易出現內存分配問題。不可以。因為未初始化的指針可能會指向一些不確定的地址。 ##2、將PTA作業的源代碼使用git提交到托管平台上,要求給出上傳成功截圖和你的git地址。(3分) 截圖 git地址:(https://git.coding.net/smj031915/dexqdcczy.git)
##3、點評3個同學的本周作業(在作業中給出被點評同學博客的鏈接),並邀請3名同學點評你的作業,無點評作業(你的作業未被3人點評)/或者沒有回復同學或老師的點評都倒扣該題分數。(4分) 董雅潔:(http://www.cnblogs.com/exo123/p/8798720.html) 王姝雯:(http://www.cnblogs.com/phsudie/p/8759331.html) 張心悅:(http://www.cnblogs.com/zxy980612/p/8858885.html)
##4、請用表格和折線圖呈現你本周(4/9 8:00~4/23 8:00)的代碼行數和所用時間、博客字數和所用時間(3分) 表格 折線圖