這個作業屬于那個課程 | C語言程序設計II |
這個作業要求在哪里 | https://edu.cnblogs.com/campus/zswxy/computer-scienceclass4-2018/homework/3203 |
我在這個課程的目標是 | 理解與使用遞歸函數。 |
參考文獻 | ? |
基礎題
2-1
宏定義“#define DIV(a, b) a/b”,經DIV(x + 5, y - 5) 引用,替換展開后是(A)。?(1分)
A.???? x + 5 / y - 5
B.???? (x + 5 / y – 5)
C.???? (x + 5) / (y - 5)
D.???? (x + 5) / (y - 5);
2-2
定義帶參數的宏“#define JH(a,b,t) t = a; a = b; b = t”,對兩個參數a、b的值進行交換,下列表述中正確的是(B)。?(1分)
A.??? 不定義參數a和b將導致編譯錯誤
B.??? 不定義參數a、b、t將導致編譯錯誤
C.??? 不定義參數t將導致運行錯誤
D.??? 不需要定義參數a、b、t類型
2-3
如果所有的變量按照下面的程序進行定義和聲明,那么在main()函數中所有可用的變量為 (C)。?(2分)
void fun(int x)
{?
??? static int y;
??? ……
??? return;
}
int z;
void main( )
{??
??? int a,b;
??? fun(a);
??? ……
}
A.??? x,y
B.??? x,y,z
C.??? a,b,z
D.??? a,b,x,y,z
2-4
如果一個變量在整個程序運行期間都存在,但是僅在說明它的函數內是可見的,這個變量的存儲類型應該被說明為( A )。?(1分)
A.??? 靜態變量
B.??? 動態變量
C.??? 外部變量
D.??? 內部變量
2-5
下面說法中正確的是(C)。?(1分)
A.??? 若全局變量僅在單個C文件中訪問,則可以將這個變量修改為靜態全局變量,以降低模塊間的耦合度
B.??? 若全局變量僅由單個函數訪問,則可以將這個變量改為該函數的靜態局部變量,以降低模塊間的耦合度
C.??? 設計和使用訪問動態全局變量、靜態全局變量、靜態局部變量的函數時,需要考慮變量生命周期問題
D.??? 靜態全局變量使用過多,可那會導致動態存儲區(堆棧)溢出
2-6
凡是函數中未指定存儲類別的局部變量,其隱含的存儲類型為(A )。?(1分)
A.??? 自動(auto)
B.??? 靜態(static)
C.??? 外部(extern)
D.??? 寄存器(register)
2-7
在一個C源程序文件中,若要定義一個只允許本源文件中所有函數使用的全局變量,則該變量需要使用的存儲類別是 ( D )。?(1分)
A.??? extern
B.??? register
C.??? auto
D.??? static
2-8
將一個函數說明為static后,該函數將 ( B )。(1分)
A.???? 既能被同一源文件中的函數調用,也能被其他源文件中的函數調用
B.???? 只能被同一源文件中的函數調用,不能被其他源文件中的函數調用
C.???? 只能被其他源文件中的函數調用,不能被同一源文件中的函數調用
D.???? 既不能被同一源文件中的函數調用,也不能被其他源文件中的函數調用
?
7-1?漢諾塔問題*?(10?分)
漢諾塔是一個源于印度古老傳說的益智玩具。據說大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤,大梵天命令僧侶把圓盤移到另一根柱子上,并且規定:在小圓盤上不能放大圓盤,每次只能移動一個圓盤。當所有圓盤都移到另一根柱子上時,世界就會毀滅。請編寫程序,輸入漢諾塔圓片的數量,輸出移動漢諾塔的步驟。
輸入格式
圓盤數 起始柱 目的柱 過度柱
輸出格式
移動漢諾塔的步驟 每行顯示一步操作,具體格式為: 盤片號: 起始柱 -> 目的柱 其中盤片號從 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
代碼
#include<stdio.h> void hanio (int n,char a,char b,char c); int main (void) {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?估值一億的AI核心代碼?(20?分)
本題要求你實現一個稍微更值錢一點的 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
代碼
#include<stdio.h> int main (void) {int n,i,j=0,str;char sting[1000];scanf("%d\n",&n);for(i=1;i<=n;i++)gets(string);puts(string);pritnf("AI: ");
思路
這個題不是很會做,只能寫出部分解。輸出原文,換大小寫的,換問號為感嘆號,輸出AI:
錯誤截圖
結果截圖
?
挑戰作業
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 (*arr)[10];//指向int[10]的指針
? ? ? ?指針數組:是一個存放指針的數組。
int *arr[];//[]優先級高,所以arr首先是一個數組,里面存放的是一個個指針 int** arr[];//數組中放入二級指針
? ? ? ?指針函數:我們知道能保存地址的是指針;那么問題就轉化為了哪個是指針的問題?同數組指針一樣,我們考慮優先級的問題:pfun1先和*結合,說明pfun1是指針,指針指向的是一個函數,指向的函數無參數,返回值類型為void。所以pfun1可以保存函數地址。而“void *pfun2();”是一個函數聲明,返回值為void*類型。
? ? ? ?函數指針:類似于指針數組,要把函數的地址存到一個數組中,那這個數組就叫函數指針數組
int (*parr1[10]])();//parr1先與[]結合,說明它是一個數組,數組的內容是 int (*)() 類型的函數指針。
int *parr2[10]();//parr2先與*結合,說明它是一個指針
int (*)() parr3[10];//沒有這種定義方式,是錯誤的
? ? ? ?二級指針:帶命令行參數的main函數要用到二級指針
int main(int argc, char **agrv)
? ? ? ?單向鏈表:單鏈表)是鏈表的一種,其特點是鏈表的鏈接方向是單向的,對鏈表的訪問要通過順序讀取從頭部開始。
來源(https://blog.csdn.net/weixin_40417029/article/details/78580080)
? ? ? ?(https://blog.csdn.net/u011308691/article/details/16809235)
?
學習進度條
時間 | 代碼行數 | 這周所花的時間 | 學到的知識點簡介 |
3/2-3/19 | 35 | 四小時左右 | 通過代碼讀取文件里的數據,并且打印 |
3/9-3/19 | 65 | 三十分鐘 | ? |
3/19-3/22 | 186 | 五個小時左右 | 二維數組的用法加上二分法找元素 |
3/22-3/28 | 31 | 三小時左右 | 字符串的使用 |
4/2-4/9 | 130 | 2小時左右 | 指針的使用 |
4/15-4/19 | 200 | 2天 | 指針內存的動態分配,不是很清楚使用動態分配 |
4/22-4/27 | 150 | 3小時 | 對結構體的使用熟悉 |
5/6-5/9 ????????????? | 100 | 2小時 | 遞歸函數運行過程 |
?
折線圖
學習感悟
感覺題目好難,這次作業也讓我了解還有很多東西需要去學習,對算法的知識了解還是太少