這個做業屬於哪一個課程 | C語言程序設計 |
這個做業的要求在哪裏 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3234 |
我在這個課程的目標是 | 二級指針的概念,瞭解指針與函數的關係,掌握單向鏈表的概念和操做 |
這個做業在哪一個具體方面幫助我實現目標 | 經過理解書上的概念和例題 |
參考文獻 | C語言程序設計 |
本題要求實現一個函數,用於計算有n個元素的指針數組s中最長的字符串的長度。
函數接口定義:編程
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 ) { char *op; op=*(s+0); for(int i=1;i<n;i++){ if(strlen(op)<strlen(*(s+i))){ op=*(s+i); } } return strlen(op); }
本題一次性經過,沒有遇到問題測試
本題要求實現一個函數,統計學生學號鏈表中專業爲計算機的學生人數。鏈表結點定義以下:設計
struct ListNode { char code[8]; struct ListNode *next; };
這裏學生的學號共7位數字,其中第二、3位是專業編號。計算機專業的編號爲02。
函數接口定義:3d
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 #
輸出樣例:code
3
int countcs( struct ListNode *head ) { if(head==NULL){ return 0; } int num=0; struct ListNode *str; str=head; while(str!=NULL){ if(str->code[1]=='0'&&str->code[2]=='2'){ num++; } str=str->next; } return num; }
問題:1.沒有考慮沒有傳入學生學號的狀況;2.忘記打str=str->next;
解決辦法:考慮沒有傳入學生學號的狀況;加上代碼str=str->next;
本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中偶數值的結點刪除。鏈表結點定義以下:
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
/*函數createlist從標準輸入讀入一系列正整數, 按照讀入順序創建單鏈表。當讀到-1時表示輸入結束,函數應返回指向單鏈表頭結點的指針。*/ struct ListNode *createlist() { struct ListNode *str,*p,*tail; int n; int size=sizeof(struct ListNode); /*計算結構函數struct ListNode所佔的字節數*/ str=tail=NULL; scanf("%d",&n); while(n!=-1){ p=(struct ListNode*)malloc(size); p->data=n; p->next=NULL; /*因爲新增長的結點老是加在鏈表的末尾,因此該新增結點的next域應置成NULL*/ if(str==NULL) /*創建鏈表的第一個結點時,整個鏈表時空的,這時候應直接賦值給head, 而不是tail->next,由於此時tail仍是空的,尚未結點可指向*/ str=p; else tail->next=p; tail=p; scanf("%d",&n); } return str; } /*函數deleteeven將單鏈表head中偶數值的結點刪除,返回結果鏈表的頭指針。*/ struct ListNode *deleteeven( struct ListNode *head ) { struct ListNode *ptr1,*ptr2; /*要被刪除的結點爲表頭結點*/ while(head!=NULL&&((head->data)%2==0)){ ptr2=head; head=head->next; free(ptr2); } /*鏈表空*/ if(head==NULL) return NULL; /*要被刪除的結點爲非表頭結點*/ ptr1=head; ptr2=head->next; while(ptr2!=NULL){ /*從表頭的下一個結點搜索全部符合刪除要求的結點*/ if((ptr2->data)%2==0){ ptr1->next=ptr2->next; free(ptr2); } else ptr1=ptr2; /*ptr1後移一個結點*/ ptr2=ptr1->next; /*ptr2指向ptr1的後一個結點*/ } return head; }
這題照着書上的例題作的,一次性經過,沒有遇到問題
在國際象棋中,皇后是最厲害的棋子,能夠橫走、直走,還能夠斜走。棋手馬克斯·貝瑟爾 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 . . . .
#include<stdio.h> #include<math.h> int judge(int x,int y); void traverse(int x); void show(); int n,f=0,sun=0; int str[13]={0}; /*主函數——輸入*/ int main() { scanf("%d",&n); traverse(1); //從第一行開始,逐行放一個皇后 if(sun==0){ //若問題無解則輸出None; printf("None"); } } /*放皇后*/ void traverse(int x) { if(x<=n) //一直放到棋盤的最後一行 { for(int i=1;i<=n;i++){ int z=judge(x,i); //判斷第x行的第i列的位置是否能夠放皇后 if(z==0){ //若返回值爲0,即該位置能夠放皇后,則將第x行放的皇后的位置(即第i列)儲存在str[x]裏; str[x]=i; traverse(x+1); //若上一行的皇后已經放好後,則就能夠繼續放下一行的皇后。 } } } else //若x>n,則說明最後一行的皇后已經放完了,即已經放完了一盤棋了,能夠將這一盤棋輸出了; { show(); sun=1; //若最少輸出了一盤棋,則說明問題有解; } } /*判斷該位置是否能夠放皇后*/ int judge(int x,int y) { for(int i=1;i<x;i++) //判斷第x行的上面幾行的皇后是否和第x行的第y列的皇后位於同列或同斜線。 { if(str[i]==y||(abs(i-x)==abs(str[i]-y))) //若兩個皇后處於同斜線,則兩皇后位置的行差和列差的絕對值相等 { return -1; //若處於同列或同行,即該位置不能夠放皇后,則返回-1 } } return 0; //與上面幾行都判斷完後,都沒有發現有皇后和第x行的第y列的皇后位於同列或同斜線,即該位置能夠放皇后,則返回0; } /*輸出棋盤擺法*/ void show() { if(f==1){ //空一行後再輸出棋盤,而不是輸出棋盤後再空一行,防止輸出最後一種解法的棋盤後,還要多輸出一條空行; printf("\n"); } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(str[i]==j){ printf("Q"); } else{ printf("."); } if(j!=n){ //如果最後一列,則不須要輸出空格; printf(" "); } } printf("\n"); f=1; //將f賦值1,如有多種解,則輸出第一種解後,再在後面輸出的棋盤前面空一行; } }
這題我是看了計科四班助教的視頻和李代傳的代碼,,搞明白四班助教的代碼,而後本身作出來,一次性經過。
這周學習的三個課程都比較難以理解,特別是單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷),這一部分我也看了好久纔有一點概念,基礎題的第三題和書上的例題差很少,只要書上的例題理解了,那麼這個題目就很容易作出來,其餘兩個題目都還好,主要是理解書上的概念;這周的挑戰題我和上週同樣,都沒有思路,八皇后我仍是看了別人的代碼和視頻,搞明白後,我才作出來的;找最短迷宮的路徑這題,網友的我也看不明白,感受好複雜,並且也沒有時間了,就沒作了。
還沒考慮好
小組成員:劉偉,任森柱,李健
過程:討論了基礎題的最後一題;一塊兒看書、看例題。
感想:理解了單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷),而且將第三題作出來了。
周/日期 | 這周所花的時間 | 代碼行 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
2/25-3/3 | 6h | 39 | 一維數組的定義和引用及初始化 | 字符數組和整型數組的區別 |
3/4-3/10 | 12h | 47 | 指針的定義及運用;文件的讀取、寫入, 處理和開關;文件的打開方. | 文件的分類,什麼是文本文件, 什麼是二進制文件;字符數組的讀取和寫入 |
3/11-3/17 | 6h | 57 | 二維數組的定義及應用 | 二維數組的行和列的嵌套循環輸入和輸出 |
3/18-3/24 | 12h | 98 | 選擇排序法、冒泡排序法和二分查找法 | 不清楚選擇排序法和冒泡排序法的區別 |
3/25-3/31 | 20h | 88 | 字符數組和字符串的區別,字符串的輸入輸出方式和格式,二維數組更高級的運用。 | 不清楚指針在程序中的做用 |
4/1-4/7 | 12h | 70 | 變量、內存單元和地址之間的關係;指針變量的定義及初始化,指針變量的基本運算,指針、數組和地址間的關係 | 二分法查找法不太明白 |
4/8-4/14 | 11h | 99 | 掌握數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,理解指針和數組能夠實現相同的操做 | 好像忘記了,可能沒有 |
4/15-4/21 | 12h | 132 | 掌握經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 | 各個動態內存分配函數的區別仍是不太清楚 |
4/22-4/28 | 12h | 133 | 合理定義結構,使用結構變量與結構數組編程,掌握結構指針的操做,並應用於函數傳遞 | 解遞歸式的三種方法不太理解 |
4/29-5/4 | 7h | 0 | 結構數組及結構指針;如何提升本身與他人的競爭力?如何有效的記憶和學習?如何提問? | 各個動態內存分配函數的使用仍是不太清楚 |
5/5-5/11 | 36h | 26 | 可以使用遞歸函數進行編程;掌握宏的基本用法;掌握編譯預處理的概念 | 如何熟練使用遞歸函數 |
5/12-5/18 | 12h | 229 | 二級指針的概念,瞭解指針與函數的關係,掌握指針做爲函數返回值,掌握單向鏈表的概念和操做 | 如何找出迷宮的最短路徑 |
時間 | 代碼行數 | 博客字數 |
---|---|---|
第一週 | 39 | 1754 |
第二週 | 47 | 2087 |
第三週 | 57 | 1993 |
第四周 | 98 | 2145 |
第五週 | 88 | 2472 |
第六週 | 70 | 2514 |
第七週 | 99 | 3127 |
第八週 | 132 | 3313 |
第九周 | 133 | 2897 |
第十一週 | 26 | 3026 |
第十二週 | 229 | 3092 |