這個做業屬於那個課程 | 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
實驗流程圖:設計
以上圖片來自新浪微博。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行 | 函數結構,遞歸函數 | 感受本身越學越懵 |
學習進度條: