第三次作业

Posted 昵称正在刷新中

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三次作业相关的知识,希望对你有一定的参考价值。

C高级第三次作业(1)

6-1 输出月份英文名

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:定义指针数组*month,初始化为12月份。

第四步:如果输入的n小于1或大于12,则返回NULL,否则返回month[n-1]。

(2)流程图

2.实验代码
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];
  }

}
3.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:将n>1&&12>n改为1>n||n>12。

               将return NULL;与 return month[n-1];掉换顺序。

6-2 查找星期

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:定义指针数组*a,并初始化为"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"

第四步:遍历数组内所有元素,利用strcmp函数做比较,如果值为0,则返回i,否则返回-1.

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.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:将return -1放到for循环之外。

                将*a[i]改为a[i]。

                 将*s改为s。

6-3 计算最长的字符串长度

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:定义i,t,max。max,i初始化为0。

第四步:遍历数组中元素。利用strlen计算s[i]字符串的长度并将其赋给t。

第五步:如果max<t,则将t赋给max。

第六步:返回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.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:将t = strlen(s[i]);放在for循环内。

6-4 指定位置输出字符串

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:定义p,q,指针*m=NULL。

第四步:遍历指针数组*s中所有元素。如果ch1等于 *(s+p),则将s[p]赋给 *z。

第五步:遍历s中元素,如果(s+q)!=ch2)&&((s+q)!=\'\\0\',则输出(s+q),如果(s+q)!=\'\\0\',则输出*(s+q)。

第六步:返回m。

2.实验代码
char *match( char *s, char ch1, char ch2 ){
    int p,q;
    char *m=NULL;
    for(p=0;*(s+p)!=\'\\0\';p++)
    {
        if(*(s+p)==ch1)
        {
        char *z=  &s[p];
            for(q=p;(*(s+q)!=ch2)&&(*(s+q)!=\'\\0\');q++)
            {
                printf("%c",*(s+q));
            }
            if(*(s+q)!=\'\\0\')
            
            printf("%c",*(s+q));
            printf("\\n");
            return z;
            
        }
    }
    printf("\\n");
    return m;
}
3.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:在printf("%c",*(s+q));后加换行。

                将q=0换成q=p。

C高级第三次作业(2)

6-1 奇数值结点链表

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:创立链表m1,m2并申请空间。将数字输入到m1中。利用while语句进行循环,直到-1时跳出循环:如果头结点为空,则将m1赋给head。否则将m1赋给m2->next。循环之后将NULL赋给m2->next,返回head。

第四步:创立链表,如果*L不为空,则遍历所有元素。如果head1除2不等于0,如果head2为空,则将head1赋给head2,否则将head1赋给a1->next。如果a2为空,则将head1赋给a2。否则将head1赋给k->next。

第五步:如果k不为空,则将NULL赋给k->next。否则返回NULL。

第六步:返回head2。

2.实验代码
struct ListNode *readlist()
{
    struct ListNode *head=NULL,*m1=NULL,*m2=NULL;
    int data;
    m1=m2=(struct ListNode *)malloc(sizeof(struct ListNode));
    scanf("%d",&m1->data);
    while(m1->data!=-1)
    {
        if(head==NULL)
        {
            head=m1;
        }else
        {
            m2->next=m1;
        }
        m2=m1;
        m1=(struct ListNode *)malloc(sizeof(struct ListNode));
        scanf("%d",&m1->data);
    }
    m2->next=NULL; 
    return(head);
}
struct ListNode *getodd( struct ListNode **L )
{
   struct ListNode *head1=NULL,*head2=NULL,*a1=NULL,*a2=NULL,*k=NULL;
        if(*L!=NULL)
        {
            for(head1=*L;head1!=NULL;head1=head1->next)
            {
                if(head1->data%2!=0)
                {
                    if(head2==NULL)
                    {
                        head2=head1;
                    }else
                    {
                        a1->next=head1;
                    }
                    a1=head1;
                }else
                {
                    if(a2==NULL)
                    {
                        a2=head1;
                    }else
                    {
                        k->next=head1;
                    }
                    k=head1;
                }
            }
            a1->next=NULL;
            if(k!=NULL)
            {
            k->next=NULL;
            }
            
            *L=a2;
            
        }else
        {
            return NULL;
        }
        return(head2);
}
3.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:将*m1, *m2,head赋值为NULL。

6-2 学生成绩链表处理

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:建立链表,输入num,利用while语句进入循环,直到num=0。

第四步:输入名字和分数。存入p1中,如果头结点为空,则将p1赋给头结点。否则将p1赋给p2->next。p1=p2。在输入num。返回头结点。

第五步:利用while语句进行循环。将head赋给t2,head->next赋给head。删除t2。

第六步:如果头结点为空。返回NULL。

第七步:将head赋给t1,将head->next赋给t2。利用while语句进行循环,如果t2->score < min_score,则将t2->next赋给 t1->next,并删除t2。否则将t2赋给t1,将t1->next赋给t2。返回头结点。

2.实验代码
struct stud_node *createlist()
{
  struct stud_node *p1=NULL,*p2=NULL,*head=NULL;
   int num;
    scanf ("%d", &num);
    while (num != 0)
    {
        p1 = (struct stud_node *)malloc (sizeof (struct stud_node));
        scanf ("%s %d", p1->name, &p1->score);
        p1->num = num;
        p1->next = NULL;
        if (head == NULL)
        {
            head = p1;
        }
        else
        {
            p2->next = p1;
        }
        p2 = p1;
        scanf ("%d", &num);
    }
    return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
    struct stud_node *t1, *t2;
    while (head != NULL && head->score < min_score)
    {
        t2 = head;
        head = head->next;
        free(t2);
    }
    if (head == NULL)
    {
        return NULL;
    }
    t1 = head;
    t2 = head->next;
    while (t2 != NULL)
    {
        if (t2->score < min_score) 
        {
            t1->next = t2->next;
            free(t2);
        }else
        {
        t1 = t2;
        t2 = t1->next;
        }
    }
    return head;
}
3.本题调试过程中碰到的问题及解决办法

错误原因:

6-3 链表拼接

1.设计思路

(1)描述算法

第一步:阅读题目,明确目的。

第二步:找到调用函数。

第三步:建立链表。如果头结点为空则返回头结点。

第四步:利用while语句进行循环。将head赋给now,将now->next赋给next,将NULL赋给last。在进行while循环,如果now->data>next->data,则将next->next赋给now->next,将now赋给next->next,如果last为空,则将next赋给head,否则将last->next赋给next,last->next赋给now,now->next赋给next,返回头结点。

第五步:如果list为空,则将list2赋给head,否则将list1 赋给last。利用while语句进行循环,将last->next赋给last。将list2赋给last->next。返回头结点。

2.实验代码
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
  struct ListNode *sortlink(struct ListNode *head)
{
    struct ListNode *now,*next,*last;
    int control=1;
    if(head==NULL) return head;
    while(control==1)
    {
        control=0;
        now=head;
        next=now->next;
        last=NULL;
        while(next!=NULL)
        {
            if(now->data>next->data)
            {
                now->next=next->next;
                next->next=now;
                if(last==NULL) head=next;
                else last->next=next;
                control=1;
            }
            if(last==NULL) last=head;
            else last=last->next;
            now=last->next;
            next=now->next;
        }
    }
    return head;
}
    struct ListNode *head=list1,*last=NULL;
    if(list1==NULL)
    {
        head=list2;
    }
    else
    {
        last=list1;
        while(last->next!=NULL)
        {
            last=last->next;
        }
        last->next=list2;
    }
    head=sortlink(head);
    return head;
};
3.本题调试过程中碰到的问题及解决办法

错误原因:

改正方法:将last初始化为NULL。

学习总结和进度

1.知识总结

最近学习了链表的创建,删除,链接。学的不是很明白,后期努力。

代码管理
点评 李伍壹
梁圣然
马卿辉

以上是关于第三次作业的主要内容,如果未能解决你的问题,请参考以下文章

第三次寒假作业

第三次作业

第三次作业

第三次作业

第三次作业

第三次作业