這個做業屬於哪一個課程 | C語言程序設計II |
這個做業要求在哪裏 | 2019年春季學期第八週做業 |
我在這個課程的目標是 | 我但願可以經過學習C語言的知識,編寫程序 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我掌握了經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 |
參考文獻 | 函數實現字符串逆序,C 標準庫 - <string.h> ,C 內存管理 ,C 庫函數 - strcmp() |
本題要求實現一個字符串逆序的簡單函數。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
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 --; } }
本題要求實現一個函數,將兩個字符串鏈接起來。學習
函數接口定義:測試
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
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; }
本題要求編寫程序,根據輸入學生的成績,統計並輸出學生的平均成績、最高成績和最低成績。建議使用動態內存分配來實現。
輸入格式:
輸入第一行首先給出一個正整數N,表示學生的個數。接下來一行給出N個學生的成績,數字間以空格分隔。
輸出格式:
按照如下格式輸出:
average = 平均成績 max = 最高成績 min = 最低成績
結果均保留兩位小數。
輸入樣例:
3 85 90 95
輸出樣例:
average = 90.00 max = 95.00 min = 85.00
#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; }
本題要求編寫程序,讀入5個字符串,按由小到大的順序輸出。
輸入格式:
輸入爲由空格分隔的5個非空字符串,每一個字符串不包括空格、製表符、換行符等空白字符,長度小於80。
輸出格式:
按照如下格式輸出排序後的結果:
After sorted: 每行一個字符串
輸入樣例:
red yellow blue green white
輸出樣例:
After sorted: blue green red white yellow
#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; }
給定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
#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能夠輸入A、B、C,用3能夠輸入D、E、F等。如圖所示:
對於號碼5869872,能夠依次輸出其表明的全部字母組合。如:JTMWTPA、JTMWTPB……
1.您是否能夠根據這樣的對應關係設計一個程序,儘量快地從這些字母組合中找到一個有意義的單詞來表述一個電話好嗎呢?如:能夠用單詞「computer」來描述號碼26678837.
2.對於一個電話號碼,是否能夠用一個單詞來表明呢?怎樣纔是最快的方法呢?顯然,確定不是全部的電話號碼都可以對應到單詞上去。可是根據問題1的解答,思路相對比較清晰。
題目來源:《編程之美——微軟技術面試心得》稍有修改
第一步 輸入1-9每一個數字分別可表明的字母
第二步 輸入電話號碼
第三步 找到每一個電話號碼可能造成的字符串
第四步 在這些字符串中找到有意義的單詞(這一步還不知道該怎麼作,查找資料ing)
第五步 輸出該單詞
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
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行 | 經常使用字符串函數以及使用指針操做字符串的方法,掌握動態內存分配 | 結構體的流程圖 |