2019春第八週做業

2019春第八週做業

這個做業屬於哪一個課程 C語言程序設計Ⅱ
這個做業要求在哪裏 第八週做業
我在這個課程的目標是 可以使用c語言實現基本的程序設計,以致最後可以設計出較大的項目
這個做業在哪一個具體方面幫助我實現目標 學會了一些與字符串有關的字符處理函數;並學習了用指針實現內存動態分配 ,其優勢是當不知道數組大小時,在程序執行的過程當中動態地分配或者回收存儲空間的分配內存,提升程序的可執行性,使程序更簡潔
參考文獻 C語言程序設計(第3版); C Primer Plus (第6版)

1、本週完成的做業

題目1. 6-1 函數實現字符串逆序 (15 分)

本題要求實現一個字符串逆序的簡單函數。
函數接口定義:編程

void f( char *p );

函數f對p指向的字符串進行逆序操做。要求函數f中不能定義任何數組,不能調用任何字符串處理函數。
裁判測試程序樣例:數組

#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s ); /* 由裁判實現,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    f(s);
    printf("%s\n", s);

    return 0;
}

/* 你的代碼將被嵌在這裏 */
輸入樣例:函數

Hello World!

輸出樣例:學習

!dlroW olleH

1)、實驗代碼

void f( char *p )
{
    int i=0,j,q;
    char k;
    while (p[i]!='\0')
        i++;
        q=i;
        i=i-1;
    for (j=0; j<q/2; j++) {
            k=p[j];
            p[j]=p[i-j];
            p[i-j]=k;
    }
}

2)、設計思路

3)、本題調試過程碰到的問題及解決方法

測試

4)、運行結果圖

題目2. 6-3 字符串的鏈接 (15 分)

本題要求實現一個函數,將兩個字符串鏈接起來。
函數接口定義:設計

char *str_cat( char *s, char *t );

函數str_cat應將字符串t複製到字符串s的末端,而且返回字符串s的首地址。
裁判測試程序樣例:3d

#include <stdio.h>
#include <string.h>

#define MAXS 10

char *str_cat( char *s, char *t );

int main()
{
    char *p;
    char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};

    scanf("%s%s", str1, str2);
    p = str_cat(str1, str2);
    printf("%s\n%s\n", p, str1);

    return 0;
}

/* 你的代碼將被嵌在這裏 */
輸入樣例:指針

abc
def

輸出樣例:調試

abcdef
abcdef

1)、實驗代碼

char *str_cat( char *s, char *t )
{
    int i,j;
    while (s[i]!='\0') {
        i++;
        if (s[i]=='\0')
        break;
    }
    for (j=0; t[j]!='\0'; j++) {
        s[i]=t[j];
        i++;
    }
    return s;
}

2)、設計思路

3)、本題調試過程碰到的問題及解決方法

code

4)、運行結果圖

題目3. 7-1 輸出學生成績 (20 分)

本題要求編寫程序,根據輸入學生的成績,統計並輸出學生的平均成績、最高成績和最低成績。建議使用動態內存分配來實現。
輸入格式:
輸入第一行首先給出一個正整數N,表示學生的個數。接下來一行給出N個學生的成績,數字間以空格分隔。
輸出格式:
按照如下格式輸出:
average = 平均成績
max = 最高成績
min = 最低成績
結果均保留兩位小數。
輸入樣例:

3
85 90 95

輸出樣例:

average = 90.00
max = 95.00
min = 85.00

1)、實驗代碼

#include<stdio.h>
#include<stdlib.h>
int main ()
{
    int n,*p,i;
    double average,max=0.0,min=200.0,sum=0;
    scanf ("%d\n",&n);
    if ((p = (int *) calloc (n,sizeof (double))) == NULL) {
        printf ("Not able to allocate memory.\n");
        exit (1);
    }
    for (i=0; i<n; i++) {
      scanf ("%d",p+i);
      sum = sum + *(p+i);
}
    average=sum/n;
    for (i=0; i<n; i++) {
        if (*(p+i)>max)
           max=*(p+i);
        if (*(p+i)<min)
           min=*(p+i);
    }
    printf ("average = %.2lf\n",average);
    printf ("max = %.2lf\n",max);
    printf ("min = %.2lf\n",min);
    free (p);
    
    return 0;
}

2)、設計思路


3)、本題調試過程碰到的問題及解決方法

如圖,提示答案部分正確;
解決方法:將變量 sum 定義爲 double 型。

4)、運行結果圖

題目4. 7-4 字符串排序 (20 分)

本題要求編寫程序,讀入5個字符串,按由小到大的順序輸出。
輸入格式:
輸入爲由空格分隔的5個非空字符串,每一個字符串不包括空格、製表符、換行符等空白字符,長度小於80。
輸出格式:
按照如下格式輸出排序後的結果:

After sorted:

每行一個字符串
輸入樣例:
red yellow blue green white
輸出樣例:

After sorted:
blue
green
red
white
yellow

1)、實驗代碼

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j;
    char p[5][80],q[80];
    for(i=0; i<5; i++)
        scanf("%s",p[i]);
    for(i=0; i<4; i++)
        for(j=0; j<4-i; j++)
            if (strcmp(p[j],p[j+1])>0) {
                strcpy(q,p[j]);
                strcpy(p[j],p[j+1]);
                strcpy(p[j+1],q);
            }
    printf("After sorted:\n");
    for(i=0;i<5;i++)
        printf("%s\n",p[i]);
        
    return 0;
}

2)、設計思路

3)、本題調試過程碰到的問題及解決方法

4)、運行結果圖

預習做業 7-3 計算平均成績 (15 分)

給定N個學生的基本信息,包括學號(由5個數字組成的字符串)、姓名(長度小於10的不包含空白字符的非空字符串)和成績([0,100]區間內的整數),要求計算他們的平均成績,並順序輸出平均線如下的學生名單。
輸入格式:
輸入在一行中給出正整數N(≤10)。隨後N行,每行給出一位學生的信息,格式爲「學號 姓名 成績」,中間以空格分隔。
輸出格式:
首先在一行中輸出平均成績,保留2位小數。而後按照輸入順序,每行輸出一位平均線如下的學生的姓名和學號,間隔一個空格。
輸入樣例:

5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60

輸出樣例:

80.00
zhang 00001
chen 21987

1)、實驗代碼

#include<stdio.h>
struct student {
    int fen;
    char name [10],num [10];
};
int main ()
{
    int n,i;
    double sum=0.0,average=0.0;
    scanf ("%d",&n);
    struct student p[n];
    for (i=0; i<n; i++) {
        scanf ("%s %s %d",&p[i].num,&p[i].name,&p[i].fen);
        sum = sum + p[i].fen;
    }
    average = sum / n;
    printf ("%.2lf\n",average);
    for (i=0; i<n; i++) {
        if (average > p[i].fen)
        printf ("%s %s\n",p[i].name,p[i].num);
    }
    
    return 0;
}

2)、設計思路


3)、本題調試過程碰到的問題及解決方法

無,依照書上例題來的。

4)、運行結果圖

2、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
3/2-3/8 三天六小時 50 一、定義、運用文件指針;二、如何打開、關閉文件三、如何讀出指定文件中的數據;四、如何向指定文件中寫入數據; 字符、字符串有什麼區別?兩者輸入、輸出有沒有很大不一樣?什麼纔算字符串?什麼算字符?在文件中兩者有沒有差異?
3/9-3/15 四天三小時 180 一、運用二維數組解決問題,矩陣的判斷;二、對一組數的全部子數組求和 如何在輸出時利用數組的性質
3/16-3/22 三天八小時 210 一、二維數組加深理解,二維數組與矩陣;二、選擇排序法解決問題;三、二分查找法 二分查找法這周沒練習,只是看看書上例題大體懂了,不知道真正應用時可否掌握。
3/23-3/29 三天兩小時 120 一、判斷回;文二、字符數組的概念及其簡單運用;三、一些簡單的與字符數組相關的暫時沒接觸補充知識,一些函數,用法等。 在做業運用文件指針時,一開始老是出現從文件裏輸不出來結果,打印不出來,後來發現可能與本身輸入時格式未搞好,原本不該該出現的空格出現了,致使打印不出來結果。文件指針還不是很熟練
3/30-4/5 兩天 150 一、指針的含義,變量、地址、指針變量等間的關係;二、指針變量的初始化,運用指針作一些簡單運算;三、指針與數組之間的關係 在用指針處理字符串時,應怎樣定義指針變量
4/6-4/12 三天 200 一、更深一步掌握指針與數組間的關係;二、懂得指針能夠實現數組的一些功能;三、指針在碰到字符數組時的應用 在代碼中,若是遇到要輸出單個字符,%s與%c有什麼區別? scanf()與 getchar 兩種輸入方式有區別嗎?會不會在有些狀況下能影響到輸出結果?
4/13-4/19 兩天 170 一、學習了與字符串有關的一些字符串處理函數;二、學習了利用指針實現內存動態分配 究竟什麼狀況下采用內存動態分配?具體要採用哪種動態內存分配?

3、學習感悟

這週上課前就已經知道做業題目有五題,一開始以爲數量些許多,但當我作的時候果真,難度不大。幾乎全部題目都對應了所學的每一處知識點。就連預習題目也是書上的差很少原題,操做起來難度不大。

結對編程感想

原本週三下午就已經寫了四道題目,有一題pta老是不給過,想着晚自習與隊友討論,但晚自習一開始,班長就讓去小禮堂開會。結束後就回寢了。不過好在次日上課間,只是與隊友提及來了,他看了我代碼,一眼發現變量定義失誤,兩分鐘內解決問題。過後感慨有個隊友仍是比較靠譜,有些低級錯誤本身當時可能發現不了,在別人看來,一眼就能看出問題。

表格-折線圖

時間 累計代碼行數 累計博客字數
第一週 80 275
第二週 50 883
第三週 180 1303
第四周 210 1849
第五週 120 1988
第六週 150 2717
第七週 200 3000
第八週 170 2820

相關文章
相關標籤/搜索