2019春第十二週做業

這個做業屬於哪一個課程 C語言程序設計II
這個做業要求在哪裏 2019年春季學期第十二週做業
我在這個課程的目標是 我但願可以經過學習C語言的知識,編寫程序
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我知道了1)二級指針的概念,以及指針數組的應用;(2)瞭解指針與函數的關係,掌握指針做爲函數返回值;(3)掌握單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷)
參考文獻 《c語言程序設計》,單向鏈表

1、本週完成的做業

基礎題

題目1. 6-1 計算最長的字符串長度 (15 分)

本題要求實現一個函數,用於計算有n個元素的指針數組s中最長的字符串的長度。html

函數接口定義:算法

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\n", max_len(string, n));

    return 0;
}

/* 你的代碼將被嵌在這裏 */

輸入樣例:框架

4
blue
yellow
red
green

輸出樣例:函數

6

1).實驗代碼

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

2). 設計思路

3).本題調試過程碰到問題及解決辦法

本題未遇到問題

4).運行結果截圖

題目2. 6-2 統計專業人數 (15 分)

本題要求實現一個函數,統計學生學號鏈表中專業爲計算機的學生人數。鏈表結點定義以下:學習

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

這裏學生的學號共7位數字,其中第二、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\n", countcs(head));
    
    return 0;
}

/* 你的代碼將被嵌在這裏 */

輸入樣例:

1021202
2022310
8102134
1030912
3110203
4021205
#

輸出樣例:

3

1).實驗代碼

int countcs( struct ListNode *head )
{
    int count = 0;

    while(head)
    {
        if((*head).code[1] == '0' && (*head).code[2] == '2')
           count ++;
         head = head->next;
    }

   return count;
}

2). 設計思路

3).本題調試過程碰到問題及解決辦法

本題未遇到問題

4).運行結果截圖

題目3. 6-3 刪除單鏈表偶數節點 (20 分)

本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中偶數值的結點刪除。鏈表結點定義以下:

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

函數接口定義:

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

函數createlist從標準輸入讀入一系列正整數,按照讀入順序創建單鏈表。當讀到−1時表示輸入結束,函數應返回指向單鏈表頭結點的指針。

函數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("\n");
}

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

1).實驗代碼

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

struct ListNode *deleteeven( struct ListNode *head )
{
    struct ListNode *p , *q;

    while(head != NULL &&  head->data%2==0)
    {
        p = head;
        head = head->next;
        free(p);
    }

    p = head;
    while(p && p->next){
        while(p->next && p->next->data%2==0){
            q = p->next;
            p->next = q->next;
        }
        p = p->next;
    }
    return head;
}

2). 設計思路

3).本題調試過程碰到問題及解決辦法

遇到的問題:部分正確,第一個讀入數據存儲的代碼有問題
解決的辦法:看了大佬的博客發現是本身輸入的時候沒有將p替換

4).運行結果截圖

挑戰題

題目1.

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 . . . .

1). 設計思路

想了好久都沒思路,因此去網上拜讀了一下,找到了一個我以爲最好的辦法(雖然是用C++寫的😂),因此有點看不太懂,但主要的函數看懂了,但和咱們的題目不太同樣,我不會轉換Q的位置。因此又失敗了。。。
參考博文:【基礎算法】回溯法與八皇后問題
在努力理解視頻中

題目2.

7-1 求迷宮最短通道 (20 分)
遞歸求解迷宮最短通道的總步長。輸入一個迷宮,求從入口通向出口的可行路徑中最短的路徑長度。爲簡化問題,迷宮用二維數組 int maze[10][10]來存儲障礙物的分佈,假設迷宮的橫向和縱向尺寸的大小是同樣的,並由程序運行讀入, 若讀入迷宮大小的值是n(3<n<=10),則該迷宮橫向或縱向尺寸都是n,規定迷宮最外面的一圈是障礙物,迷宮的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1表明該位置是障礙物,若maze[i][j] = 0表明該位置是能夠行走的空位(0<=i<=n-1, 0<=j<=n-1)。求從入口maze[1][1]到出口maze[n-2][n-2]能夠走通的路徑上經歷的最短的總步長。要求迷宮中只容許在水平或上下四個方向的空位上行走,走過的位置不能重複走。

輸入格式:
輸入迷宮大小的整數n, 以及n行和n列的二維數組(數組元素1表明障礙物,0表明空位)

輸出格式:
如有可行的通道則輸出一個整數,表明求出的通道的最短步長;若沒有通道則輸出"No solution"

輸入樣例:

10
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 0 1 0 0 0 1 0 1
1 0 0 0 0 1 1 0 0 1
1 0 1 1 1 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 1 0 0 0 1 0 0 1
1 0 1 1 1 0 1 1 0 1
1 1 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1

上述輸入表明的是以下這樣一個迷宮:

其中紅色的小方塊是障礙物,藍色的小方塊是空位,白色的小圓連起來是一條從入口到出口的通道,兩個圓之間表明一個步長。

輸出樣例:

14

還沒太看懂視頻

預習題

從第十三週開始,將進入課程設計階段,請在本次做業中給出:

1.所在小組想要開發的項目的名稱和目標;

2.項目主體功能的描述;

3.現階段已作的準備工做;

4.小組成員名單和進度安排。(課程設計階段:13-17周)

所在小組想要開發的項目的名稱和目標:

項目名稱:2048
項目目標:本組將以算法爲主,研究探討數組和結構體的高階使用方法,並引入更新、更高級的知識和技術,使用更爲美觀和精緻的UI,編寫一個成熟的Windows窗口應用程序。

項目主體功能的描述:

  • 讓相鄰的相等的數字相加
  • 肯定數字移動的方向
  • 將移動方向上無數字的數字移動到邊框
  • 在隨機沒數字的地方產生新的數字

現階段已作的準備工做:

  • 遊戲大綱確立
  • 美術大綱初步討論完成
  • 核心算法實現
  • 數組輸出實現
  • 控制檯版本實現
  • Windows運行窗口實現
  • Windows版本demo實現
  • Windows子窗口控件學習

小組成員名單和進度安排。(課程設計階段:13-17周)

小組成員:

  • 計算機科學與技術1班 李萱 20188387
  • 計算機科學與技術1班 何銘康 20188376 組長
  • 計算機科學與技術2班 伍媛媛 20186892

進度安排:

任務內容 任務說明 任務貢獻度 任務截至日期
遊戲進程 遊戲主體進程的詳細討論,包括詳細的子項 5 2019.5.12
美術大綱 討論遊戲總體美術風格和單塊素材美術風格 5 2019.5.12
素材收集及製做 按照美術大綱,收集或製做所有要求的素材 30 2019.5.25
狀態機實現 根據遊戲進程,實現個狀態之間的無素材轉換 15 2019.5.15
Windows子窗口控件實現 根據遊戲進程、美術大綱,實現個狀態之間無素材子窗口內容 20 2019.5.20
遊戲框架製做 收集前期所有工做成果,寫出遊戲框架 25 2019.6.1
遊戲實例代碼編寫 根據遊戲框架編寫所有所需子代碼 10/子代碼 2019.6.5
遊戲總製做 收集所有代碼,寫出總程序 15 2019.6.7
製做完成項目總結及成果整理 項目總結 3 2019.6.9
項目報告 用於C語言課程設計和應用程序設計比賽 5 2019.6.10
遊戲引擎製做 根據遊戲框架製做,用於創新項目設計比賽申報 15 2019.6.20

2、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
3/2-3/8 20h 300行 數組,指針的大體意義,文件入門 數組串的使用,指針
3/9-3/15 25h 400行 二維數組,文件與數組的結合運用 雙for循環的流程圖(再不上課,光自學感受太艱難了)
3/16-3/22 22h 450行 一維數組,二維數組,幾種數組排序法 字符串使用
3/23-3/29 20h 350行 字符串的定義及其使用 指針的具體使用
3/30-4/5 15h 340行 指針變量的定義,使用,初始化及其基本運算,指針做爲函數參數的做用;使用指針實現函數調用返回多個值 指針在運行時內存的變化
4/6-4/12 13h 400行 數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,指針和數組能夠實現相同的操做,結構體的定義,使用 結構體的具體使用,結構體的流程圖
4/13-4/19 18h 500行 經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 結構體的流程圖
4/20-4/26 13h 400行 根據實際狀況合理定義結構,可以使用結構變量與結構數組進行熟練編程,掌握結構指針的操做,並應用於函數傳遞 遞歸函數
5/3-5/10 10h 300行 掌握宏的基本用法;掌握編譯預處理的概念 本週做業
5/11-5/17 9h 300行 (1)二級指針的概念,以及指針數組的應用;(2)瞭解指針與函數的關係,掌握指針做爲函數返回值;(3)掌握單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷) 單項鍊表的具體使用

3、學習感悟

心得:

(1) 學習內容:
1. 二級指針的概念,以及指針數組的應用;
2.瞭解指針與函數的關係,掌握指針做爲函數返回值;
3.掌握單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷)
收穫:
(2) 難點:單向鏈表的理解與使用
解決的方法:聽了課後理解了單項鍊表的意義,但對於具體的操做仍是不太熟練

4、結對編程

1.結對編程過程

本週的編程自習被用來說遊戲設計的事情了,因此本週沒有具體的結對編程的過程,並且本週做業難度不大,因此代碼由本身獨立完成

2.結對編程的優缺點

優勢:1.能夠將本身知道而搭檔不知道的知識教給搭檔
2.提供不一樣的思路
3. 一塊兒找錯效率更高
缺點: 結對編程的時間不夠

完成做業的消耗時間:9h

相關文章
相關標籤/搜索