zoukankan      html  css  js  c++  java
  • 第十二周作业

     
    这个作业属于那个课程 c语言
    这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3236
    我在这个课程的目标是 学习掌握单向链表,掌握二级指针的概念,以及指针数组
    这个作业在哪个具体方面帮助我实现目标 前面3道题目
    参考文献

    c语言程序设计,c primer plus

    6-1 计算最长的字符串长度 (15 分)

    本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。

    函数接口定义:

    int max_len( char *s[], int n );

    其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。

    裁判测试程序样例:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MAXN 10
    #define MAXS 20
    
    int max_len( char *s[], int n );
    
    int main()
    {
        int i, n;
        char *string[MAXN] = {NULL};
    
        scanf("%d", &n);
        for(i = 0; i < n; i++) {
            string[i] = (char *)malloc(sizeof(char)*MAXS);
            scanf("%s", string[i]);
        }
        printf("%d
    ", max_len(string, n));
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

    输入样例:

    4
    blue
    yellow
    red
    green

    输出样例:

    6
    

    代码

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

    2.设计思路

      

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

    本题目没有遇到问题

    4.运行结果截图 

    6-2 统计专业人数 (15 分)

    本题要求实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:

    struct ListNode {
        char code[8];
        struct ListNode *next;
    };

    这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02。

    函数接口定义:

    int countcs( struct ListNode *head );

    其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct ListNode {
        char code[8];
        struct ListNode *next;
    };
    
    struct ListNode *createlist(); /*裁判实现,细节不表*/
    int countcs( struct ListNode *head );
    
    int main()
    {
        struct ListNode  *head;
    
        head = createlist();
        printf("%d
    ", countcs(head));
    	
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

    输入样例:

    1021202
    2022310
    8102134
    1030912
    3110203
    4021205
    #

    输出样例:

    3
    

     代码

    int countcs( struct ListNode *head )
    {
        int num = 0;
        struct ListNode  *p = head;
        while(p != NULL)
        {
            if(p->code[1] == '0' && p->code[2] == '2')
                num++;
            p = p->next;
        }
        return num;
    }
    

      

    2.设计思路

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

    1.答案错误,if语句中的条件写错了,导致结果错误。

    4.运行结果截图 

    6-3 删除单链表偶数节点 (20 分)

    本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中偶数值的结点删除。链表结点定义如下

    struct ListNode {
        int data;
        struct ListNode *next;
    };

    函数接口定义:

    struct ListNode *createlist();
    struct ListNode *deleteeven( struct ListNode *head );

    函数createlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−时表示输入结束,函数应返回指向单链表头结点的指针。

    函数deleteeven将单链表head中偶数值的结点删除,返回结果链表的头指针。

    裁判测试程序样例:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct ListNode {
        int data;
        struct ListNode *next;
    };
    
    struct ListNode *createlist();
    struct ListNode *deleteeven( struct ListNode *head );
    void printlist( struct ListNode *head )
    {
         struct ListNode *p = head;
         while (p) {
               printf("%d ", p->data);
               p = p->next;
         }
         printf("
    ");
    }
    
    int main()
    {
        struct ListNode *head;
    
        head = createlist();
        head = deleteeven(head);
        printlist(head);
    
        return 0;
    }
    
    /* 你的代码将被嵌在这里 */

    输入样例:

    1 2 2 3 4 5 6 7 -1

    输出样例:

    1 3 5 7 
    

     代码

    struct ListNode *createlist()
    {
     struct ListNode *head, *p1, *tail;
     int num;
    
     head=(struct ListNode *)malloc(sizeof(struct ListNode));
     p1=tail=(struct ListNode *)malloc(sizeof(struct ListNode));
    
     p1->next=tail->next=head->next=NULL;
     while(1)
     {
      scanf("%d",&num);
      if(num!=-1)
      {
       p1->data=num;
       
       if(head->next==NULL)
       {
        head->next=p1;
       }
    
       else 
       {
        tail->next=p1;
        tail=p1;
       }
       p1=(struct ListNode *)malloc(sizeof(struct ListNode));
       p1->next=NULL;
      }
    
      else 
      break;
     }
     return head;
    }
    
    struct ListNode *deleteeven(struct ListNode *head)
    {
     struct ListNode *num,*p;
     p=head;
     num=head->next;
     while(num!=NULL)
     {
      if(num->data%2==0)
         {
          p->next=num->next;
      }
      else
      p=p->next;
      num=num->next;
     }
     return head->next;
    }
    

      

    2.设计思路

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

    这次作业的链表在书上看的有些不一样,刚刚做的时候出现了很多次的答案错误,是因为没弄清楚到底是哪个结点解除,结点链接不对导致删除的过多,

    或者是全部都被删除了。

    然后出现最多的是字符指向结点的问题也出现了混乱,慢慢摸索,还是懂了许多。

    4.运行结果截图 

    7-3 ***八皇后问题 (20 分)
     

    在国际象棋中,皇后是最厉害的棋子,可以横走、直走,还可以斜走。棋手马克斯·贝瑟尔 1848 年提出著名的八皇后问题:即在 8 × 8 的棋盘上摆放八个皇后,使其不能互相攻击 —— 即任意两个皇后都不能处于同一行、同一列或同一条斜线上。

    现在我们把棋盘扩展到 n × n 的棋盘上摆放 n 个皇后,请问该怎么摆?请编写程序,输入正整数 n,输出全部摆法(棋盘格子空白处显示句点“.”,皇后处显示字母“Q”,每两格之间空一格)。

    输入格式

    正整数 n (0 < n ≤ 12)

    输出格式

    若问题有解,则输出全部摆法(两种摆法之间空一行),否则输出 None。

    要求:试探的顺序逐行从左往右的顺序进行,请参看输出样例2。

    输入样例1

    3

    输出样例1

    None

    输入样例2

    6

    输出样例2

    . Q . . . .
    . . . Q . .
    . . . . . Q
    Q . . . . .
    . . Q . . .
    . . . . Q .
    
    . . Q . . .
    . . . . . Q
    . Q . . . .
    . . . . Q .
    Q . . . . .
    . . . Q . .
    
    . . . Q . .
    Q . . . . .
    . . . . Q .
    . Q . . . .
    . . . . . Q
    . . Q . . .
    
    . . . . Q .
    . . Q . . .
    Q . . . . .
    . . . . . Q
    . . . Q . .
    . Q . . . .
    

    代码

    #include<stdio.h>
    
    void queen(int i,int j);    //递归函数, 
    int check(int i,int j);     //判断是否会遇到其他皇后 的函数 
    
    char chess[13][13];         //最大棋盘 
    int a,b,n,sum=0;            //sum记录能摆放的方法次数 
    
    int main(void){
        
        scanf("%d",&n);
        queen(0,0);
        if(sum==0){
            printf("None"); 
        }
        return 0;
    
    }
    
    void queen(int i,int j){
        
        if(j>=n){
            return ; 
        }
        if(check(i,j)==1){     //如果能放
            chess[i][j]='Q';   //放皇后
            if(i==n-1){        //如果是最后一行,记录情况
                sum++;         //记录符合的次数
                if(sum!=1)      //如果有新方法,就在新方法前加一个换行,使得最后一种方法后面没有换行
                    printf("
    ");
            
                for(a=0;a<n;a++){    
                    for(b=0;b<n;b++){
                        if(chess[a][b]!='Q'){
                            if(b!=n-1)
                                printf(". ");
                            else
                                printf(".");
                        }
                        if(chess[a][b]=='Q'){
                            if(b!=n-1)
                                printf("Q ");
                            else
                                printf("Q");
                        }
                    }
                    printf("
    ");
                }
            }
            else{
                queen(i+1,0); //不是最后一行就分析下一行
            }
        }
        chess[i][j]='.';        //如果此位置不能放,就置空(0),判断旁边的格子。
                               //如果此位置能放,走到这里就意味着上面的代码全部执行了,把皇后拿走(置零),再讨论其他情况,拿旁边位置试探。
        queen(i,j+1);
    }
    
    int check(int i,int j){
        int k;
        for(k=0;k<n;k++){
            if(chess[i][k]=='Q')
                return 0;                   //0=不能放
        }
        for(k=0;k<n;k++){
            if(chess[k][j]=='Q')
                return 0; 
        }
        for(k=-n;k<=n;k++){                 //两对角线
            if(i+k>=0&&i+k<n&&j+k>=0&&j+k<n)//从左上到右下对角线
                if(chess[i+k][j+k]=='Q') return 0;
            if(i-k>=0&&i-k<n&&j+k>=0&&j+k<n)//从左下到右上对角线
                if(chess[i-k][j+k]=='Q') return 0;
        }
        return 1;
    }
    

      

    2.设计思路

    思路不对,所以我就没有画流程图了

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

    本题目做错了,到现在为止还是没有调试正确,部分正确和运行超时让我十分苦恼

    4.运行结果截图 

     

     

    学习感悟 

    本周学习的链表实在有难度,结点的链接问题和删除时结点的解除问题和方向问题。今天上课老师讲的很清楚,感觉茅塞顿开。哈哈。

  • 相关阅读:
    移动开发 Native APP、Hybrid APP和Web APP介绍
    urllib与urllib2的学习总结(python2.7.X)
    fiddler及postman讲解
    接口测试基础
    UiAutomator2.0 和1.x 的区别
    adb shell am instrument 命令详解
    GT问题记录
    HDU 2492 Ping pong (树状数组)
    CF 567C Geometric Progression
    CF 545E Paths and Trees
  • 原文地址:https://www.cnblogs.com/hhwcg/p/10884166.html
Copyright © 2011-2022 走看看