第十一週做業

這個做業屬於哪一個課程 C語言程序設計ll
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/3202
我在這個課程的目標是 瞭解並學習遞歸函數以及宏定義的知識
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我瞭解和學習如何使用遞歸函數
參考文獻 書本第十章的知識以及百度查閱的知識

1、基礎題

選擇題

編程題

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

漢諾塔是一個源於印度古老傳說的益智玩具。聽說大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤,大梵天命令僧侶把圓盤移到另外一根柱子上,而且規定:在小圓盤上不能放大圓盤,每次只能移動一個圓盤。當全部圓盤都移到另外一根柱子上時,世界就會毀滅。
請編寫程序,輸入漢諾塔圓片的數量,輸出移動漢諾塔的步驟。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 d,e,f;
    scanf("%d\n",&n);
    scanf("%c %c %c",&d,&e,&f);
    hanio(n,d,e,f);

    
    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.解題過程當中遇到的問題及解決辦法

問題:本題是按照書上例題來改寫的,原本沒有定義和輸入d,e,f的,直接所有按照書上來寫,就報錯
解決方法:定義和輸入d,e,f,不直接調用字符‘a',’b',‘c'就能夠了數組

4.運行結果截圖

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

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

輸入格式:

輸入首先在第一行給出不超過 10 的正整數 N,隨後 N 行,每行給出一句不超過 1000 個字符的、以回車結尾的用戶的對話,對話爲非空字符串,僅包括字母、數字、空格、可見的半角標點符號。app

輸出格式:

按題面要求輸出,每一個 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

本題思路:本題看了一下題目,就是要把用戶說的改成AI回答的,具體的方法真的不會作,看了大佬的代碼也看不懂。

http://www.javashuo.com/article/p-pkeqaqml-cg.html學習

7-3 ***八皇后問題 (20 分)
在國際象棋中,皇后是最厲害的棋子,能夠橫走、直走,還能夠斜走。棋手馬克斯·貝瑟爾 1848 年提出著名的八皇后問題:即在 8 × 8 的棋盤上擺放八個皇后,使其不能互相攻擊 —— 即任意兩個皇后都不能處於同一行、同一列或同一條斜線上。
如今咱們把棋盤擴展到 n × n 的棋盤上擺放 n 個皇后,請問該怎麼擺?請編寫程序,輸入正整數 n,輸出所有擺法(棋盤格子空白處顯示句點「.」,皇后處顯示字母「Q」,每兩格之間空一格)。

輸入格式

正整數 n (0 < n ≤ 12)this

輸出格式

若問題有解,則輸出所有擺法(兩種擺法之間空一行),不然輸出 None。
要求:試探的順序逐行從左往右的順序進行,請參看輸出樣例2。.net

輸入樣例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 . . . .

本題思路:這道題目看不懂看不懂。

2、預習做業

請舉實例解釋如下幾個概念:數組指針,指針數組,指針函數,函數指針,二級指針,單向鏈表。請用本身的理解回答。若是有引用他人的文字,請必定要標出出處(使用Markdown的連接方式)。

一、數組指針

數組指針,指的是數組名的指針,即數組首元素地址的指針,便是指向數組的指針,數組指針只是一個指針變量,它佔有內存中一個指針的存儲空間
例:

int a[10][20];
int (*p)[10];

int (*p)[10]該語句是定義一個數組指針,指向含10個元素的一維數組。

二、指針數組

指針數組中的每個元素均爲指針,即有諸形如「ptr_array[i]」的指針。因爲數組元素均爲指針,所以ptr_array[i]是指第i+1個元素的指針,指針數組是多個指針變量,以數組形式存在內存當中,佔有多個指針的存儲空間
例:

int *p[10];
int a[10][20];

int *p[10] 表示一個一維數組內存放着三個指針變量,分別是p[0]、p[1]、p[2]一直到p[9]

三、指針函數

首先它是一個函數,只不過這個函數的返回值是一個地址值。函數返回值必須用同類型的指針變量來接受,也就是說,指針函數必定有「函數返回值」,並且,在主調函數中,函數返回值必須賦給同類型的指針變量
例:

float *fun();
float *p;
p = fun(a);

四、函數指針

函數指針是指向函數的指針變量。 所以「函數指針」自己首先應是指針變量,只不過該指針變量指向函數,每個函數都有一個入口地址,該入口地址就是函數指針所指向的地址,函數指針有兩個用途:調用函數和作函數的參數。
例:

// fuction_pointer.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

#include <string>

int addInt(int n, int m) {
    return n + m;
}
typedef int(*FunctionPointer)(int, int);/*這樣就定義了一種指針類型*/

int add2to3(int(*functionPtr)(int, int)) {
    return (*functionPtr)(2, 3);
}
int main() {
    FunctionPointer fp = &addInt;
    int sum = fp(3, 2);
    std::cout<<sum<< std::endl;

    int sum2=add2to3(fp);
    std::cout << sum2 << std::endl;


    system("pause");
    return 0;
}

參考:https://blog.csdn.net/guchuanhang/article/details/53693084

五、二級指針

A(即B的地址)是指向指針的指針,稱爲二級指針,用於存放二級指針的變量稱爲二級指針變量.根據B的不一樣狀況,二級指針又分爲指向指針變量的指針和指向數組的指針。
例:

使用二級指針,無需申請內存空間,由於在函數內直接改變形參的指向就能夠改變實參的指向, 指向的內存空間,只須要在函數內部申請便可(棧空間不可,由於棧空間用完即被釋放,沒法返回出來,可使用動態內存分配)。

參考:https://blog.csdn.net/zhihuoqian9683/article/details/79140600

六、單向鏈表

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

struct Node {
       int id;
       int score;
       struct Node *next;   //此處*next表示尾巴 
 }*list_head;//設list_head,爲全局變量的指針

參考:https://blog.csdn.net/sinat_41657218/article/details/79535130

3、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 2天 39 初次學習數組的用法 關於數組的一些具體的用法
3/4-3/10 2天 35 編寫程序來處理文件數據 指針的具體用法和fscanf類型函數的理解
3/11-3/17 1天 59 第一題:編寫程序處理文件數據 指針的具體用法
3/11-3/17 2天 51 第二題:用二維數組知識編寫程序 二維數組的知識點不熟悉
3/18-3/24 2天 111 二維數組、選擇法排序和冒泡法排序 選擇法排序和冒泡法排序的區別
3/25-3/31 2天 78 判斷迴文,字符數組和使用字符串編程 使用字符串編程時的一些函數的用法
4/1-4/7 3天 102 指針的基本運算,數組和指針的結合 對於數組仍是不熟悉
4/8-4/14 3天 96 冒泡排序,指針、數組和地址間的關係 指針和數組的關係和應用不太會,容易錯
4/15-4/21 3天 129 經常使用的字符串處理函數和用指針實現內存動態分配 關於指針內存動態分配還不太熟悉
4/22-4/28 3天 86 瞭解和學習結構的概念與定義,結構變量的使用以及結構數組和指針的使用 結構指針不太會,多是沒用慣
4/29-5/5 1天 ---- 怎樣花兩年時間面試一我的;如何有效地記憶與學習;如何提問 ----
5/6-5/12 2天 25 如何使用遞歸函數以及學習宏定義的知識 有挺多地方都不太懂,此次的做業很難,不會寫

4、學習感悟

這一週主要了解並學習了函數與程序結構,主要學習了遞歸函數和宏定義的知識,但因爲上課就沒怎麼聽懂,本身也看了一會書以後就只寫了選擇題和編程題第一題,仍是參考書上例題寫的,這周做業真的很難,真的不會作,不過仍是得繼續加油的吧,不少不懂的知識要去請教、百度查資料。

5、結對編程感悟

這周沒有結對編程,題目太難了,實在是無能爲力,搜個百度也看不懂人家寫的代碼,咱們都不會作,因此好像也沒有啥能夠討論的。

6、表格、折線圖

時間 代碼行數 博客字數
第一週 39 798
第二週 35 923
第三週 110 1071
第四周 111 1713
第五週 78 1878
第六週 102 2991
第七週 96 2618
第八週 129 3011
第九周 86 3598
第十週 ---- 3456
第十一週 25 3468

相關文章
相關標籤/搜索