袁中的第三次作业
第一題:
輸出月份英文名設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:在main中,給你一個(gè)月份數(shù)字n,要求你通過調(diào)用函數(shù)char *getmonth,來判斷:若它小于等于12,則將它轉(zhuǎn)化為英文單詞輸出,若它大于等于12,則輸出wrong input!3:解答:第一步:定義一個(gè)二維數(shù)組*a[12][15],并賦值給它1-12月的英文單詞第二步:定義i,i作為a[]的下標(biāo)第三步:利用一個(gè)for循環(huán),判斷i是否等于n,若相等,返回a[i-1];若出了for循環(huán),則返回 NULL流程圖:
實(shí)驗(yàn)代碼:
char *a[12][15]={"January","February","March","April","May","June","July","August","September","October","November","December"}; char *getmonth( int n ) {int i;for(i=1;i<=12;i++){if(i==n){return a[i-1];}}return NULL;}錯(cuò)誤信息:
錯(cuò)誤1: a[12][15]中的號(hào)一直沒打,找了好久,害我在其它地方一直改,沒改對(duì)
解決方案1:加*號(hào)
第二題:
查找星期設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:在main中,給你星期1-7的英文單詞及它們對(duì)應(yīng)的序號(hào),再給你一個(gè)字符串,通過調(diào)用函數(shù)getindex,要你判斷它是否為星期1-7的英文單詞,若是則輸出它的序號(hào),否則輸出wrong input!3:解答:第一步:定義一個(gè)二維數(shù)組*a[][],并賦值給它星期7-1的英文單詞第二步:定義i,i作為a[]的下標(biāo)第三步:利用一個(gè)for循環(huán),判斷strcmp(s,a[i])是否等于0,若成立,返回序號(hào)i;若不成立,跳出for循環(huán)后,返回-1流程圖:
實(shí)驗(yàn)代碼:
char *a[][15]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; int getindex( char *s )int i;for(i=0;i<7;i++){if(strcmp(s,a[i])==0)return i;}return -1; }錯(cuò)誤信息:
這題沒錯(cuò)誤,因?yàn)榈谝活}的錯(cuò)誤避免了,還有我知道strcmp(s,a[i])==0
第三題:
計(jì)算最長的字符串長度設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:在main中,題目給你n個(gè)字符串,要求你通過調(diào)用函數(shù) max_len,計(jì)算n個(gè)元素的指針數(shù)組s中最長的字符串的長度3:解答:第一步:定義i,max=0,t=0;其中i為s[]的下標(biāo),max記錄s中最長的字符串的長度,t為記錄s中字符串的長度第二步:將strlen(s[0])賦值給max第三步:利用for循環(huán),從i=1開始,令 t=strlen(s[i]);再判斷max是否小于t,若小于,將t賦值給max,跳出for循環(huán)后,返回max流程圖:
實(shí)驗(yàn)代碼:
int max_len( char *s[], int n ) {int i,max=0,t=0;max=strlen(s[0]);for(i=1;i<n;i++){t=strlen(s[i]);if(max<t)max=t;}return max; }錯(cuò)誤信息:
無
第四題:
指定位置輸出字符串設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:要你用函數(shù)match應(yīng)打印s中從ch1到ch2之間的所有字符,并且返回ch1的地址3:解答:在match中,定義i=0,j=0,len=0;i,j作為s[]的下標(biāo),len用于記錄s[]長度。還定義 *p=NULL,*p用于記錄ch1的地址第一步:計(jì)算s[]的長度——len = strlen(s)第二步:用for循環(huán)遍歷s[],先找 s[i]==ch1,若找到,則p=&s[i],再用for循環(huán)找ch2,若找到,則輸出 ch1到 ch2之間的字符,并返回p;若沒找到,輸出ch1后面的所有字符,并返回p;若沒找到ch1,則p=&s[len],并返回p;實(shí)驗(yàn)代碼:
char *match( char *s, char ch1, char ch2 ){ int i=0,j=0,len=0; char *p=NULL; len = strlen(s); for(i=0;i<len;i++){ if(s[i]==ch1){ p=&s[i]; for(j=i;j<len;j++){ if(s[j]!=ch2){ printf("%c", s[j]); } if(s[j]==ch2){ printf("%c\n", s[j]); return p; } } printf("\n"); return p; } } p=&s[len];printf("\n"); return p; }錯(cuò)誤信息:
原因:一開始我題目理解錯(cuò)了:
我以為在主函數(shù)中輸出也是rog,然后我就一直在這個(gè)地方錯(cuò)誤,后來我仔細(xì)看題才知道返回的是ch1的地址
第五題:
用篩選法求質(zhì)數(shù);題目:
設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:先定義一個(gè)宏——MAX_N=10000000,然后定義一個(gè)全局變量的數(shù)組prime[MAX_N],再定義一個(gè)全局變量bool型的數(shù)組is_prime[MAX_N+1];3:在主函數(shù)中,先定義b,c,d,i;其中b為你的學(xué)號(hào),c為你學(xué)號(hào)的前三位,d為你學(xué)號(hào)的后四位,i為prime[]的下標(biāo)第一步:輸入你的學(xué)號(hào)b,然后求出你學(xué)號(hào)的前三位和學(xué)號(hào)的后四位——c=b/10000000,d=b%10000;第二步:調(diào)用函數(shù)sieve——sieve(c*d);第三步:輸出4:在sieve中,用n接收c*d,定義p=0,i,j;p作為質(zhì)數(shù)的下標(biāo),i作為數(shù)組的下標(biāo)、還為1—n之間的某個(gè)數(shù),j為i的倍數(shù)第一步:用一個(gè)for循環(huán),令所以的is_prime[i]的值都為true,出for循環(huán)后,令is_prime[0]=is_prime[1]=false;第二步:用兩個(gè)for循環(huán),外層for循環(huán)為for( i=2;i<=n;i++),進(jìn)入外層for循環(huán)后,判斷is_prime[i]==true是否成立,若成立,代表i為質(zhì)數(shù),令prime[p]=i,然后p++,再用一個(gè)for循環(huán)令所以i的倍數(shù)的值全為is_prime[j]=false,實(shí)現(xiàn)為內(nèi)層for循環(huán)for(int j=2*i;j<n;j=j+i)is_prime[j]=false;實(shí)驗(yàn)代碼:基地學(xué)長教我的
#include <stdio.h> #include <math.h> int MAX_N=10000000; int prime[MAX_N]; bool is_prime[MAX_N+1]; int sieve(int n){int p=0,i,j;for( i=0;i<=n;i++)is_prime[i]=true;is_prime[0]=is_prime[1]=false;for( i=2;i<=n;i++){if(is_prime[i]==true){prime[p]=i;p++;for(int j=2*i;j<n;j=j+i)is_prime[j]=false;}} } int main() {int b,c,d,i;scanf("%d",&b);c=b/10000000;d=b%10000;int sieve(c*d); for(i=0;i<=MAX_N;i++){if((i+1)%5==0){printf("%d\n",prime[i]);}else{printf("%d ",prime[i]);}}} }第六題:
學(xué)生成績鏈表處理設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:在main中,要求你利用兩個(gè)函數(shù),一個(gè)將輸入的學(xué)生成績組織成單向鏈表;另一個(gè)將成績低于某分?jǐn)?shù)線的學(xué)生結(jié)點(diǎn)從鏈表中刪除。其中函數(shù)createlist利用scanf從輸入中獲取學(xué)生的信息,將其組織成單向鏈表,并返回鏈表頭指針;而函數(shù)deletelist從以head為頭指針的鏈表中刪除成績低于min_score的學(xué)生,并返回結(jié)果鏈表的頭指針;3:解答:在createlist中,定義三個(gè)struct stud_node的指針*p, *ptr, *head=NULL;其中*p用于申請(qǐng)動(dòng)態(tài)空間,*head用于建立鏈表的表頭,*ptr用于建立鏈表的其它部分第一步:定義num,name[20],score;它們的值用于賦值給struct stud_node結(jié)構(gòu)中的num,name[20],score;第二步:讀入一個(gè)num,并判斷它是否等于0,若不等于,則進(jìn)入while循環(huán);若等于0,返回head;第三步:進(jìn)入whlie后,讀入name[20],score;再申請(qǐng)一個(gè)struct stud_node結(jié)構(gòu)的動(dòng)態(tài)空間p,將num,name[20],score的值賦值或復(fù)制給p中的num,name[20],score;第四步:判斷head是否為NULL;是則讓head=p,建立鏈表的表頭;若不是,則令ptr->next = p;出if語句后,再將ptr=p;第五步:重復(fù)操作第二步到第四步,直到num=0,返回head;在deletelist中,定義二個(gè)struct stud_node的指針ptr1, ptr2;在第一個(gè)while中,ptr2用于查找從head開始第一個(gè)不滿足head->score < min_score的數(shù);在第二個(gè)while中(此時(shí)的head肯定不滿足head->score < min_score):ptr1用于指向head,ptr2用于指向head的next;第一步:判斷head != NULL && head->score < min_score,若成立,則令ptr2=head,再令head = head->next,再free(ptr2);若不成立了,一定是以下兩種情況之一:1:學(xué)生的分?jǐn)?shù)全部低于min_score,鏈表全部都釋放了,此時(shí)head=NULL;2:找到了第一個(gè)學(xué)生的分?jǐn)?shù)大于min_score的人,并讓head指向了他;第二步:出第一個(gè)while后,判斷head == NULL;若是,則為我說的第一個(gè)情況——學(xué)生的分?jǐn)?shù)全部低于min_score,鏈表全部都釋放了,此時(shí)head=NULL,應(yīng)該返回NULL;若不是,則為第二種情況——找到了第一個(gè)學(xué)生的分?jǐn)?shù)大于min_score的人,并讓head指向了他,我們還要找是否他后面還有不滿足head->score < min_score的數(shù);第三步:令ptr1 = head;ptr2 = head->next;判斷ptr2 != NULL,若不為空,進(jìn)入第二個(gè)while中,判斷ptr2->score < min_score,若滿足,則說明我們要將ptr1的next釋放,在釋放前,應(yīng)該先鏈接——ptr1->next = ptr2->next,再釋放——free(ptr2);若不滿足ptr2->score < min_score,則說明ptr2不用被釋放,我們應(yīng)該讓ptr1指向ptr2——ptr1 = ptr2,再讓ptr2指向ptr1的next——ptr2 = ptr1->next;一直重復(fù)下去,直到跳出while第四步:返回head;流程圖:
無實(shí)驗(yàn)代碼:
#include<string.h> struct stud_node *createlist() {struct stud_node *p, *ptr, *head=NULL;int num;char name[20];int score;scanf("%d",&num);while (num != 0){scanf("%s %d",name,&score);p = (struct stud_node *)malloc(sizeof(struct stud_node));p->num = num;strcpy(p->name, name);p->score = score;p->next = NULL;if (head == NULL){head = p;}else{ptr->next = p;}ptr = p;scanf("%d",&num);}return head; } struct stud_node *deletelist( struct stud_node *head, int min_score ) {struct stud_node *ptr1, *ptr2;while (head != NULL && head->score < min_score){ptr2 = head;head = head->next;free(ptr2);}if (head == NULL)return NULL;ptr1 = head;ptr2 = head->next;while (ptr2 != NULL){if (ptr2->score < min_score) {ptr1->next = ptr2->next;free(ptr2);}elseptr1 = ptr2;ptr2 = ptr1->next;}return head; }錯(cuò)誤信息:
一開始再老師沒講之前,錯(cuò)誤太多了,不是我們沒做,而是天天在做,天天在錯(cuò),刪除鏈表好多情況沒有考慮到,例如:第一個(gè)低于min_score;當(dāng)全部是低于min_score;還有最后一個(gè)低于min_score;老師講了之后好一點(diǎn)了,還是有上面的一些問題,最后經(jīng)過仔細(xì)琢磨終于想出想出來了
小結(jié):這題做的太辛苦了,不過嘛,也受到了好多東西,下次在遇到相似的題也不會(huì)這么費(fèi)勁了
第七題:
奇數(shù)值結(jié)點(diǎn)鏈表設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:在main中,要求你用兩個(gè)函數(shù),分別將讀入的數(shù)據(jù)存儲(chǔ)為單鏈表、將鏈表中奇數(shù)值的結(jié)點(diǎn)重新組成一個(gè)新的鏈表。其中函數(shù)readlist從標(biāo)準(zhǔn)輸入讀入一系列正整數(shù),按照讀入順序建立單鏈表。當(dāng)讀到?1時(shí)表示輸入結(jié)束,函數(shù)應(yīng)返回指向單鏈表頭結(jié)點(diǎn)的指針。而函數(shù)getodd將單鏈表L中奇數(shù)值的結(jié)點(diǎn)分離出來,重新組成一個(gè)新的鏈表。返回指向新鏈表頭結(jié)點(diǎn)的指針,同時(shí)將L中存儲(chǔ)的地址改為刪除了奇數(shù)值結(jié)點(diǎn)后的鏈表的頭結(jié)點(diǎn)地址(所以要傳入L的指針)。3:解答:在readlist中,定義三個(gè)struct ListNode的指針*p, *tail, *head=NULL;其中*p用于申請(qǐng)動(dòng)態(tài)空間,*head用于建立鏈表的表頭,*tail用于建立鏈表的其它部分第一步:定義data;data的值用于賦值給struct ListNode結(jié)構(gòu)中的data;第二步:讀入一個(gè)data,并判斷它是否等于-1,若不等于,則進(jìn)入while循環(huán);若等于-1,返回head第三步:進(jìn)入whlie后,申請(qǐng)一個(gè)struct ListNode結(jié)構(gòu)的動(dòng)態(tài)空間p,將data的值賦給p中的data;p->next=NULL;第四步:判斷head是否為NULL;是則讓head=p,建立鏈表的表頭;若不是,則令tail->next = p;出if語句后,再將tail=p;第五步:重復(fù)操作第二步到第四步,直到data=-1,返回head;在getodd中,定義七個(gè)struct stud_node的指針*p=*L,*a,*b,*head1,*head2,*p1,*p2;其中head1,head2用于申請(qǐng)動(dòng)態(tài)空間,p用于接收*L,p1用于建立奇數(shù)鏈表的表頭,a用于建立奇數(shù)鏈表的其它部分,p2用于建立偶數(shù)鏈表的表頭,b用于建立偶數(shù)鏈表的其它部分第一步:申請(qǐng)兩個(gè)struct ListNode結(jié)構(gòu)的動(dòng)態(tài)空間head1,head2;令a指向head1,b指向head2;第二步:判斷p!=NULL?,若成立,則p->data%2!=0?,若是,則建立奇數(shù)鏈表,否則建立偶數(shù)鏈表,若不成立,令*L指向偶數(shù)鏈表的表頭p2,返回奇數(shù)鏈表的表頭p1;流程圖:
無實(shí)驗(yàn)代碼:
struct ListNode *readlist() {struct ListNode *head=NULL,*p=NULL,*tail=NULL;int data;scanf("%d",&data);while(data!=-1){p=(struct ListNode *)malloc(sizeof(struct ListNode));p->data=data;p->next=NULL;if(head==NULL){head=p;}else{tail->next=p;}tail=p;scanf("%d",&data);}return head; } struct ListNode *getodd( struct ListNode **L ) { struct ListNode *p=*L,*a,*b,*head1,*head2,*p1=NULL,*p2=NULL;head1=(struct ListNode*)malloc(sizeof(struct ListNode));head2=(struct ListNode*)malloc(sizeof(struct ListNode));head1->next=NULL;head2->next=NULL;a=head1;b=head2;for(;p!=NULL;p=p->next){if(p->data%2!=0){if(p1==NULL)p1=p;elsea->next=p;a=p;}else{if(p2==NULL)p2=p;elseb->next=p;b=p;}}a->next=NULL;b->next=NULL;*L=p2;return p1; }錯(cuò)誤信息:
原因:我先是在原來鏈表的基礎(chǔ)上修改,然后建一個(gè)奇數(shù)鏈表;然而我處理不好,一直錯(cuò)誤,后來我建了兩個(gè)鏈表,一個(gè)奇數(shù),一個(gè)偶數(shù),最后讓*L=偶數(shù)表頭,返回奇數(shù)表頭
第八題:
鏈表拼接設(shè)計(jì)思路:
1:看題目:主函數(shù)與函數(shù)聲明,知道它要你干什么2:理解與分析:在main中,要求你實(shí)現(xiàn)一個(gè)合并兩個(gè)有序鏈表的簡單函數(shù)3:解答:在mergelists中,定義struct ListNode的 *p,*ptr1=list1,*ptr2=list2,*tail=NULL,*head=NULL;其中*p用于申請(qǐng)動(dòng)態(tài)空間,*head用于建立鏈表的表頭,*ptr用于建立鏈表的其它部分,ptr1指向list1,ptr2指向list2;第一步:定義整形a[1000],i=0,n=0,j=0,t;其中a[]用于儲(chǔ)存list1和list2中的所有數(shù),i,j用于冒泡排序法,n用于記錄a[]有多少數(shù),t用于冒泡排序法中交換的中間量;第二步:用兩個(gè)for循環(huán),將list1和list2中的所有數(shù)儲(chǔ)存到a[]中,再用n=i,記錄a[]有多少數(shù);第三步:用兩個(gè)for循環(huán),用冒泡排序法將a[]升序排列;第四步:建立一個(gè)新的鏈表,將a[]的數(shù)全部賦值到鏈表中,最后返回鏈表的頭部;實(shí)驗(yàn)代碼:
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) {struct ListNode *p,*ptr1=list1,*ptr2=list2,*tail=NULL,*head=NULL;int a[1000],i=0,n=0,j=0,t;for(i=0;ptr1!=NULL;ptr1=ptr1->next,i++){a[i]=ptr1->data;}for(;ptr2!=NULL;ptr2=ptr2->next,i++){a[i]=ptr2->data;}n=i;for(i=0;i<n;i++){for(j=i+1;j<n;j++){if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}}}for(i=0;i<n;i++){p=(struct ListNode *)malloc(sizeof(struct ListNode));p->data=a[i];p->next=NULL;if(head==NULL){head=p;}else{tail->next=p;}tail=p;}return head; }錯(cuò)誤信息:
原因:
有一些NULL沒大寫;寫成了NUll,一直編譯錯(cuò)誤總結(jié):
最近兩周的學(xué)習(xí),我們學(xué)了二級(jí)指針,我們利用它輸出月份英文名,查找星期,計(jì)算最長的字符串長度,指定位置輸出字符串;我們還學(xué)了鏈表,剛開始,感覺建鏈表比較簡單,而刪除鏈表比較困難,因?yàn)橛行┨厥馇闆r不好處理,后來經(jīng)過不斷的學(xué)習(xí),對(duì)刪除鏈表也掌握了,這周,我們利用鏈表奇數(shù)值結(jié)點(diǎn)鏈表,學(xué)生成績鏈表處理,鏈表拼接;這周我有一些特別的感覺,以前做PTA基本一下就作好了,而這周嘛,為了這幾題一直在想,一直在做,也許是我掌握的不夠好,不過現(xiàn)在對(duì)我來說這種題型都會(huì)做了,也可以理解所有代碼,不會(huì)像以前那樣費(fèi)勁了,因?yàn)閷W(xué)了一周了,想的也多了,有時(shí)走路也在想,感覺這周收獲比較多。我們還學(xué)了如何申請(qǐng)動(dòng)態(tài)空間,這樣可以節(jié)省更多的空間,上面做的題有體現(xiàn)。我的進(jìn)度:
我點(diǎn)評(píng)的人:
李伍壹
辛靜瑤
姜健
王文博
點(diǎn)評(píng)我的人:
左右羽馬鈺娟王文博姜健李伍壹git地址
轉(zhuǎn)載于:https://www.cnblogs.com/2719610441qqcom/p/8762037.html
總結(jié)
- 上一篇: 结对项目-小学生四则运算系统网页版项目报
- 下一篇: lol肉有哪些英雄