第十二週做業

本週做業頭

此次做業屬於哪一個課程 C語言程序設計ll
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3234
我在這個課程的目標是 學習一些指針與數組函數結構之間一些新的關係和應用
這個做業在哪一個具體方面幫助我實現目標 將學到的東西結合運用到編程裏面來
參考文獻 http://www.javashuo.com/article/p-aijkguan-cv.html

1、基礎做業

題目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).運行結果截圖
學習

6-2 統計專業人數 (15 分)

本題要求實現一個函數,統計學生學號鏈表中專業爲計算機的學生人數。鏈表結點定義以下:測試

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

1.實驗代碼

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;
}

2.設計思路

3.本題調試過稱中遇到的問題及解決辦法

問了下同伴因此並無阻礙。code

4.運行截圖

6-3 刪除單鏈表偶數節點 (20 分)

本題要求實現兩個函數,分別將讀入的數據存儲爲單鏈表、將鏈表中偶數值的結點刪除。鏈表結點定義以下:

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

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;    
}

2.設計思路

3.本題調試過稱中遇到的問題及解決辦法

這題照着書上的例題作的,一次性經過,沒有遇到問題

4.運行截圖

二.挑戰題

7-1 ***八皇后問題 (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 . . . .

1.實驗代碼

```

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.設計思路

3.本題調試過稱中遇到的問題及解決辦法。

這題我是看了計科四班助教的視頻和李代傳的代碼,,搞明白四班助教的代碼,而後本身作出來。

4.運行截圖

三.學習感悟

這三週的課程都好難,我至今對遞歸的概念都不事很清楚,感受本身學的稀裏糊塗的,我得好好看看書和網上得資料了。

四.預習做業

1.所在小組想要開發的項目的名稱和目標;

還沒考慮好

2.項目主體功能的描述;

3.現階段已作的準備工做;

4.小組成員名單和進度安排。

小組成員:劉偉,任森柱,李健

五.結對編程感想

過程:討論了基礎題的最後一題;一塊兒看了買得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

相關文章
相關標籤/搜索