第三次作业
作业要求二
第一次PTA
题目6-1 输出月份英文名
1.设计思路
(1).描述算法:
第一步:阅读题目,明确题意要求。
第二步:找到对应函数中的实参和形参并写出函数接口。
第三步:用switch语句对n进行判断,若判断为相应的数字,则返回符合这个条件需要执行的语句。
2.实验代码
char *getmonth( int n )
{
switch(n)
{
case 1:return "January";break;
case 2:return "February";break;
case 3:return "March";break;
case 4:return "April";break;
case 5:return "May";break;
case 6:return "June";break;
case 7:return "July";break;
case 8:return "August";break;
case 9:return "September";break;
case 10:return "October";break;
case 11:return "November";break;
case 12:return "December";break;
default : return NULL;
}
}
3.本题调试过程碰到的问题和解决办法
错误信息:
错误原因:
改正方法:格式上的错误,return后应该用"".
4.其他方法:
实验代码:
char *getmonth( int n )
{
int i;
char *month[12]={"January","February","March","April","May","June","July", "August","September","October","November","December"};
if(n<1||n>12)
{
return NULL;
}else
{
return month[n-1];
}
}
题目6-2 查找星期
1.设计思路
(1).描述算法:
第一步:阅读题目,明确题意要求。
第二步:找到对应函数中的实参和形参并写出函数接口。
第三步:定义一个二维数组存入对应的星期。
第四步:在for循环里,用strcmp()查找。若等于0返回i;若不等返回-1;
(2).流程图:
2.实验代码:
int getindex( char *s )
{
int i;
int idex;
char week[7][15]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(i=0;i<7;i++)
{
if(strcmp(s,week[i])==0)
{
idex = i;
return idex;
}
}
if(i==7)
{
idex = -1;
return idex;
}
}
3.本题调试过程碰到的问题和解决办法
错误信息:
错误原因:没有审清题意,题中说“函数getindex应返回字符串s序号”,
改正方法:所以当strcmp(s,week[i])==0时,应返回i。
题目6-3 计算最长的字符串长度
1.设计思路
(1).描述算法:
第一步:阅读题目,明确题意要求。
第二步:找到对应函数中的实参和形参并写出函数接口。
第三步:在for循环中,用函数strlen()得出字符串的长度,再用if做判断找出最长的字符串。
2.实验代码:
int max_len( char *s[], int n )
{
int i,l,longest = 0;
for(i=0; i<n; i++)
{
l = strlen(s[i]);
if(l>longest)
longest = l;
}
return longest;
}
3.本题调试过程碰到的问题和解决办法
错误信息:
错误原因:longest没有初始化。
改正方法:定义成longest=0。
对malloc函数的学习。
1.概念
malloc向系统申请分配指定size个字节的内存空间。返回类型的void *类型。
2.功能
分配长度为num_bytes字节的内存块。
3.返回值
如果分配成功指向被分配的内存指针,否则返回空指针NULL,当内存不使用时,应使用free()函数将内存块释放。
4.说明
malloc返回为void型的指针,因此要进行强制性的类型转化。
5.工作机制
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲 链表。调用malloc函数时,它沿 连接表寻找一个大到足以满足用户请求所需 要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下 的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL 指针,因此在调用malloc动态申请内存块时,一定要进行返回值 的判断。
5.总结
通过在网上的学习,我把我认为重要的一部分和我学到的东西摘录了下来,上述的用法也加了我自己的理解。(https://baike.sogou.com/v7611912.htm?fromTitle=malloc函数)
第二次PTA
题目6-1 奇数值结点链表
实验代码
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;
else
a->next=p;
a=p;
}
else
{
if(p2==NULL)
p2=p;
else
b->next=p;
b=p;
}
}
a->next=NULL;
b->next=NULL;
*L=p2;
return p1;
}
这个题是<袁中>(http://www.cnblogs.com/2719610441qqcom/p/8762037.html)教给我的,现在明白了,虽然还不能完全靠自己打出来,但能够看懂了。
作业要求三
1.总结
课堂总结
- 这两周主要学了二级指针和链表的创建,删除结点,插入结点以及输出(打印)链表。
2.但这两周的学习任务要比前几周的难度大很多,做题还是比较单一的用以前学到的一级指针和数组,不是能特别熟练的运用二级指针,但做题还是会尽量尝试。
3.对链表的学习,只有创建链表的部分能够完全理解,其他的地方还不是特别能够弄清楚,课下还会继续学习。
课下总结
1.第一点就是自学了malloc函数的部分,能够理解并运用malloc函数(即便不是特别熟练,但也能看懂并自己慢慢写出来)。
2.第二就是杭电上的刷题,刚开始大部分的题都是上学期我们学过的,能完全靠自己写出来并找到错误然后改正。对之前学到的基础的c语言中的循环部分更熟练。对排序,查找这些算法也更熟练。
2.git托管平台
https://github.com/Vinecy666/C-/tree/master