這個做業屬於哪一個課程 | C語言程序設計ll |
這個做業要求在哪裏 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/3076 |
我在這個課程的目標是 | 瞭解並學習經常使用的字符串處理函數和用指針實現內存動態分配 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我瞭解和學習了經常使用的字符串處理函數和用指針實現內存動態分配的知識 |
參考文獻 | 書本8.4電碼加密和8.5任意個整數求和的內容和百度的一些資料 |
本題要求實現一個字符串逆序的簡單函數。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
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 ; }
問題:出現ISO C++ forbids comparison between pointer and integer的提示
解決方法:
錯誤代碼:數組
if(p[i]!="\0")
改正後的代碼:函數
if(p[i]!='\0')
解釋:兩種不一樣類型的數據不能作比較,p[i]表示的是一個字符,「\0」表示的是一個字符串的地址,因此應該把「\0」改成‘\0’學習
本題要求實現一個函數,將兩個字符串鏈接起來。測試
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
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; }
問題:for語句中條件有誤,致使編譯運行結果錯誤
解決方法:得把*s改成s[i]或者直接把整個for語句中的數組改成指針。設計
本題要求編寫程序,根據輸入學生的成績,統計並輸出學生的平均成績、最高成績和最低成績。建議使用動態內存分配來實現。3d
輸入第一行首先給出一個正整數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 (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; }
問題1:輸入指針的時候,scanf裏面加了取地址符號,報錯
解決方法:將取地址符號刪去,輸入指針時不能運用取地址符號
問題2:在代碼裏所有定義的整型,沒定義浮點型
解決方法:好久沒注意過這點了,把須要改的改回浮點型,再編譯
本題要求編寫程序,讀入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 (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; }
問題1:scanf語句沒有用一個單獨的for語句編寫,報錯;for語句裏面沒有注意sx[i]的用法
解決方法:把scanf語句單獨編寫;改正for語句裏面的數組用法。
給定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> 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; }
問題1:在dev-c++中,有時候數組長度能夠用變量,可是通常又不能夠
解決方法:C語言中數組長度必須爲常量,有些的不同,但C語言中必須注意。
問題2:沒有把num定義爲數組,結果致使結果出不來
解決方法:把num定義爲num[5],結果正確。
問題3:for語句中的條件問題,i=1時會缺乏一部分。
解決方法:改成i=0便答案正確,我也不知道是啥緣由,好像是由於數組的定義。
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
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 | 經常使用的字符串處理函數和用指針實現內存動態分配 | 關於指針內存動態分配還不太熟悉 |
時間 | 代碼行數 | 博客字數 |
---|---|---|
第一週 | 39 | 798 |
第二週 | 35 | 923 |
第三週 | 110 | 1071 |
第四周 | 111 | 1713 |
第五週 | 78 | 1878 |
第六週 | 102 | 2991 |
第七週 | 96 | 2618 |
第八週 | 129 | 3011 |