第八週做業

這個做業屬於哪一個課程 C語言程序設計ll
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/3076
我在這個課程的目標是 瞭解並學習經常使用的字符串處理函數和用指針實現內存動態分配
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我瞭解和學習了經常使用的字符串處理函數和用指針實現內存動態分配的知識
參考文獻 書本8.4電碼加密和8.5任意個整數求和的內容和百度的一些資料

1、基礎題

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

本題要求實現一個字符串逆序的簡單函數。c++

函數接口定義:

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,l,n;
    char m;
    while(p[i]!='\0')
        i++;
        l=i-1;
    while(n<=l)
    {
        m=p[n];
        p[n]=p[l];
        p[l]=m;
        n++;
        l--;
    }
    return ;
}

所有代碼

#include <stdio.h>
#include <string.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;
}

void f( char *p )
{
    int i=0,l,n;
    char m;
    while(p[i]!='\0')
        i++;
        l=i-1;
    while(n<=l)
    {
        m=p[n];
        p[n]=p[l];
        p[l]=m;
        n++;
        l--;
    }
    return ;
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法

問題:出現ISO C++ forbids comparison between pointer and integer的提示
解決方法:
錯誤代碼:數組

if(p[i]!="\0")

改正後的代碼:函數

if(p[i]!='\0')

解釋:兩種不一樣類型的數據不能作比較,p[i]表示的是一個字符,「\0」表示的是一個字符串的地址,因此應該把「\0」改成‘\0’學習

4.運行結果截圖

6-3 字符串的鏈接 (15 分)

本題要求實現一個函數,將兩個字符串鏈接起來。測試

函數接口定義:

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

函數str_cat應將字符串t複製到字符串s的末端,而且返回字符串s的首地址。加密

裁判測試程序樣例:

#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,l;
    
    l=strlen(s);
    for(i=0;*(t+i)!='\0';i++)
    {
        *(s+l+i)=*(t+i);
    }
    return s;
}

所有代碼

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

char *str_cat( char *s, char *t )
{
    int i,l;
    
    l=strlen(s);
    for(i=0;*(t+i)!='\0';i++)
    {
        *(s+l+i)=*(t+i);
    }
    return s;
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法

問題:for語句中條件有誤,致使編譯運行結果錯誤
解決方法:得把*s改成s[i]或者直接把整個for語句中的數組改成指針。設計

4.運行結果截圖

7-1 輸出學生成績 (20 分)

本題要求編寫程序,根據輸入學生的成績,統計並輸出學生的平均成績、最高成績和最低成績。建議使用動態內存分配來實現。3d

輸入格式:

輸入第一行首先給出一個正整數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 (void)
{
    int n,i,*p;
    double m,t,f;
    scanf("%d",&n);
    
    if((p=(int *)calloc(n,sizeof(int)))==NULL)
    {
        printf("Not able to allocate memory.\n");
        exit(1);
    }
    for(i=0;i<n;i++)
    {
        scanf("%d",(p+i));
    }
    m=0;
    for(i=0;i<n;i++)
    {
        m=m+*(p+i);
    }
    printf("average = %.2f\n",m/n);
    t=f=*(p+0);
    for(i=0;i<n;i++)
    {
        if(t<*(p+i))
        {
            t=*(p+i);
        }
        if(f>*(p+i))
        {
            f=*(p+i);
        }
    }
    printf("max = %.2f\nmin = %.2f",t,f);
    free (p);
    return 0;
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法


問題1:輸入指針的時候,scanf裏面加了取地址符號,報錯
解決方法:將取地址符號刪去,輸入指針時不能運用取地址符號
問題2:在代碼裏所有定義的整型,沒定義浮點型
解決方法:好久沒注意過這點了,把須要改的改回浮點型,再編譯

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 (void)
{
    int i,j;
    char sx[5][80],s[80];
    for(i=0;i<5;i++)
    {
        scanf("%s",&sx[i]);
    }
    for(i=1;i<5;i++)
    {
        for(j=0;j<5-i;j++)
        {
            if(strcmp(sx[j],sx[j+1])>0)
            {
                strcpy(s,sx[j]);
                strcpy(sx[j],sx[j+1]);
                strcpy(sx[j+1],s);
            }
        }   
    }
    printf("After sorted:\n");
    for(i=0;i<5;i++)
    {
        printf("%s\n",sx[i]);
    }
    
    return 0;
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法

問題1:scanf語句沒有用一個單獨的for語句編寫,報錯;for語句裏面沒有注意sx[i]的用法
解決方法:把scanf語句單獨編寫;改正for語句裏面的數組用法。

4.運行結果截圖

2、預習題

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>
#include <string.h>
struct student
{
    int num[5];
    char name[10];
    int grade;
};
int main (void)
{
    int i,N;
    double average,t=0;
    struct student a[10];
    scanf("%d",&N);
    for(i=0;i<N;i++)
    {
        scanf("%s %s %d",&a[i].num,a[i].name,&a[i].grade);
        t=t+a[i].grade;
    }
    average=t/N;
    printf("%.2f\n",average);
    for(i=0;i<N;i++)
    {
        if(a[i].grade<average)
        {
            printf("%s %s\n",a[i].name,a[i].num);
        }
    }
    
    return 0;
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法



問題1:在dev-c++中,有時候數組長度能夠用變量,可是通常又不能夠
解決方法:C語言中數組長度必須爲常量,有些的不同,但C語言中必須注意。
問題2:沒有把num定義爲數組,結果致使結果出不來
解決方法:把num定義爲num[5],結果正確。
問題3:for語句中的條件問題,i=1時會缺乏一部分。
解決方法:改成i=0便答案正確,我也不知道是啥緣由,好像是由於數組的定義。

4.運行結果截圖

3、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 2天 39 初次學習數組的用法 關於數組的一些具體的用法
3/4-3/10 2天 35 編寫程序來處理文件數據 指針的具體用法和fscanf類型函數的理解
3/11-3/17 1天 59 第一題:編寫程序處理文件數據 指針的具體用法
3/11-3/17 2天 51 第二題:用二維數組知識編寫程序 二維數組的知識點不熟悉
3/18-3/24 2天 111 二維數組、選擇法排序和冒泡法排序 選擇法排序和冒泡法排序的區別
3/25-3/31 2天 78 判斷迴文,字符數組和使用字符串編程 使用字符串編程時的一些函數的用法
4/1-4/7 3天 102 指針的基本運算,數組和指針的結合 對於數組仍是不熟悉
4/8-4/14 3天 96 冒泡排序,指針、數組和地址間的關係 指針和數組的關係和應用不太會,容易錯
4/15-4/21 3天 129 經常使用的字符串處理函數和用指針實現內存動態分配 關於指針內存動態分配還不太熟悉

4、學習感悟

這一週主要了解並學習了經常使用的字符串處理函數和用指針實現內存動態分配,這一週時間比較充沛,做業都是先看書上的內容再完成的,我以爲比上週的做業要容易一些,常見的字符串處理函數多記一下就能夠記住了,做業中的不少涉及的知識在以前上過的課上就講解過,做業中也作過。我以爲指針內存動態分配方面我仍是有一些瞭解了的,動態內存分配呢,使用時申請,用完後釋放,還有函數malloc()、calloc()、free()、realloc()的使用。最後還預習告終構的一部份內容,作預習做業時參考書上的例題作的,感受還好。其餘不懂的知識就須要去請教、百度查資料,千方百計弄懂。

5、結對編程感悟

這周的編程總結沒咋交流,這周小夥伴比較忙,因此咱們都是各自寫的本身的題目,我在寢室裏面也有跟室友討論題目,請教她們,我以爲這也算結對編程吧,每個題目都是獨立思考的,作出一個題目都是很開心的,有時間了和小夥伴就會一塊兒討論了,討論各自的思路,告訴對方錯誤緣由啥的。

6、表格、折線圖

時間 代碼行數 博客字數
第一週 39 798
第二週 35 923
第三週 110 1071
第四周 111 1713
第五週 78 1878
第六週 102 2991
第七週 96 2618
第八週 129 3011

相關文章
相關標籤/搜索