2018第三次作业。
未来两周学习内容
- 指针数组
- 指向指针的指针
- 用指针数组处理多个字符串
- 命令行参数
- 指针作为函数的返回值
- 链表
- 链表的概念
- 链表的常用操作
作业要求一 (20分)
完成下列编程题目,每次上完课都会增加2-3道题目,并将编程过程记录在博客里,一次PTA作业任选一道题目给出设计思路、流程图、源代码和错误记录,其他题目可只给出设计思路、源代码和错误记录。另外将每次PTA作业的提交列表贴在博客里,每次5分。
1)C高级第三次PTA作业(1)
6-1 输出月份英文名
实验代码
char *getmonth( int n ) { char *month; char *mon[12] = {"January","February","March","April","May","June","July","August","September","October","November","December" }; month = NULL; if(n <= 0 || n > 12) return month; month = mon[n - 1]; return month; }
设计思路
6-2 查找星期
实验代码
int getindex( char *s ) { int i; char *a[7]= { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" }; for (i = 0; i < 7; i ++) { if (strcmp(s, a[i]) == 0) break; } if (i == 7) i = -1; return i; }
设计思路
6-3 计算最长的字符串长度
实验代码
int max_len( char *s[], int n ) { int a[n],i,k,max = 0; for(i = 0;i < n;i ++) { char *b = s[i]; for(k = 0;;k ++) { if(b[k] == '\0') { a[i] = k; break; } } if(a[max] < a[i]) max = i; } return a[max]; }
设计思路
6-4 指定位置输出字符串
实验代码
char *match( char *s, char ch1, char ch2 ) { int i = 0,k; for(;s[i] != 0;i ++) { if(s[i] == ch1) { for(k = i;s[k] != 0;k ++) { printf("%c",s[k]); if(s[k] == ch2) break; } printf("\n"); return s+i; } } printf("\n"); *s = '\0'; return s; }
设计思路
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的全部质数。
3)C高级第三次PTA作业(2)
6-1 奇数值结点链表
实验代码
struct ListNode *readlist() { struct ListNode *p,*head,*n; head=(struct ListNode*)malloc(sizeof(struct ListNode)); n=head; while(1) { p=(struct ListNode*)malloc(sizeof(struct ListNode)); scanf("%d",&p->data); if(p->data==(-1)) break; n->next=p; n=p; } n->next=NULL; return head->next; } struct ListNode *getodd( struct ListNode **L ) { struct ListNode *i,*j,*k,*h1,*h2; j=h1=(struct ListNode*)malloc(sizeof(struct ListNode)); h1->next=NULL; k=h2=(struct ListNode*)malloc(sizeof(struct ListNode)); h2->next=NULL; i=*L; int n=0; for(;i;i=i->next) { if((i->data)%2==1) { j->next=i; j=i; } else { k->next=i; k=i; } } j->next=NULL; k->next=NULL; *L=h2->next; return h1->next; }
设计思路
6-2 学生成绩链表处理
实验代码
struct stud_node *createlist() { struct stud_node *p,*head,*n; head=(struct stud_node*)malloc(sizeof(struct stud_node)); n=head; while(1) { p=(struct stud_node*)malloc(sizeof(struct stud_node)); scanf("%d ",&p->num); if(p->num==0) break; scanf("%s %d",&p->name,&p->score); n->next=p; n=p; } n->next=NULL; return head->next; } struct stud_node *deletelist( struct stud_node *head, int min_score ) { struct stud_node *p,*k; p=(struct stud_node*)malloc(sizeof(struct stud_node)); k=p; for(;head;head=head->next) { if((head->score)>=min_score) { k->next=head; k=head; } } k->next=NULL; return p->next; }
设计思路
6-3 链表拼接
实验代码
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2) { struct ListNode *h,*p,*i,*k; h=(struct ListNode*)malloc(sizeof(struct ListNode)); p=h; i=list1; k=list2; while(i!=NULL&&k!=NULL) { if(i->data<k->data) { p->next=i; i=i->next; } else { p->next=k; k=k->next; } p=p->next; } while(i) { p->next=i; i=i->next; p=p->next; } while(k) { p->next=k; k=k->next; p=p->next; } p->next=NULL; return h->next; }
设计思路
作业要求二(65分)
请将pta作业编程题目的解题思路和调试过程记录在博客中,每道题目的具体格式如下:
题目6-1 计算两数的和与差
1.设计思路(6分)
(1)主要描述题目算法(2分)。可以用文字描述(不允许使用伪代码),如:
第一步:###
第二步:###
......
(2)流程图(4分)
注意:调用函数和被调函数各画一个流程图,只是被调函数的开始和结束分别变成“主函数调用”和“返回主函数”。
画法可参考流程图例子
注意:设计思路是描述题目的算法,可以用文字描述也可以用流程图描述,不要描述成你做题的过程。
2.实验代码(2分)
注意:将代码贴在此处,必须使用插入代码的方式!!禁止将代码直接粘贴到博客上,否则此题0分。
3.本题调试过程碰到问题及解决办法(4分)
错误信息采用以下格式
错误信息1:(可以截图表示)
错误原因:
改正方法:
错误信息2:
错误原因:
改正方法:
......
要求三、学习总结和进度(15分)
1、总结两周里所学的知识点,回答下列问题?(用自己的话表达出你的理解,网上复制粘贴没有分数)(5分)
(1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
(2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。
(3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。请注意git地址应是类似“https://git.coding.net/Dawnfox/wf4_2.git”这样的字符串且是可被访问者直接点击进行访问的链接。(3分)
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业,无点评作业(你的作业未被3人点评)/或者没有回复同学或老师的点评都倒扣该题分数。(4分)
建议采用汉堡包的方式点评其他同学的作业,只有赞扬没有给出实质性建议或者指正的不算点评,不给分。
4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间(3分)
评分相关注意事项:
- 按时间交——有分
- 晚交——0分
- 迟交一周以上——0分
- 抄袭——0分。按照提交顺序,若后提交博客中的代码和已经提交的“一模一样”,视为抄袭。
另外注意:老师的点评在提交截至日期前,若你在最后一天晚上提交,那么老师无法点评。