2019春第八週做業

這個做業屬於哪一個課程 C語言程序設計II
這個做業要求在哪裏 2019年春季學期第八週做業
我在這個課程的目標是 我但願可以經過學習C語言的知識,編寫程序
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我掌握了經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配
參考文獻 函數實現字符串逆序C 標準庫 - <string.h> ,C 內存管理 ,C 庫函數 - strcmp()

1、本週完成的做業

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

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

函數接口定義:面試

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,s = 0, t,media;
    while(p[i] != 0)
       i ++;
    t = i - 1;
    while(s < t)
    {
        media = p[s];
        p[s] = p[t];
        p[t] = media;

        s ++;
        t --;
    }
}

2). 設計思路

3).本題調試過程碰到問題及解決辦法

遇到的問題:段錯誤,思路有問題,在沒有理解題意的狀況下就寫了這道題
解決的辦法:網上查找資料,聽助教的分析,得出了最終思路

4).運行結果截圖

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

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

函數接口定義:測試

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

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

裁判測試程序樣例:.net

#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 = 0,str_s = 0,str_t = 0;
   
   while(s[i] != '\0')
   {
     str_s ++;
     i ++;
   }
   i = 0;
   while(t[i] != '\0')
   {
        str_t ++;
        i ++;
   }
   
   int m = str_s,n = 0; 
   while(m < str_s+str_t && n < str_t)
   {
       s[m] = t[n];
       m ++;
       n ++;
   }
   return s;
}

2). 設計思路

3).本題調試過程碰到問題及解決辦法

遇到的問題:答案錯誤,忘記在最後循環裏將m,n遞增了
解決的辦法:在最後一個while中將m,n循環遞增

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 i, n;
    scanf("%d", &n);
    int* num;
    double average, max, min;
    
    num = (int *)malloc( n * sizeof(int) );
    
    for(i = 0;i < n;i ++)
       scanf("%d", num + i);

    for(i = 0;i < n;i ++)
       average += *(num + i);
    printf("average = %.2f\n", average/n);
    
    max = *num;
    for(i = 1;i < n;i ++)
    {
        if(max < *(num + i))
          max = *(num + i);
    } 
    printf("max = %.2f\n", max);

    min = *num;
    for(i = 1;i < n;i ++)
    {
        if(min > *(num + i))
          min = *(num + i);
    }
    printf("min = %.2f\n", min);

    free(num);
    return 0;
}

2). 設計思路

3).本題調試過程碰到問題及解決辦法

遇到的問題:編譯錯誤,查看錯誤提示,發現是忘記在輸入後加;了
解決的辦法:在第七行末加一個;

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()
{
    char a[5][81],color[81];
    for(int n = 0;n <= 5;n ++)
    {
        scanf("%s", &a[n]);
    }
    
    for(int i = 0;i < 4;i ++)
    {
       for(int j = 0;j < 4-i;j ++)
       {
            if(strcmp(a[j],a[j + 1]) > 0)
        {
            strcpy(color,a[j]);
            strcpy(a[j],a[j+1]);
            strcpy(a[j+1],color);

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

2). 設計思路

3).本題調試過程碰到問題及解決辦法

遇到的問題:答案錯誤,在判斷字符長度時有錯誤,後來在修改時發現新的思路就沒有用原來用ascii值來判斷了
解決的辦法:運用strcpy函數來交換字符串的位置

4).運行結果截圖

題目5. 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>
#include<stdlib.h>

struct student
{
  char num[6];
  char name[11];
  double grade;
};
int main()
{
  struct student g[1000];
  int i, N;
  double average = 0;
  scanf("%d", &N);
  for(i = 0;i < N;i ++)
  {
  scanf("%s %s %lf", &g[i].num, &g[i].name, &g[i].grade);
  }
  for(i = 0;i < N;i ++)
  {
    average += g[i].grade;
  }
  average = average / N;
  printf("%.2f\n",average);
  
  for(i = 0; i < N; i++)
  {
    if(g[i].grade < average)
    {
      printf("%s %s\n",g[i].name,g[i].num);
      
    }
  }
  return 0;
}

2). 設計思路

3).本題調試過程碰到問題及解決辦法

本題運用了上週使用結構體的經驗和本身的思路寫出來了,沒有錯誤。在最後參考了計算平均成績進行代碼優化.

4).運行結果截圖

挑戰做業

上幾周的挑戰做業,有同窗已經有些思路了,有思路的同窗請及時記錄下本身的思考或程序並發表,也請沒有完成的同窗不要放棄思考,繼續加油!

本週,咱們來作一作關於字符串的挑戰題:
九宮格鍵盤對應英語單詞
九宮格鍵盤通常能夠用於輸入字母。如用2能夠輸入A、B、C,用3能夠輸入D、E、F等。如圖所示:

對於號碼5869872,能夠依次輸出其表明的全部字母組合。如:JTMWTPA、JTMWTPB……
1.您是否能夠根據這樣的對應關係設計一個程序,儘量快地從這些字母組合中找到一個有意義的單詞來表述一個電話好嗎呢?如:能夠用單詞「computer」來描述號碼26678837.
2.對於一個電話號碼,是否能夠用一個單詞來表明呢?怎樣纔是最快的方法呢?顯然,確定不是全部的電話號碼都可以對應到單詞上去。可是根據問題1的解答,思路相對比較清晰。

題目來源:《編程之美——微軟技術面試心得》稍有修改

設計思路:

第一步 輸入1-9每一個數字分別可表明的字母
第二步 輸入電話號碼
第三步 找到每一個電話號碼可能造成的字符串
第四步 在這些字符串中找到有意義的單詞(這一步還不知道該怎麼作,查找資料ing)
第五步 輸出該單詞

2、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
3/2-3/8 20h 300行 數組,指針的大體意義,文件入門 數組串的使用,指針
3/9-3/15 25h 400行 二維數組,文件與數組的結合運用 雙for循環的流程圖(再不上課,光自學感受太艱難了)
3/16-3/22 22h 450行 一維數組,二維數組,幾種數組排序法 字符串使用
3/23-3/29 20h 350行 字符串的定義及其使用 指針的具體使用
3/30-4/5 15h 340行 指針變量的定義,使用,初始化及其基本運算,指針做爲函數參數的做用;使用指針實現函數調用返回多個值 指針在運行時內存的變化
4/6-4/12 13h 400行 數組名做爲函數參數的用法,理解指針、數組和地址之間的關係,指針和數組能夠實現相同的操做,結構體的定義,使用 結構體的具體使用,結構體的流程圖
4/13-4/19 18h 500行 經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 結構體的流程圖

3、學習感悟

心得:

(1) 學習內容:
1. 掌握經常使用字符串函數以及使用指針操做字符串的方法
2. 掌握動態內存分配
3. 結構體的使用
收穫:
(2) 難點: 動態內存的使用
解決的方法:在菜鳥教程裏搜索,看例題的具體使用方法

4、結對編程

1.結對編程過程

本週由於沒有分配好學習和休息的時間致使在寫做業的時候腦子跟不上,常常想不到思路,可是還好個人搭檔(本週我隨機分配到的搭檔仍是沒有出現,因此我找的是回學校了的學委😄)在我不行的時候慢慢教我,讓我跟上了做業進度,感謝大佬救了我。

2.結對編程的優缺點

優勢:1.在我狀態不對的時候撈我一把
2.提供多,新的思路
3. 學習效率更高
缺點: 這個學期已通過了大半了,你們的學習狀態也以及進入了疲憊期,因此在結對編程的過程當中容易出現兩我的都卡殼卡到放棄的狀態。

完成做業的消耗時間:15h

相關文章
相關標籤/搜索