此次做業屬於哪一個課程 | C語言程序設計ll |
---|---|
這個做業要求在哪裏 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3234 |
我在這個課程的目標是 | 學習一些指針與數組函數結構之間一些新的關係和應用 |
這個做業在哪一個具體方面幫助我實現目標 | 將學到的東西結合運用到編程裏面來 |
參考文獻 | http://www.javashuo.com/article/p-aijkguan-cv.html |
題目1.計算最長的字符串長度
本題要求實現一個函數,用於計算有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
1).實驗代碼函數
int max_len( char *s[], int n ) { char *p; p=*(s+0); for(int i=1;i<n;i++){ if(strlen(p)<strlen(*(s+i))){ p=*(s+i); } } return strlen(p); }
2).設計思路
3).調試過程當中遇到的問題和解決辦法
仔細看書後發現並不難。
4).運行結果截圖
學習
本題要求實現一個函數,統計學生學號鏈表中專業爲計算機的學生人數。鏈表結點定義以下:測試
struct ListNode { char code[8]; struct ListNode *next; };
這裏學生的學號共7位數字,其中第二、3位是專業編號。計算機專業的編號爲02。
函數接口定義:.net
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 ) { if(head==NULL){ return 0; } int n=0; struct ListNode *s; s=head; while(s!=NULL){ if(s->code[1]=='0'&&s->code[2]=='2'){ n++; } s=s->next; } return n; }
問了下同伴因此並無阻礙。code
本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中偶數值的結點刪除。鏈表結點定義以下:
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 *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 . . . .
```
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,如有多種解,則輸出第一種解後,再在後面輸出的棋盤前面空一行;
}
}
這題我是看了計科四班助教的視頻和李代傳的代碼,,搞明白四班助教的代碼,而後本身作出來。
這三週的課程都好難,我至今對遞歸的概念都不事很清楚,感受本身學的稀裏糊塗的,我得好好看看書和網上得資料了。
還沒考慮好
小組成員:劉偉,任森柱,李健
過程:討論了基礎題的最後一題;一塊兒看了買得C語言遊戲設計書、看例題。
感想:看書理解了單向鏈表的概念和操做(創建、增長、刪除、修改、遍歷)。
周/日期 | 這周所花的時間 | 代碼行 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
2/25-3/3 | 5h | 39 | 一維數組的定義和引用及初始化 | 字符數組和整型數組的區別 |
3/4-3/10 | 5h | 47 | 文件的讀取、寫入, 處理和開關;文件的打開方. | 文件的分類,什麼是二進制文件;字符數組的讀取和寫入 |
3/11-3/17 | 6h | 57 | 二維數組的定義及應用 | 二維數組的行和列的嵌套循環輸入和輸出 |
3/18-3/24 | 3h | 33 | 選擇排序法、冒泡排序法和二分查找法 | 不清楚選擇排序法和冒泡排序法的區別 |
3/25-3/31 | 10h | 40 | 字符數組和字符串的區別,字符串的輸入輸出方式和格式,二維數組更高級的運用。 | 不清楚指針在程序中的做用與使用 |
4/1-4/7 | 6h | 50 | 變量、內存單元和地址之間的關係;指針變量的定義及初始化,指針變量的基本運算,指針、數組和地址間的關係 | 冒泡排序法不太明白 |
4/8-4/14 | 12h | 99 | 掌握數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,理解指針和數組能夠實現相同的操做 | 作基礎題第二題時發現之前的知識不少都忘記了 |
4/15-4/21 | 12h | 132 | 掌握經常使用字符串函數以及使用指針操做字符串的方法,理解動態內存分配 | 各個動態內存分配函數的區別仍是不太清楚 |
4/22-4/28 | 12h | 135 | 合理定義結構,使用結構變量與結構數組編程,掌握結構指針的操做,並應用於函數傳遞 | 解遞歸式的三種方法不懂 |
4/29-5/4 | 7h | 0 | 結構數組及結構指針;如何提升本身與他人的競爭力?如何有效的記憶和學習?如何提問? | 各個動態內存分配函數的使用仍是不太清楚 |
5/5-5/11 | 20h | 26 | 可以使用遞歸函數進行編程;掌握宏的基本用法;掌握編譯預處理的概念 | 如何熟練使用遞歸函數 |
5/12-5/18 | 13h | 200 | 二級指針的概念,瞭解指針與函數的關係,掌握指針做爲函數返回值,掌握單向鏈表的概念和操做 | 如何找出迷宮的最短路徑 |
時間 | 代碼行數 | 博客字數 |
---|---|---|
第一週 | 39 | 400 |
第二週 | 47 | 500 |
第三週 | 57 | 550 |
第四周 | 98 | 600 |
第五週 | 88 | 700 |
第六週 | 70 | 800 |
第七週 | 99 | 900 |
第八週 | 150 | 1500 |
第九周 | 120 | 2500 |
第十一週 | 26 | 2800 |
第十二週 | 180 | 2600 |