代码改变世界

第三次作业

2018-04-14 12:53  梁圣然  阅读(253)  评论(4编辑  收藏  举报

6-1 输出月份英文名

一.设计思路:

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个整形n 并输入n为月份 定义一个指针变量为s
3.通过函数getmonth将其转换为英文输出赋给s
4.如果输入的在范围之外则返回空指针

(2).流程图


二.实验代码

char *getmonth( int n )
{
    char *month[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    if(n>=1 && n<=12){
      return month[n-1];
    }
    else {
      return NULL;
    }
    
}

三.调试过程中解决办法碰到的问题和

错误信息

错误原因 &&和的意思 ||或的意思注意符号语言
改正方法 将||改成&&

6-2 查找星期

一.设计思路:

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个n 和数组s[masx]输入字符串s为星期
3.调用函数getindex定义j为负1 i循环变量,字符指针数组 char day[7{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
4.定义字符型指向指针的指针**q=day 在for中循环变量i i<7 执行if(strcmp(s,
(q+i))==0) 条件成立执行j=i break跳出这个循环
5.跳出循环返回j

(2).流程图


二.实验代码

int getindex( char *s ){
    int j=-1,i;
    char *day[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
    char **q=day;
    for(i=0;i<7;i++){
        if(strcmp(s,*(q+i))==0){
            j=i;
            break;
        }
    }
    return j;
}

三.调试过程中解决办法碰到的问题和

错误信息

错误原因 *(q+i)指向的是day中地址比较 **(p+i)所指的是字符串中day中的值
改正方法 将**(q+i) 改成*(q+i)

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

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义两个整形变量i n 定义一个字符指针数组 char *string[MAXN] = {NULL}
3.for循环赋值i=0条件为i<n;在for循环中动态分配内存其大小为20字节输入一个字符串并赋给string[i]
4.调用函数 max_len 定义i j max并赋值 利用for循环条件为i<n 利用strlen函数计算字符串的长度
5.利用if语句开始比较并记录下最大下标 最后返回max

(2).流程图

二.实验代码

int max_len( char *s[], int n )
{
    int i=0,j;
    int max=0;
    for(i=0;i<n;i++)
    {
        j = strlen(s[i]);
        if(max < j)
        max = j;
    }
    return max;
}

三.调试过程中解决办法碰到的问题和

错误信息

错误原因 注意;号问题
改正方法 for循环条件不加;号 改正在每个语句后都想加;的习惯

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

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个字符数组 两个字符 一个指针变量
3.输入一个字符串换行 并输入两个字符
4.调用函数match 函数中定义i j for循环条件(s+i)!='\0' 利用if条件为循环输入字符串中的每个字符与ch1对比
5.找到后将s[i]地址赋给指针char
a 即ch1的地址 利用for循环条件为((s+j)!=ch2)&&((s+j)!='\0')找到ch2输出
6.如果不存在chr2 返回a 如果存在返回s+i

(2).流程图


二.实验代码

char *match( char *s, char ch1, char ch2 ){
  int i,j;
  for(i=0;*(s+i)!='\0';i++){
    if(*(s+i)==ch1){
      char *a=  &s[i];
        for(j=i;(*(s+j)!=ch2)&&(*(s+j)!='\0');j++){
            printf("%c",*(s+j));
        }
        if(*(s+j)!='\0')
        printf("%c",*(s+j));
        printf("\n");
         return a;
      }
  }
printf("\n");
return s+i;

}

三.调试过程中解决办法碰到的问题和

错误信息 部分正确
错误原因 做题太马虎
改正方法 for循环条件不加;号 改正在每个语句后都想加;的习惯

第五题

#include <stdio.h>
#include <stdlib.h>
#define N 20
#define M 39 
void delete(int s[N][M],int x); 
int main()
{
    int i,j,a[N][M],num=1;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            a[i][j]=num;
            num++;
        }
    }                       //创建一个二维数组,元素从1 到N*M 
    a[0][0]=0;                //a[0][0]=1不是质数,将它赋值为0 
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(a[i][j]!=0){
                delete(a,a[i][j]);  //调用函数进行筛选法 ,每调用函数一次数组a,a的值都会发生变化,不是质数的元素赋值为0 
            }
        }
    }
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(a[i][j]!=0){
                printf("%d\t",a[i][j]);
            }
        }
    }                         //将所有的指数(数组中不为0的数)输出 
    return 0;
 } 
 void delete(int s[N][M],int x){
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(i!=0||j!=0){          //跳过a[0][0], 
                if(s[i][j]%x==0&&s[i][j]!=x){
                    s[i][j]=0;//将所有的能被想整除的数赋值为0 
                 }
             }
         }
     }
 }

6-1 奇数值结点链表

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个结构体,成员名整型data,结构体指针next
3.在主函数中 定义结构体指针
L,Odd,L=调用函数的readlist将函数的返回值,Odd=调用函数getodd函数的返回值
4.在readlist函数中,建立一个链表将链表的头地址返回给主函数
5.在getodd函数中,定义结构体指针变量head=NULL,q=NULL,p,w=NULL,head1=NULL,如果L!=NULL就利用for循环,for(head=*L;head!=NULL;head=head->next),在for循环中利用if语句判断head->data%2!=0 成立的话head1=head,不成立执行p->next=head,执行if语句之后 p=head,如果head->data%2!=0不成立,执行else中的语句 判断q==NULL,成立q=head,不成立w->next=head,在if语句之后执行w=head,执行完for循环后p->next=NULL,如果w!=NULL执行w->next=NULL。最后L=q。在第一个if不满足时返回NULL,在最后返回head1.
6.调用函数printlist,将奇数链表打印出来,在调用函数printlist 将偶数链表打印出来

(2).流程图

二.实验代码

struct ListNode *readlist(){
    struct ListNode *head=NULL,*p=NULL,*q=NULL;
    int data;
    p=q=(struct ListNode *)malloc(sizeof(struct ListNode));
    scanf("%d",&p->data);
    while(p->data!=-1){
        if(head==NULL){
            head=p;
        }else{
            q->next=p;
        }
        q=p;
        p=(struct ListNode *)malloc(sizeof(struct ListNode));
        scanf("%d",&p->data);
    }
    q->next=NULL; 
    return(head);
}
struct ListNode *getodd( struct ListNode **L ){
    struct ListNode *head=NULL,*q=NULL,*p,*w=NULL,*head1=NULL;
        if(*L!=NULL){
            for(head=*L;head!=NULL;head=head->next){
                if(head->data%2!=0){
                    if(head1==NULL){
                        head1=head;
                    }else{
                        p->next=head;
                    }
                    p=head;
                }else{
                    if(q==NULL){
                        q=head;
                    }else{
                        w->next=head;
                    }
                    w=head;
                }
            }
            p->next=NULL;
            if(w!=NULL)
            w->next=NULL;
            *L=q;
        }else{
            return NULL;
        }
        return(head1);
    }

6-2 学生成绩链表处理

一.设计思路

(1)描述算法

1.仔细阅读题目,了解题意
2.定义一个结构体,成员包括num,字符数组name[20] 整型数score 结构体变量next,
3.在主函数里 定义整型变量min_score,结构体变量
p,head=NULL,调用函数creatlist,head等于函数的返回值
4.在creatlist函数中,创建一个列表,将链表的头地址返回给主函数
5.在主函数中输入一个数给min_score,调用函数deletelist,将函数的返回值给head,
6.定义结构体变量
p,q,w,通过if语句,条件为head!=NULL,借助for循环条件1为w=head,条件2为w!=NULL条件3为w=w->next,在循环体中借助if语句条件为w->score

(2)流程图

二.实验代码

struct stud_node *createlist(){
    struct stud_node *head=NULL,*p=NULL,*q=NULL;
    p=q=(struct stud_node *)malloc(sizeof(struct stud_node));
    scanf("%d",&p->num);
    while(p->num!=0){
        scanf("%s %d",p->name,&p->score);
        if(head==NULL){
            head=p;
        }else{
            q->next=p;
        }
        q=p;
    p=(struct stud_node *)malloc(sizeof(struct stud_node));
    scanf("%d",&p->num);
    }
    q->next=NULL; 
    return (head);
}
struct stud_node *deletelist( struct stud_node *head, int min_score ){
    struct stud_node *p,*q,*w; 
    if(head!=NULL){
            for(w=head;w!=NULL;w=w->next){
                if(w->score<min_score){
                    for(p=head;min_score<=p->score&&p->next!=NULL;p=p->next){
                        q=p;
                    }
                    if(min_score>p->score){
                    if(p==head){
                        head=p->next;
                    }else{
                        q->next=p->next;
                    }
                }       
            }
        }
        return (head);
    }
    else{
     return NULL;
    }
    
}

6-3 链表拼接

这题是真的的不会呀,前两道题请教的别的同学才做出来的