第三次作业(第二学期)
作业要求一 (20分)
完成下列编程题目,每次上完课都会增加2-3道题目,并将编程过程记录在博客里,一次PTA作业任选一道题目给出设计思路、流程图、源代码和错误记录,其他题目可只给出设计思路、源代码和错误记录。另外将每次PTA作业的提交列表贴在博客里,每次5分。
1)C高级第三次PTA作业(1)
2)C高级第三次PTA作业(2)
3)一道编程题:
作业要求二(65分)
题目6-1 输出月份英文名
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:简单的根据所给数字输出其对应的月份英文,故要先判断其月份是否有效。
第二步:有效月份进入switch语句,根据数值返回相应字符串。
(2)流程图(4分)
2.实验代码(2分)
char *getmonth( int n )
{
if(n>12||n<1)
{return 0;
}
else
{
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" ;
}
}
}
3.本题调试过程碰到问题及解决办法(4分)
无
题目6-2 查找星期
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:定义指针数组将各星期英文名进行储存。
第二步:从星期天开始依次比较字符串,若找到相同字符串,返回下标。
第三步:若没找到相同字符串则在循环结束后返回-1。
(2)流程图(4分)
2.实验代码(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)
{
return i;
}
}
return -1;
}
3.本题调试过程碰到问题及解决办法(4分)
无
题目6-3 计算最长的字符串长度
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:将第一条字符串的长度作为max的值与后续字符串长度进行比较。
第二步:如果max小于某字符串长度则将该字符串长度赋值给max。
第三步:如果max值大于该字符串长度,则继续与下一字符串进行比较。
第四步:循环结束,返回max。
(2)流程图(4分)
2.实验代码(2分)
int max_len( char *s[], int n )
{ int i;
int t;
int length;
int max=strlen(s[0]);
for(i=0;i<n;i++)
{ length=strlen(s[i]);
if(max<length)
{
t=length;
length=max;
max=t;
}
}
return max;
}
3.本题调试过程碰到问题及解决办法(4分)
无
题目6-4 指定位置输出字符串
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:首先识别题目所给的2个字符,对其是否出现进行标记,并记录下其下标。
第二步:根据其字符出现情况进行判断语句。
第三步:若未识别到开始字符,则直接输出换行并返回空。
第四步:若只识别到开始字符,则从开始字符输出到结束,并返回所输出的这些字符。
第五步:若识别到起始与结束字符,则输出包括其在内的字符,并返回从开始字符到结尾的所有字符。
(2)流程图(4分)
2.实验代码(2分)
char *match( char *s, char ch1, char ch2 )
{ int i,m=0;
char *q;
int mark=-1,flag=-1;
int biaoji1=0,biaoji2=0;
for(i=0;;i++)
{if(*(s+i)=='\0')
{break;
}
if(*(s+i)==ch1&&mark==-1)
{mark=i;
}
if(*(s+i)==ch2)
{if(biaoji2!=1||i<biaoji1)
{ flag=i;
biaoji2=1;
biaoji1=flag;
}
}
}
if(mark==-1)
{
printf("\n");
*s='\0';
return s;
}
if(mark!=-1&&flag!=-1)
{
for(i=mark;i<=flag;i++)
{
if(i==flag)
{printf("%c\n",*(s+i));
}
else
{ printf("%c",*(s+i));
}
}
return (s+mark);
}
if(mark!=-1&&flag==-1)
{
printf("%s\n",(s+mark));
return (s+mark);
}
}
3.本题调试过程碰到问题及解决办法(4分)
我认为PTA代码的审核标准并不完善。例如ch1等于ch2,ch2前后出现2次等情况。
6-1 奇数值结点链表
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:分别创建2个新的链表。
第二步:通过识别所给链表各数值的奇偶性,将其给至不同的链表。
第三步:返回2个链表的头结点。
(2)流程图(4分)
2.实验代码(2分)
struct ListNode *readlist()
{ int i;
struct ListNode *head=NULL,*t,*end;
for(i=0;;i++)
{t=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&t->data);
if(t->data==-1)
{end->next=NULL;
break;
}
if(head==NULL)
{
head=t;
end=t;
}
else
{end->next=t;
end=t;
}
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{ struct ListNode *start1,*a,*b,*c,*start2;
a=*L;
start1=(struct ListNode*)malloc(sizeof(struct ListNode));
start2=(struct ListNode*)malloc(sizeof(struct ListNode));
start1->next=NULL;
start2->next=NULL;
b=start1;
c=start2;
for(;;)
{
if(a==NULL)
{
break;
}
if(a->data%2!=0)
{
b->next=a;
b=a;
}
else
{
c->next=a;
c=a;
}
a=a->next;
}
c->next=NULL;
b->next=NULL;
*L=start2->next;
return start1->next;
}
3.本题调试过程碰到问题及解决办法(4分)
问题:我的第一个思路是仅创建一个新链表,将偶数剥离出来。并让留下的奇数作为一个链表。遇到了段错误的问题。
解决方法:创建2个新链表。
6-2 学生成绩链表处理
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:建立链表,通过循环进行赋值。当序号为0时,使链表最后一个节点指向空。
第二步:输入条件值。
第三步:遍历链表,对每个低于条件值的节点进行删除。
第四步:返回删除操作后的链表头结点。
(2)流程图(4分)
2.实验代码(2分)
struct stud_node *createlist()
{
struct stud_node *head=NULL,*t,*end;
head=(struct stud_node*)malloc(sizeof(struct stud_node));
end=head;
for(;;)
{ t=(struct stud_node*)malloc(sizeof(struct stud_node));
scanf("%d",&t->num);
if(t->num==0)
{
break;
}
scanf("%s",t->name);
scanf("%d",&t->score);
if(head==NULL)
{head=t;
end=t;
}
else
{end->next=t;
end=t;
}
}
end->next=NULL;
return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
struct stud_node *a=head,*b=head;
for(;;a=a->next)
{ if(a==NULL)
{break;
}
if(a->score<min_score)
{if(a==head)
{head=a->next;
free(a);
}
else
{
b->next=a->next;
free(a);
}
}
else
{b=a;
}
}
return head;
}
3.本题调试过程碰到问题及解决办法(4分)
某个知识点识别出段错误,通过手动分配内存解决。
6-3 链表拼接
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:将链表1,2各值分别赋值给一数组。
第二步:通过对数组排序得到有序数组。
第三步:将数组各元素赋值回一个新链表。
第四步:返回链表头结点。
(2)流程图(4分)
2.实验代码(2分)
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
int num = 0;
int temp[100];
struct ListNode *p = list1;
while(p != NULL)
{
temp[num] = p->data;
num++;
p = p->next;
}
p = list2;
while(p != NULL)
{
temp[num] = p->data;
num++;
p = p->next;
}
int i,j;
for(i = 0; i < num; i++)
for(j = i + 1; j < num; j++)
{
if(temp[i] > temp[j])
{
int t;
t = temp[i];
temp[i] = temp[j];
temp[j] = t;
}
}
struct ListNode *newlist = NULL;
struct ListNode *endlist = NULL;
struct ListNode *q;
for(i = 0; i < num; i++)
{
q = (struct ListNode *)malloc(sizeof(struct ListNode));
q->data = temp[i];
if(newlist == NULL)
{
newlist = q;
newlist->next = NULL;
}
if(endlist != NULL)
{
endlist->next = q;
}
endlist = q;
endlist->next = NULL;
}
return newlist;
}
3.本题调试过程碰到问题及解决办法(4分)
问题:我的第一个想法并没有使用数组,而是拿第二个链表的各值与链表1作比较,进行插入操作。修改的3,4个版本皆无法得到全对。遇到过答案错误,运行超时与段错误。原因未知。从调试看来,我对不同情况的插入操作考虑欠佳。
解决方法:选择了通用性强,思路清晰简单更熟悉的方法。即通过转入数组进行排序。
要求三、学习总结和进度(15分)
1、总结两周里所学的知识点,回答下列问题?(用自己的话表达出你的理解,网上复制粘贴没有分数)(5分)
如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
指针数组即数组中各元素类型为指针。指针数组也是数组的一种,可以用二维指针表示。 一维数组和一维指针可以相互转换使用,二级指针同理。
将C高级第三次PTA作业任何一个题目改为使用二级指针对指针数组进行操作。
char *getmonth( int n )
{
char *month[12]={"January","Febuary","March","April","May","June","July","August","September","October","November","December"};
char **p;
p= month;
int i=0;
for(i=1;i<=12;i++)
{
if(n==i)
{
return *(p+i-1);
}
}
if(n>=13||n<=0)
{
return NULL;
}
}
用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
无需知道每个字符串的长度。 不可以,未初始化的指针数组可能指向不可用的地址,以致发生错误。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
地址:https://git.coding.net/Donahue_Xu/The-Third-Homework2.git
截图:
3、点评3个同学的本周作业
刘炜旗:
赵寅胜:http://www.cnblogs.com/2017023960ZYS/p/8759455.html
4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间(3分)
表格:
折线图: