2019 第八週做業

2019春季第八週做業編程

這個做業屬於哪一個課程 C語言程序設計ll
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3074
我在這個課程的目標是 掌握字符串和字符指針、利用經常使用的字符串處理函數 及用指針實現內存動態分配
這個做業在哪一個具體方面幫助我實現目標 利用字符串函數編寫代碼以及用指針實現動態分配內存
參考文獻 https://wenwen.sogou.com/z/q1710626805.htm

1、基礎題

一、 函數實現字符串逆序

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

函數接口定義:數據結構

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)實驗代碼

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

void f( char *p )
{
    int i=0,j=0,z,m;
    while(p[i]!='\0')
    {
        i++;
        z=i-1;
    }
    while(j<=z)     //字符數組處理字符串,將字符串的首字符和最後一個字符交換,注意交換的次數
    {
        m=p[j];
        p[j]=p[z];
        p[z]=m;
        j++;
        z--;
    }
}

(2)設計思路

(3)本題調試過程當中碰到問題及解決方法

問題:·一開始沒有判斷p[i]!='\0'的狀況,致使答案錯誤
解決方法:·屢次調試後找到錯誤並改正3d

(4)運行結果截圖

二、字符串的鏈接

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

函數接口定義:調試

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)實驗代碼

#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)
{
    return strcat(s,t);     //鏈接兩個字符串,鏈接後的字符串存放在s中
    
    return 0;
}

(2)設計思路

(3)本題調試過程當中碰到問題及解決方法

問題:·一開始想到的作法比較麻煩,還只能輸出一行abcdef,進行調試我也看不出哪裏出錯
解決方法:·查了百度,看到了一種比較簡單的方法,直接用函數鏈接兩個字符

(4)運行結果截圖

三、輸出學生成績

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

輸入格式:

輸入第一行首先給出一個正整數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 i,N,*p;
    double sum,max,min;
    scanf ("%d",&N);
    
    if((p=(int*) calloc (N,sizeof(int)))==NULL)     //爲數組p動態分配N個整數類型大小的空間
    {                
        printf ("Not able to allocate memory.\n");
        exit (1);
    }
    for(i=0;i<N;i++)               //輸入學生的成績
    {                                 
        scanf("%d",&p[i]);
    }
    max=min=p[0];
    for(i=0;i<N;i++)              //計算學生的平均成績、最高成績和最低成績
    {
        sum=sum+p[i];
        if(max<p[i])
        {
            max=p[i];
        }
        if(min>p[i])
        {
            min=p[i];
        }
    }
    printf ("average = %.2lf\n",sum/N);
    printf ("max = %.2lf\n",max);
    printf ("min = %.2lf\n",min);
    free (p);
    
    return 0;
}

(2)設計思路

(3)本題調試過程當中碰到問題及解決方法

本題是參看書上的例題寫的,沒有出現錯誤

(4)運行結果截圖

四、字符串排序

本題要求編寫程序,讀入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 a[5][80],m[80];
    
    for(i=0;i<5;i++)
    {
        scanf("%s",&a[i]);  
    }
     for(i=1;i<5;i++)             //比較字符串的大小 
    { 
        for(j=0;j<5-i;j++)
        {
            if(strcmp(a[j],a[j+1])>0)                   
            {
                strcpy(m,a[j]);                //把字符串a[j]複製到m 
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],m);
            }
        }
    }

    printf("After sorted:\n");
    for(i=0;i<5;i++)
    {
        printf("%s\n",a[i]);
    }

    return 0;
}

(2)設計思路

(3)本題調試過程當中碰到問題及解決方法

問題:·本題是仿照書上的例題寫的,一開始沒有定義二維數組,而且在比較字符串大小的時候出了點問題,我把for語句中的i=0,致使答案錯誤。
解決方法:·屢次調試以後發現錯誤並改正。

(4)運行結果截圖

2、預習題

一、計算平均成績

給定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[6];                    //學號              
    char name[11];                 //姓名 
    int grade;                     //成績 
};
 
int main(void)
{
    struct student a[10];                      //定義結構變量
    int i, N;
    double sum = 0,average;
    scanf("%d\n", &N);
    for (i = 0; i < N; i++)                      //計算
    {
        scanf("%s%s%d", &a[i].num, &a[i].name, &a[i].grade);
        sum += a[i].grade;
    }
    average = sum / 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)本題調試過程當中遇到的問題及解決方法

問題:·本題也是仿照書上寫的,沒有把學號和名字定義成數組
解決方法:·提交答案錯誤以後返回代碼仔細檢查

(4)運行結果截圖

3、預習的主要內容

預習了第九章結構:
一、在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體能夠被聲明爲變量、指針或數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱爲結構體的成員(member),且這些成員能夠爲不一樣的類型,成員通常用名字訪問。。
  在C語言中,定義一個結構的通常形式爲:
  struct結構名
  {
  //成員表列
  };
  成員表由若干個成員組成, 每一個成員都是該結構的一個組成部分。對每一個成員也必須做類型說明,其形式爲:「類型說明符 成員名;」。成員名的命名應符合標識符的書寫規定。。
  在這個結構定義中,結構名爲stu,該結構由4個成員組成。 第一個成員爲num,整型變量;第二個成員爲name,字符型數組;第三個成員爲sex,字符型變量;第四個成員爲score,浮點型變量。 應注意在括號後的分號是必不可少的。。

二、當結構定義完成後,即建立了一種數據類型,能夠像int、float等內置類型同樣使用,以上面定義的stu結構體來和int類型對比着看。
  int a;//定義一個int類型的變量a
  stu a; //定義一個stu類型的變量a
  int p; //定義一個int類型的指針p
  stu
p; //定義一個stu類型的指針p
  int a[10];//定義一個int類型的數組a,它有10個元素,每一個元素是int類型
  stu a[10];//定義一個stu類型的數組a,它有10個元素,每一個元素是stu類型。。

4、學習感悟

本週學習了字符串和字符指針,字符指針是指向字符的指針,所佔內存單元存放的是所指字符的內存單元。定義方法爲:char *p;還學習了經常使用的字符串處理函數 及用指針實現內存動態分配。。
對於本週的做業,我大部分是仿照書上的寫的,可是仍是有不少地方不清楚,好比預習題用到的結構,還不太懂結構的具體用法。。

感悟:雖然比較難,可是仍是會繼續努力的!加油!

5、結對編程感想

本週三晚自習依舊是咱們結對編程的時間,可是因爲我和搭檔報了學校的活動,咱們都沒有去教室編程,但咱們在寢室一塊兒寫了,感受此次收穫挺多的,在寫題目的時候咱們一塊兒討論了不少問題,咱們實行不懂就問對方,兩個都不懂就查資料或者問大佬。感受還不錯。

6、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 三天 45 數組的認識及用法 數組長度的理解
3/4-3/10 兩天 37 編寫程序時處理文件 fscanf與fprintf的具體用法
3/11-3/17 三天 53 二維數組的使用及文件插入 二維數組的用法、上三角的判斷及文件的處理
3/18-3/24 兩天 113 選擇排序法、二分查找法、二維數組的引用與矩陣 不清楚選擇排序法和冒泡排序法的區別
3/25-3/31 兩天 78 判斷迴文、一維字符數組的用法、使用字符串編程 使用字符串編程
4/1-4/7 兩天 88 指針變量的基本運算,內存單元和地址之間的關係 不太瞭解指針數組
4/8-4/14 兩天 96 指針、數組和地址之間的關係 對於指針數組和數組指針的區別不是特別清楚
4/15-4/21 兩天 128 字符串和字符指針、經常使用的字符串處理函數 及用指針實現內存動態分配 對於指針都不是特別懂

7、表格和折線圖

時間 代碼行數 博客字數
第一週 45 870
第二週 37 1055
第三週 112 1158
第四周 113 1696
第五週 78 1854
第六週 114 2977
第七週 96 3019
第八週 128 3264

相關文章
相關標籤/搜索