這個做業屬於哪一個課程 | C語言程序設計II |
這個做業要求在哪裏 | 2019年春季學期第十二週做業 |
我在這個課程的目標是 | 我但願可以經過學習C語言的知識,編寫程序 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我知道了1)二級指針的概念,以及指針數組的應用;(2)瞭解指針與函數的關係,掌握指針做爲函數返回值;(3)掌握單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷) |
參考文獻 | 《c語言程序設計》,單向鏈表 |
本題要求實現一個函數,用於計算有n個元素的指針數組s中最長的字符串的長度。html
函數接口定義:算法
int max_len( char *s[], int n );
其中n個字符串存儲在s[]中,函數max_len應返回其中最長字符串的長度。編程
裁判測試程序樣例:數組
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); } printf("%d\n", max_len(string, n)); return 0; } /* 你的代碼將被嵌在這裏 */
輸入樣例:框架
4 blue yellow red green
輸出樣例:函數
6
int max_len( char *s[], int n ) { int max = 0; for(int i = 0;i < n;i ++) { if(strlen(s[i])>max) max = strlen(s[i]); } return max; }
本題要求實現一個函數,統計學生學號鏈表中專業爲計算機的學生人數。鏈表結點定義以下:學習
struct ListNode { char code[8]; struct ListNode *next; };
這裏學生的學號共7位數字,其中第二、3位是專業編號。計算機專業的編號爲02。測試
函數接口定義:設計
int countcs( struct ListNode *head );
其中head是用戶傳入的學生學號鏈表的頭指針;函數countcs統計並返回head鏈表中專業爲計算機的學生人數。指針
裁判測試程序樣例:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct ListNode { char code[8]; struct ListNode *next; }; struct ListNode *createlist(); /*裁判實現,細節不表*/ int countcs( struct ListNode *head ); int main() { struct ListNode *head; head = createlist(); printf("%d\n", countcs(head)); return 0; } /* 你的代碼將被嵌在這裏 */
輸入樣例:
1021202 2022310 8102134 1030912 3110203 4021205 #
輸出樣例:
3
int countcs( struct ListNode *head ) { int count = 0; while(head) { if((*head).code[1] == '0' && (*head).code[2] == '2') count ++; head = head->next; } return count; }
本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中偶數值的結點刪除。鏈表結點定義以下:
struct ListNode { int data; struct ListNode *next; };
函數接口定義:
struct ListNode *createlist(); struct ListNode *deleteeven( struct ListNode *head );
函數createlist從標準輸入讀入一系列正整數,按照讀入順序創建單鏈表。當讀到−1時表示輸入結束,函數應返回指向單鏈表頭結點的指針。
函數deleteeven將單鏈表head中偶數值的結點刪除,返回結果鏈表的頭指針。
裁判測試程序樣例:
#include <stdio.h> #include <stdlib.h> struct ListNode { int data; struct ListNode *next; }; struct ListNode *createlist(); struct ListNode *deleteeven( struct ListNode *head ); void printlist( struct ListNode *head ) { struct ListNode *p = head; while (p) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { struct ListNode *head; head = createlist(); head = deleteeven(head); printlist(head); return 0; } /* 你的代碼將被嵌在這裏 */
輸入樣例:
1 2 2 3 4 5 6 7 -1
輸出樣例:
1 3 5 7
struct ListNode *createlist() { struct ListNode *tail,*p,*head=NULL; int a; scanf("%d",&a); while(a!=-1){ tail=(struct ListNode *)malloc(sizeof(struct ListNode)); if(head==NULL) head=tail; else p->next=tail; tail->data=a; p=tail; scanf("%d",&a); } tail->next=NULL; return head; } struct ListNode *deleteeven( struct ListNode *head ) { struct ListNode *p , *q; while(head != NULL && head->data%2==0) { p = head; head = head->next; free(p); } p = head; while(p && p->next){ while(p->next && p->next->data%2==0){ q = p->next; p->next = q->next; } p = p->next; } return head; }
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 . . . .
想了好久都沒思路,因此去網上拜讀了一下,找到了一個我以爲最好的辦法(雖然是用C++寫的😂),因此有點看不太懂,但主要的函數看懂了,但和咱們的題目不太同樣,我不會轉換Q的位置。因此又失敗了。。。
參考博文:【基礎算法】回溯法與八皇后問題
在努力理解視頻中
7-1 求迷宮最短通道 (20 分)
遞歸求解迷宮最短通道的總步長。輸入一個迷宮,求從入口通向出口的可行路徑中最短的路徑長度。爲簡化問題,迷宮用二維數組 int maze[10][10]來存儲障礙物的分佈,假設迷宮的橫向和縱向尺寸的大小是同樣的,並由程序運行讀入, 若讀入迷宮大小的值是n(3<n<=10),則該迷宮橫向或縱向尺寸都是n,規定迷宮最外面的一圈是障礙物,迷宮的入口是maze[1][1],出口是maze[n-2][n-2], 若maze[i][j] = 1表明該位置是障礙物,若maze[i][j] = 0表明該位置是能夠行走的空位(0<=i<=n-1, 0<=j<=n-1)。求從入口maze[1][1]到出口maze[n-2][n-2]能夠走通的路徑上經歷的最短的總步長。要求迷宮中只容許在水平或上下四個方向的空位上行走,走過的位置不能重複走。
輸入格式:
輸入迷宮大小的整數n, 以及n行和n列的二維數組(數組元素1表明障礙物,0表明空位)
輸出格式:
如有可行的通道則輸出一個整數,表明求出的通道的最短步長;若沒有通道則輸出"No solution"
輸入樣例:
10 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1
上述輸入表明的是以下這樣一個迷宮:
其中紅色的小方塊是障礙物,藍色的小方塊是空位,白色的小圓連起來是一條從入口到出口的通道,兩個圓之間表明一個步長。
輸出樣例:
14
從第十三週開始,將進入課程設計階段,請在本次做業中給出:
1.所在小組想要開發的項目的名稱和目標;
2.項目主體功能的描述;
3.現階段已作的準備工做;
4.小組成員名單和進度安排。(課程設計階段:13-17周)
項目名稱:2048
項目目標:本組將以算法爲主,研究探討數組和結構體的高階使用方法,並引入更新、更高級的知識和技術,使用更爲美觀和精緻的UI,編寫一個成熟的Windows窗口應用程序。
小組成員:
進度安排:
任務內容 | 任務說明 | 任務貢獻度 | 任務截至日期 |
---|---|---|---|
遊戲進程 | 遊戲主體進程的詳細討論,包括詳細的子項 | 5 | 2019.5.12 |
美術大綱 | 討論遊戲總體美術風格和單塊素材美術風格 | 5 | 2019.5.12 |
素材收集及製做 | 按照美術大綱,收集或製做所有要求的素材 | 30 | 2019.5.25 |
狀態機實現 | 根據遊戲進程,實現個狀態之間的無素材轉換 | 15 | 2019.5.15 |
Windows子窗口控件實現 | 根據遊戲進程、美術大綱,實現個狀態之間無素材子窗口內容 | 20 | 2019.5.20 |
遊戲框架製做 | 收集前期所有工做成果,寫出遊戲框架 | 25 | 2019.6.1 |
遊戲實例代碼編寫 | 根據遊戲框架編寫所有所需子代碼 | 10/子代碼 | 2019.6.5 |
遊戲總製做 | 收集所有代碼,寫出總程序 | 15 | 2019.6.7 |
製做完成項目總結及成果整理 | 項目總結 | 3 | 2019.6.9 |
項目報告 | 用於C語言課程設計和應用程序設計比賽 | 5 | 2019.6.10 |
遊戲引擎製做 | 根據遊戲框架製做,用於創新項目設計比賽申報 | 15 | 2019.6.20 |
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
3/2-3/8 | 20h | 300行 | 數組,指針的大體意義,文件入門 | 數組串的使用,指針 |
3/9-3/15 | 25h | 400行 | 二維數組,文件與數組的結合運用 | 雙for循環的流程圖(再不上課,光自學感受太艱難了) |
3/16-3/22 | 22h | 450行 | 一維數組,二維數組,幾種數組排序法 | 字符串使用 |
3/23-3/29 | 20h | 350行 | 字符串的定義及其使用 | 指針的具體使用 |
3/30-4/5 | 15h | 340行 | 指針變量的定義,使用,初始化及其基本運算,指針做爲函數參數的做用;使用指針實現函數調用返回多個值 | 指針在運行時內存的變化 |
4/6-4/12 | 13h | 400行 | 數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,指針和數組能夠實現相同的操做,結構體的定義,使用 | 結構體的具體使用,結構體的流程圖 |
4/13-4/19 | 18h | 500行 | 經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 | 結構體的流程圖 |
4/20-4/26 | 13h | 400行 | 根據實際狀況合理定義結構,可以使用結構變量與結構數組進行熟練編程,掌握結構指針的操做,並應用於函數傳遞 | 遞歸函數 |
5/3-5/10 | 10h | 300行 | 掌握宏的基本用法;掌握編譯預處理的概念 | 本週做業 |
5/11-5/17 | 9h | 300行 | (1)二級指針的概念,以及指針數組的應用;(2)瞭解指針與函數的關係,掌握指針做爲函數返回值;(3)掌握單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷) | 單項鍊表的具體使用 |