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'的情況,導致答案錯誤
解決方法:·多次調試后找到錯誤並改正

(4)運行結果截圖

2、字符串的連接

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

函數接口定義:

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)運行結果截圖

3、輸出學生成績

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

輸入格式:

輸入第一行首先給出一個正整數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)運行結果截圖

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)運行結果截圖

二、預習題

1、計算平均成績

給定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)運行結果截圖

三、預習的主要內容

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

2、當結構定義完成后,即創建了一種數據類型,可以像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類型。。

四、學習感悟

本周學習了字符串和字符指針,字符指針是指向字符的指針,所占內存單元存放的是所指字符的內存單元。定義方法為:char *p;還學習了常用的字符串處理函數 及用指針實現內存動態分配。。
對於本周的作業,我大部分是仿照書上的寫的,但是還是有很多地方不清楚,比如預習題用到的結構,還不太懂結構的具體用法。。

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

五、結對編程感想

本周三晚自習依舊是我們結對編程的時間,但是由於我和搭檔報了學校的活動,我們都沒有去教室編程,但我們在寢室一起寫了,感覺這次收獲挺多的,在寫題目的時候我們一起討論了很多問題,我們實行不懂就問對方,兩個都不懂就查資料或者問大佬。感覺還不錯。

六、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
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 字符串和字符指針、常用的字符串處理函數 及用指針實現內存動態分配 對於指針都不是特別懂

七、表格和折線圖

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM