第三次作业
Posted jj990519
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三次作业相关的知识,希望对你有一定的参考价值。
第三次作业
题目6-1输出月份英文名
1.设计思路
(1)主要描述题目算法
第一步:先定义一个指针数组char *month[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
第二步:判断n是否在小于等于0,大于12
第三步:如果满足条件,返回NULL
第四步:不满足条件返回month[n-1]
2.实验代码
char getmonth( int n )
{
char month[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
if(n > 12 || n <= 0)
return NULL;
else
return month[n-1];
}
3.本题调试过程碰到问题及解决办法
错误原因1:返回month[n],month这个数组下标是从0开始的
改正方法1:month[n-1]
题目6-2查找星期
1.设计思路
(1)主要描述题目算法
第一步:先定义一个指针数组char *day[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
第二步:用for循环来遍历,
第三步:在for循环里嵌套一个if语句,if语句用来判断s和day[i]二个字符串是否相等,如果相等返回i
第四步:在for循环外面返回-1
2.实验代码
int getindex( char s )
{
char day[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
int i=0;
for(i=0; i<7; i++)
{
if( strcmp(s,day[i]) == 0 )
return i;
// else
// return i;
}
return -1;
}
3.本题调试过程碰到问题及解决办法
错误原因1:在for循环内部,返回了-1
改正方法1:在for循环外面返回-1
题目6-3计算最长的字符串长度
1.设计思路
(1)主要描述题目算法
第一步:用strlen函数来求出字符串的长度
第二步:用for循环和嵌套的if语句来求出最长字符串的长度
第三步:返回max,最长字符串的长度
2.实验代码
int max_len( char *s[], int n )
{
int i=0, t;
int max=0;
for(i=0; i<n; i++)
{
t = strlen(s[i]);
if(max < t)
max = t;
}
return max;
}
3.本题调试过程碰到问题及解决办法
错诶信息1:在for循环里返回了max
改正方法1:将max在for循环外面返回
6-4指定位置输出字符串
1.设计思路
(1)主要描述题目算法
第一步:先用for循环找出start和end
第二步:判断end是否在数组中找到,如果没有找到,执行end = n-1;
第三步:判断start是否找到,如果没有找到,执行输出换行,s[0] = ‘\0‘,p = &s[0],返回p
第四步:如果在数组中找到start,则用for循环输出start和end中的字符,最后输出换行,并返回p的值。
2.实验代码
include
char match( char s, char ch1, char ch2 )
{
int n = strlen(s);
int i,j;
int start = -1,end = -2;
char p=NULL,q=s;
//char a = ‘\n‘;
for(i=0; i<MAXS; i++)
{
if( s[i] == ch1 && start == -1)
{
start = i;
p = &s[i];
}
if( s[i] == ch2)
end = i;
//end = n-1;
}
if(end == -2)
end = n-1;
if(start == -1)
{
printf("\n");
s[0]=‘\0‘;
p=&s[0];
return p;
//return p;
}
else
{
for(j=start; j<=end; j++)
{
printf("%c",s[j]);
}
printf("\n");
return p;
}
}
3.本题调试过程碰到问题及解决办法
错误现象1:第一组输入的时候,只输出了rog,但是并没有输出rogram
改正方法1:我当时认为只要输出指定的二个字符之间的字符,并没有想到end还可以往后找
题目一道编程题
题目内容
有一个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的全部质数。
1.设计思路
(1)主要描述题目算法
第一步:因为a[0]=a[1]=1,1不是素数,所以把a[0],和a[1]排除在外
第二步:用for循环来遍历
第三步:for循环中用if语句来判断a[i]是不是素数
第四步:t=2*i;再用while循环来给不是素数的赋值为1。
第五步:用for循环来遍历,并用内嵌的if语句来分别判断i是不是素数和每五个素数换行一次
2.实验代码
include "stdio.h"
define N 803196
int a[N];
int main()
{
//int a[N] = {0};
int t,i;
a[0]=a[1]=1;
for(i=2;i<N/2;i++)
{
if(a[i]==0)
{
t=2*i;
while(t<=N)
{
a[t]=1;
t+=i;
}
}
}
int count =0;
for(i=1;i<=N;i++)
{
if(a[i]==0)
{
printf("%d ",i);
count ++;
if(count == 5)
{
printf("\n");
count =0;
}
}
}
return 0;
}
3.本题调试过程碰到问题及解决办法
错误原因1:没有思路,知道怎么去做
改正方法1:去上网查看了关于筛选法的知识。
题目6-1奇数值结点链表
1.设计思路
(1)主要描述题目算法
第一步:第一个函数没有什么想说的,就是建立链表,固定模式,照搬照抄就行啦
第二步:第二个函数要区别数值的奇数和偶数,所以直接再建立二个新的链表分别存储奇数和偶数
实验代码
struct ListNode readlist()
{
struct ListNode head = NULL;
struct ListNode tail = NULL;
struct ListNode p = 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;
tail = p;
}
else
{
tail->next = p;
tail = p;
}
scanf("%d",&data);
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode head0 = NULL,head1 = NULL;
struct ListNode p,q;
struct ListNode tail0,tail1;
while((L != NULL))
{
int data = (L)->data;
struct ListNode q = (struct ListNode)malloc(sizeof(struct ListNode));
if(data % 2)
{
q->data = data;
q->next = NULL;
if(head0 == NULL)
{
head0 = q;
tail0 = q;
}
else
{
tail0->next = q;
tail0 = q;
}
}
else
{
struct ListNode p = (struct ListNode)malloc(sizeof(struct ListNode));
p->data = data;
p->next = NULL;
if(head1 == NULL)
{
head1 = p;
tail1 = p;
}
else
{
tail1->next = p;
tail1 = p;
}
}
//L = NULL;
L = (L)->next;
}
L = head1;
return head0;
}
3.本题调试过程碰到问题及解决办法
错误原因1:但是有这个思路,但是不会建立链表,上课没有听懂,没有申请动态空间
改正方法1:struct ListNode q = (struct ListNode)malloc(sizeof(struct ListNode));
struct ListNode p = (struct ListNode)malloc(sizeof(struct ListNode));
申请动态存储空间
6-2学生成绩链表处理
1.设计思路
(1)主要描述题目算法
第一步:二个函数,第一个函数,依然是建立链表,还是固定模式
第二步:第二个函数,链表的删除,首先如果头指针是空,返回NULL
第三步:接下来,如果头指针对应的成绩小于min_score,执行head = head->next;语句
第四步:p1=head; p2=head->next;将p1p2分别赋为head,和head->next
第五步:用for循环,循环判断的条件是p2!=NULL,判断p2所指向的成绩是否小于min_score
第六步:如果小于执行语句p1->next = p2->next;p2=p1->next;否则执行语句p2=p2->next;p1=p1->next;
第六步:返回头指针
2.实验代码
include
struct stud_node createlist()
{
struct stud_node p = NULL, head = NULL, tail = NULL;
int num=0;
char name[20];
int score;
scanf("%d",&num);
if(num != 0)
scanf("%s %d",name,&score);
while(num != 0)
{
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
{
tail->next = p;
}
tail = p;
scanf("%d",&num);
if(num != 0)
scanf("%s %d",name,&score);
}
return head;
}
struct stud_node deletelist( struct stud_node head, int min_score )
{
struct stud_node p1, p2;
if(head == NULL)
{
return NULL;
}
for(;head->score < min_score; )
{
if(head->score < min_score)
{
head = head->next;
}
if(head == NULL)
return NULL;
}
p1=head;
p2=head->next;
for(; p2!=NULL; )
{
if(p2->score < min_score)
{
p1->next = p2->next;
p2=p1->next;
}
else
{
p2=p2->next;
p1=p1->next;
}
}
return head;
}
3.本题调试过程碰到问题及解决办法
错误信息:思路太混乱了,更本比知道在写什么东西,可能和我知识不熟有关系,忘记判断头指针是否为空
改正方法:判断头指针是否为空,如果为空返回NULL
题目6-3 链表拼接
1.设计思路
(1)主要描述题目算法
注释:本题没有做出来,但是想了好几种方法
方法一:我最开始是想再建立一个空链表,将list1 和list2他们二个进行比较,从头开始比较,如果那个小,就将该值复制给空链表,原来小的那个链表执行list1 = list1->next 或者执行list2 = list2->next ,如果二者比较的的数相等,就将该值复制给空的链表,原来的链表再执行list1 = list1->next 和执行list2 = list2->next。如果原来的链表其中有空的了,就将另一个原来的链表全部链接到空链表的末尾。
方法二:将这二个链表链接到一起,并将其中的值赋值给一个数组,在这个数组中再按照升序排列,在排列好的数组中去除重复的,只保留其中的一个。再用for循环遍历输出。
方法三:在方法一和二中多出现返回NULL不对的错误,还有的是无法指向下一个data,比如p=p->data.所以我在和其他同学的商议过程中应为是建立的空链表不对,所以我将原来的二个链表和在一块,这样二个链表链接在一起的链表足够用来存储,其他的步骤基本和方法二或者方法一一致。
2.实验代码
方法一的代码
struct ListNode mergelists(struct ListNode list1, struct ListNode list2)
{
struct ListNode p = NULL,head;
p = (struct ListNode )malloc(sizeof(struct ListNode));
p = list1;
head = p;
while(p != NULL)
{
p=p->next;
}
p=list2;
while(p != NULL)
{
p=p->next;
}
while(list1 != NULL || list2 != NULL)
{
if(list1->data < list2->data)
{
p->data = list1->data;
list1 = list1->next;
}
else if(list1->data > list2->data)
{
p->data = list2->data;
list2 = list2->next;
}
else
{
p->data = list1->data;
list1 = list1->next;
list2 = list2->next;
}
p = p->next;
}
if(list1 != NULL)
{
p->next = list1;
}
else if(list2 != NULL)
{
p->next = list2;
}
p->next = NULL;
return head;
}
方法二的实验代码
struct ListNode mergelists(struct ListNode list1, struct ListNode list2)
{
int t=0;
int a[100];
while(list1 != NULL)
{
a[t] = list1->data;
t++;
}
while(list2 != NULL)
{
a[t] = list2->data;
t++;
}
int i,j;
int c;
for(i=0; i<t; i++)
{
for(j=i+1; jhead = NULL, tail = NULL, p;
for(i=0; i
struct ListNode mergelists(struct ListNode list1, struct ListNode list2)
{
struct ListNode p = list1,*head;
head = p;
while(p!=NULL)
{
p=p->next;
}
p=list2;
while(p!=NULL)
{
p=p->next;
}
while(list1!=NULL || list2!=NULL)
{
if(list1->data < list2->data)
{
p->data = list1->data;
list1 = list1->next;
}
else if(list1->data > list2->data)
{
p->data = list2->data;
list2 = list2->next;
}
else
{
p->data = list1->data;
list1 = list1->next;
list2 = list2->next;
}
p = p->next;
}
if(list1 != NULL)
{
p->next = list1;
}
else if(list2 != NULL)
{
p->next = list2;
}
p->next = NULL;
return head;
}
学习总结和进度
1.(1)这段时间有点学不明白,我感觉可能是我这段时间没有认真的学习,接下来的日子,要好好学习啦。
以上是关于第三次作业的主要内容,如果未能解决你的问题,请参考以下文章