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; }
设计思路
第一步:将十二个月的名称分别赋值给一维数组指针,定义用于返回的数据类型。第二步:遍历数组,满足若n在(1-12)范围则将month第n-1行的首元素的地址赋给一开始定义的数据。
第三步:返回变量的地址值。
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; }
设计思路
第一步:将一个星期每天的英文分别赋值给一维数组指针,定义一个整型变量,赋初值为0。
第二步:遍历一维数组,用strmcp函数比较数组中每行元素与输入的字符串是否相同,若相同,则令此时的行数等于一开始定义的整型变量,且跳出循环。
第三步:返回整型变量值。
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]; }
设计思路
第一步:s数组,计算出每行元素的长度。
第二步:在for循环中进行比较,定义int型max,赋初值为0,当行元素的长度大于max,则将长度的值赋给max。
第三步:返回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; }
设计思路
第一步:先遍历s字符数组,找到与ch1相同时s的下标,并将下标值赋给一个整型变量,定义为j。
第二步:在确定下标后,定义一个指针字符s,将&s[i]赋给s,后跳出循环。
第三步:从上面的j开始,循环字符数组s,在循环中分情况,若s[i] != ch2,则输出s[i],反之则输出s[i]加换行,且返回temp。
第四步:循环结束后,输出换行及返回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; }
设计思路
第一步:分别创建2个新的链表。
第二步:通过识别所给链表各数值的奇偶性,将其给至不同的链表。
第三步:返回2个链表的头结点。
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; }
设计思路
第一步:建立链表,通过循环进行赋值。若序号为0时,使链表最后一个节点指向空。
第二步:输入条件值,在链表中,对每个低于条件值的节点进行删除。
第三步:返回删除操作后的链表头结点。
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; }
设计思路
第一步:将链表1,2各值分别赋值给一数组。
第二步:通过对数组排序得到的有序数组,将数组各元素赋值回一个新链表。
第三步:返回链表头结点。
要求三、学习总结和进度(15分)
1、总结两周里所学的知识点,回答下列问题?
(1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
(2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。
(3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
GIT: https://git.coding.net/ShiWithZhou/HI.git
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业,无点评作业(你的作业未被3人点评)/或者没有回复同学或老师的点评都倒扣该题分数。
董雅洁 http://www.cnblogs.com/exo123/p/8798720.html
莯菸 http://www.cnblogs.com/sun031915/p/8836088.html
揆空 http://www.cnblogs.com/zxy980612/p/8858885.html
4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间