2019春第十一週做業


這個做業屬於哪一個課程 C語言程序設計
這個做業的要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3201
我在這個課程的目標是 可以使用遞歸函數進行編程;掌握宏的基本用法;掌握編譯預處理的概念。
這個做業在哪一個具體方面幫助我實現目標 經過讀大佬的博客,上網查資料
參考文獻 http://c.biancheng.net/view/1861.html

一.基礎題

選擇題

7-1 漢諾塔問題* (10 分)

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

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

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

輸出格式數組

移動漢諾塔的步驟
每行顯示一步操做,具體格式爲:
盤片號: 起始柱 -> 目的柱
其中盤片號從 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 hao (int e,char a,char b,char c);
int main(){
    int n;char a,b,c,op;
    scanf("%d%c",&n,&op);
    scanf("%c %c %c",&a,&b,&c); 
    hao(n,a,b,c);
    return 0;
}
void hao (int e,char a,char b,char c)
{
    if(e==1)
    printf("%d: %c -> %c\n",e,a,b);
    else{
        hao(e-1,a,c,b);
        printf("%d: %c -> %c\n",e,a,b);
        hao(e-1,c,b,a);
    }
}

2)設計思路

3)本題調試過稱中遇到的問題及解決辦法

這題是照着書上的例題寫的,沒有遇到什麼大問題,就是答案格式錯誤。
this

4)運行截圖

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

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

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)實驗代碼

本題不會寫,看了大佬的代碼(http://www.javashuo.com/article/p-pkeqaqml-cg.html),但裏面好多知識沒有學過,大部分都看不懂,無從下手。指針

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)實驗代碼

本題也不會作,參考大佬代碼(https://bbs.csdn.net/topics/380074069),用C++運行,跟PTA答案徹底不同,徹底懵。

二.預習題

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

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

1.數組指針
數組指針即指向數組的指針,定義數組時,要給出數組名和數組長度,數組名能夠認爲是一個指針,它指向數組的第 0 個元素。在C語言中,咱們將第 0 個元素的地址稱爲數組的首地址。以int arr[] = { 99, 15, 100, 888, 252 }爲例,定義指針int p;令p=arr;則p就是數組指針。因此數組指針也稱指向一維數組的指針,亦稱行指針。
2.指針數組
指針數組是多個指針變量,以數組形式存在內存當中,佔有多個指針的存儲空間。如定義 int
p[n];[]優先級高,先與p結合成爲一個數組,再由int說明這是一個整型指針數組,它有n個指針類型的數組元素,p[0]、p[1]、p[2]...p[n-1],並且它們分別是指針變量只能用來存放變量地址;不能直接賦值,int z=3;p[0]=z;是錯誤的,改爲p[0]=&z;
3.指針函數
int
fun(int x,int y);就是一個指針函數。其返回值是一個 int 類型的指針,是一個地址;不能直接返回數值。因此的指針函數也沒什麼特別的,和普通函數對比不過就是其返回了一個指針(即地址值)而已。在調用指針函數時,須要一個同類型的指針來接收其函數的返回值。
4.函數指針
函數指針就是指向函數的指針。聲明格式:類型說明符 (函數名) (參數);如int (fun)(int x,int y);。
函數指針是須要把一個函數的地址賦值給它,如

int add(int x,int y){
    return x+y;
}
fun = &add;
fun = add;

取地址運算符&不是必需的,由於一個函數標識符就表示了它的地址,
若是是函數調用,還必須包含一個圓括號括起來的參數表,

x = (*fun)();
int z=(*fun)(1,2);
或
x = fun();
int z=fun(1,2);

兩種方式都可,其中第二種看上去和普通的函數調用沒啥區別,若是能夠的話,建議使用第一種,由於能夠清楚的指明這是經過指針的方式來調用函數。
4.二級指針
二級指針就是指向指針的指針,int**q 能夠把它分爲兩部分看,即 int* 和 (q),後面 (q) 中的「」表示 q 是一個指針變量,前面的 int 表示指針變量 q 只能存放 int* 型變量的地址。根據指向內容的不一樣,二級指針又分爲指向指針變量的指針和指向數組的指針。
5.單向鏈表
單向鏈表(單鏈表)是鏈表的一種,其特色是鏈表的連接方向是單向的,對鏈表的訪問要經過順序讀取從頭部開始;鏈表是使用指針進行構造的列表;又稱爲結點列表,由於鏈表是由一個個結點組裝起來的;其中每一個結點都有指針成員變量指向列表中的下一個結點;
列表是由結點構成,head指針指向第一個成爲表頭結點,而終止於最後一個指向NULL的指針。
圖解示例:(https://www.jianshu.com/p/8b6f4dbe497e

三.學習感悟

這周題目很難,除了選擇題和編程題第一題還好作一點之外,其他的題目連答案都看不太懂,結對編程什麼都沒討論出來,主要是思路都沒有,大佬的答案有些人的代碼裏的有好多代碼沒學過,看不懂,有些人的太複雜,也看不懂。這周學過的遞歸函數雖然看懂了,理解了,可能理解的還不太透徹吧,就是不知道應該在什麼題目裏用,感受是這種類型的題目做得太少了吧。

四.結對編程感想

過程:都在想如何解決第二個編程題,而後查找大佬的答案,但都看不太明白。
感想:感受沒有什麼收穫,煩躁了一個晚自習。

學習進度條


周/日期 這周所花的時間 代碼行 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 6h 39 一維數組的定義和引用及初始化 字符數組和整型數組的區別
3/4-3/10 12h 47 指針的定義及運用;文件的讀取、寫入, 處理和開關;文件的打開方. 文件的分類,什麼是文本文件, 什麼是二進制文件;字符數組的讀取和寫入
3/11-3/17 6h 57 二維數組的定義及應用 二維數組的行和列的嵌套循環輸入和輸出
3/18-3/24 12h 98 選擇排序法、冒泡排序法和二分查找法 不清楚選擇排序法和冒泡排序法的區別
3/25-3/31 20h 88 字符數組和字符串的區別,字符串的輸入輸出方式和格式,二維數組更高級的運用。 不清楚指針在程序中的做用
4/1-4/7 12h 70 變量、內存單元和地址之間的關係;指針變量的定義及初始化,指針變量的基本運算,指針、數組和地址間的關係 二分法查找法不太明白
4/8-4/14 11h 99 掌握數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,理解指針和數組能夠實現相同的操做 好像忘記了,可能沒有
4/15-4/21 12h 132 掌握經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 各個動態內存分配函數的區別仍是不太清楚
4/22-4/28 12h 133 合理定義結構,使用結構變量與結構數組編程,掌握結構指針的操做,並應用於函數傳遞 解遞歸式的三種方法不太理解
4/29-5/4 7h 0 結構數組及結構指針;如何提升本身與他人的競爭力?如何有效的記憶和學習?如何提問? 各個動態內存分配函數的使用仍是不太清楚
5/5-5/11 36h 26 可以使用遞歸函數進行編程;掌握宏的基本用法;掌握編譯預處理的概念 如何熟練使用遞歸函數

六.表格和折線圖


時間 代碼行數 博客字數
第一週 39 1754
第二週 47 2087
第三週 57 1993
第四周 98 2145
第五週 88 2472
第六週 70 2514
第七週 99 3127
第八週 132 3313
第九周 133 2897
第十一週 26 3026

相關文章
相關標籤/搜索