2019春第十一週做業

這個做業屬於哪一個課程 C語言程序設計II
這個做業要求在哪裏 2019年春季學期第十一週做業
我在這個課程的目標是 我但願可以經過學習C語言的知識,編寫程序
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我知道了對相對複雜的問題,合理定義程序的多函數結構;可以使用遞歸函數進行編程;掌握宏的基本用法;掌握編譯預處理的概念
參考文獻 【基礎算法】回溯法與八皇后問題

1、本週完成的做業

題目1.

7-1 漢諾塔問題* (10 分)
漢諾塔是一個源於印度古老傳說的益智玩具。聽說大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤,大梵天命令僧侶把圓盤移到另外一根柱子上,而且規定:在小圓盤上不能放大圓盤,每次只能移動一個圓盤。當全部圓盤都移到另外一根柱子上時,世界就會毀滅。html

請編寫程序,輸入漢諾塔圓片的數量,輸出移動漢諾塔的步驟。ios

輸入格式算法

圓盤數 起始柱 目的柱 過分柱

輸出格式編程

移動漢諾塔的步驟
每行顯示一步操做,具體格式爲:
盤片號: 起始柱 -> 目的柱
其中盤片號從 1 開始由小到大順序編號。

輸入樣例數組

3
a c b

輸出樣例函數

1: a -> c
2: a -> b
1: c -> b
3: a -> c
1: b -> a
2: b -> c
1: a -> c

1).實驗代碼

#include<stdio.h>
void hanio(int n, char a, char b, char c);
int main()
{
    int n;
    char a, b, c; 

    scanf("%d\n", &n);
    scanf("%c %c %c", &a, &b, &c);
    
    hanio(n, a, b, c);

    return 0;
}

void hanio(int n, char a, char b, char c)
{
    if(n == 1){
        printf("%d: %c -> %c\n", n, a, b);
    }
    else
    {
        hanio(n-1, a, c, b);

        printf("%d: %c -> %c\n", n, a, b);
        hanio(n-1, c, b, a);
    }
}

2). 設計思路

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

遇到的問題:答案錯誤,輸出時不知道該怎麼輸出
解決的辦法:搭檔告訴了我要將最後輸出的部分n改成n-1.

4).運行結果截圖

題目2.

7-2 估值一億的AI核心代碼 (20 分)
學習

本題要求你實現一個稍微更值錢一點的 AI 英文問答程序,規則是:this

不管用戶說什麼,首先把對方說的話在一行中原樣打印出來;
消除原文中多餘空格:把相鄰單詞間的多個空格換成 1 個空格,把行首尾的空格所有刪掉,把標點符號前面的空格刪掉;
把原文中全部大寫英文字母變成小寫,除了 I;
把原文中全部獨立的 can you、could you 對應地換成 I can、I could—— 這裏「獨立」是指被空格或標點符號分隔開的單詞;
把原文中全部獨立的 I 和 me 換成 you;
把原文中全部的問號 ? 換成驚歎號 !;
在一行中輸出替換後的句子做爲 AI 的回答。
輸入格式:
輸入首先在第一行給出不超過 10 的正整數 N,隨後 N 行,每行給出一句不超過 1000 個字符的、以回車結尾的用戶的對話,對話爲非空字符串,僅包括字母、數字、空格、可見的半角標點符號。spa

輸出格式:
按題面要求輸出,每一個 AI 的回答前要加上 AI: 和一個空格。設計

輸入樣例:

6
Hello ?
 Good to chat   with you
can   you speak Chinese?
Really?
Could you show me 5
What Is this prime? I,don 't know

輸出樣例:

Hello ?
AI: hello!
 Good to chat   with you
AI: good to chat with you
can   you speak Chinese?
AI: I can speak chinese!
Really?
AI: really!
Could you show me 5
AI: I could show you 5
What Is this prime? I,don 't know
AI: what Is this prime! you,don't know

1). 設計思路

看了別的大佬的博客後有了本身的一點思路,可是仍是沒有作出來
是我太菜了😥

題目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的位置。因此又失敗了。。。
參考博文:【基礎算法】回溯法與八皇后問題

挑戰題

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

該題找了部分資料,但看不太懂。。。

總結來講就是我好菜😭

預習做業

第十二週的教學內容是:第十一章 指針進階

請你們查閱資料,思考以下問題:

請舉實例解釋如下幾個概念:數組指針,指針數組,指針函數,函數指針,二級指針,單向鏈表。(無實例不給分)

請用本身的理解回答。若是有引用他人的文字,請必定要標出出處(使用Markdown的連接方式)。

數組指針:就像琛姐上課說的,看這些名詞的時候不論它是什麼都只要把重點放在最後兩個字上,因此它的本質爲指針。

例:

int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p=(int(*)[4])a;
for(int i=0;i<3;i++)
{
    for(int j=0;j<4;j++) printf("%d",p[i][j]); //或者 *(*(p+i)+j) 或者 *(p[i]+j)
    printf("\n");
}

引用自數組指針百度百科

指針數組:其本質爲數組,適用於多個字符或字符串的存儲

例:

char char *z[6] = {"a","b","c","d","e","f"};

指針函數:本質爲函數,返回值爲指針

例:

int *hanshu(int, int);

hanshu被定義後以整型的形式返回

函數指針:本質是指針,是指向函數的指針,相似於指向變量,數組的指針。

例:

#include<iostream>
using namespace std;
int main()
{
float*find(float(*p)[4],int m);//查詢序號爲m的學生的四門課程的成績
float score[][4]={{50,51,52,55},{70,70,40,80},{77,99,88,67}};//定義成績數組,第一維能夠爲變量
float*pf=NULL;//定義一個指針時必定要初始化
int i,m;
cout<<"請輸入您想查詢的學生的序號:";
cin>>m;
pf=find(score,m);//返回爲一維數組指針,指向一個學生成績
for(i=0;i<4;i++)
cout<<*(pf+i)<<"";
cout<<endl;
return 0;
}
float *find(float(*p)[4],int m)
{
float *pf=NULL;
pf=*(p+m);//p是指向二維數組的指針,加*取一維數組的指針
return pf;
}

學生學號從0號算起,函數find()被定義爲指針函數,其形參pointer是指針指向包含4個元素的一維數組的指針變量。pf是一個指針變量,它指向浮點型變量。main()函數中調用find()函數,將score數組的首地址傳給pointer.

引用自函數指針百度百科

二級指針:指向另外一個指針的指針

例:

int a=1234;
int *p=a;
int **pq=&p;

pq指向p,就稱爲二級指針

單向鏈表:單向鏈表(單鏈表)是鏈表的一種,其特色是鏈表的連接方向是單向的,對鏈表的訪問要經過順序讀取從頭部開始;鏈表是使用指針進行構造的列表;又稱爲結點列表,由於鏈表是由一個個結點組裝起來的;其中每一個結點都有指針成員變量指向列表中的下一個結點;

列表是由結點構成,head指針指向第一個成爲表頭結點,而終止於最後一個指向NULL的指針。

例:

struct stu{
  int num;
  char name[20];
  int score;
  struct stu*next
};

設置不一樣的結點

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行 掌握宏的基本用法;掌握編譯預處理的概念 本週做業

3、學習感悟

心得:

(1) 學習內容:
1. 對相對複雜的問題,合理定義程序的多函數結構;
2. 可以使用遞歸函數進行編程;
3. 掌握宏的基本用法;掌握編譯預處理的概念
收穫:
(2) 難點:本週題目太難了
解決的方法:在網上找大佬寫過的相似的題目,學習他們的思路

4、結對編程

1.結對編程過程

在教室,新的結對隊友,在各自作完選擇題後就開始結對編程了,在書上找到相似的題目,可是咱們都在最後輸出的地方卡住了,最後是隊友告訴我應該將n改成n-1,纔將問題解決。

2.結對編程的優缺點

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

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

相關文章
相關標籤/搜索