第十一週做業

本週做業頭

這個做業屬於那個課程 C語言程序設計II
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/3202
我在這個課程的目標是 學會使用遞歸函數,並瞭解宏定義的相關知識
這個做業在那個具體方面幫助我實現目標 在做業中要用遞歸函數解決問題
參考文獻 C語言程序設計書

選擇題

編程題

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

實驗代碼:this

#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);
        }
}

實驗結果截圖:spa

實驗流程圖:設計

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

以上圖片來自新浪微博。3d

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

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

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

這個項目太大細節太多,思路難以用語言描述

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

毫無思路

預習做業

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

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

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

數組指針:指的是數組名的指針,即數組首元素地址的指針。便是指向數組的指針。例:int (*p)[10]; p即爲指向數組的指針,又稱數組指針。

#include<stdio.h>
int main()
{
int a[3][3]={
    {1,2,3},
    {4,5,6},
    {7,8,9}
};
int (*p)[3]=a; 

printf("a[1][2] is =%d\n",a[1][2]); 
printf("p5=%d\n",*(*p+5)); 
printf("p=%d\n",**p);              

printf("p[0]=%d\n",*p[0]);
printf("p[1]=%d\n",*p[1]);
printf("p[2]=%d\n",*p[2]); 
printf("ptr[0][1]=%d\n",p[0][1]);
 
return 0;

}

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

#include<stdio.h>
#include<string.h>
int main(void)
{
   int i;
   char*color[5] = {"red","blue","yellow","green","black"};
   char str[20];
   printf("Input a color:");
   scanf("%s",str);
 for(i=0;i<5;i++)
     if(strcmp(str,color[i])==0)
   break;
 if(i<5)
  printf("position:%d\n",i+1);
else
  printf("Not Found\n");
  return 0;

函數指針:指向函數的指針變量爲函數指針

char (*pFun)(int); 
char glFun(int a){ return;} 
void main() 
{ 
    pFun = glFun; 
    (*pFun)(2); 
}

指針函數

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

#include <iostream>  
 using namespace std;  
int *GetNum(int x); 
void main(void)  
 {  
cout<<"===============start================"<<endl;  
int num;  
cout<<"Please enter the number between 0 and 6: ";  
cin>>num;  
cout<<"result is:"<<*GetNum(num)<<endl;    
}  
int *GetNum(int x) {  
static int num[]={0,1,2,3,4,5,6};  
return &num[x]; 
 }

二級指針:首先任何值都有地址 ,一級指針的值雖然是地址,但這個地址作爲一個值亦須要空間來存放,是空間就具備地址 ,
這就是存放地址這一值的空間所具備的地址,二級指針就是爲了獲取這個地址

#include<iostream>
using namespace std;
int a= 10;
int b = 100;
int *q;

void func(int **p)
{
    cout<<"func:&p="<<&p<<",p="<<p<<endl;
    *p = &b;  //3
    cout<<"func:&p="<<&p<<",p="<<p<<endl;
}
int main()
{
    cout<<"&a="<<&a<<",&b="<<&b<<",&q="<<&q<<endl;
    q = &a;
    cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;
    func(&q); 
    cout<<"*q="<<*q<<",q="<<q<<",&q="<<&q<<endl;
    system("pause");

    return 0;
}

單向鏈表(單鏈表)是鏈表的一種,其特色是鏈表的連接方向是單向的,對鏈表的訪問要經過順序讀取從頭部開始;鏈表是使用指針進行構造的列表;又稱爲結點列表,由於鏈表是由一個個結點組裝起來的;其中每一個結點都有指針成員變量指向列表中的下一個結點;
列表是由結點構成,head指針指向第一個成爲表頭結點,而終止於最後一個指向NULL的指針。
出處:https://baike.baidu.com/item/%E5%8D%95%E5%90%91%E9%93%BE%E8%A1%A8/8671935?fr=aladdin

學習進度:

周/日期 這周所花的時間 代碼行 學到的知識點簡介 目前比較迷惑的問題
3/3-3/9 7h 59 文件的處理以及對於數據的處理 對於指針的不熟悉
3/10-3/15 8h 128 文件的處理以及對於數據的處理 二維數組的運用
3/16-3/22 10h 176 選擇排序及其餘二維數組利用 知識點中的冒泡排序
3/23-3/29 7h 82 判斷迴文,字符串,二維字符數組 英語單詞排序那題還有一點點知識點沒找好
3/30-4/5 6h 35 學習了指針,以及一些函數的定義返回 對指針的用法有何意義不是很懂
4/6-4/12 11h 187 數組與指針的集合運用 對於一些新函數的使用,及對指針目標的選擇
4/13-4/21 15h 191 動態內存分配 內存的理解
4/22-4/27 14h 215 瞭解和學習結構的概念與定義,結構變量的使用以及結構數組和指針的使用 結構指針
4/28-5/5 三天 怎樣花兩年時間面試一我的;如何有效地記憶與學習;如何提問 讀這麼多文字真的頭痛
5/6-5/10 3小時 21行 函數結構,遞歸函數 感受本身越學越懵

學習進度條:

相關文章
相關標籤/搜索