2018上C語言程序設計(高級)作業- 第2次作業
作業要求一 :
作業要求二:
6-7 刪除字符串中數字字符
1.設計思路
(1)主要描述算法:
第一步:根據函數接口定義和要求可知本題要起實現刪除一個字符串中的所有數字字符
第二步:首先定義一個數組,i和m。在for循環語句中判斷,如果*(s+i)在0和9之間輸出,否則繼續執行。
第三步:直到*(s+m)=‘\0‘結束
(2)流程圖:
主函數:
調用函數 delnum:
2.實驗代碼:
void delnum(char *s) { int i,m=0; for(i=0;*(s+i)!=‘\0‘;i++) { if(*(s+i)>=‘0‘&&*(s+i)<=‘9‘) { }else { *(s+m)=*(s+i); m++; } } *(s+m)=‘\0‘; }
3.本題調試過程碰到問題及解決辦法
遇到的問題1:if語句出現了錯誤,沒有將數字用單引號表示。
改正方法:加上引號之後錯誤就沒有了。
遇到的問題2:for語句的判斷條件中,等於和不等於條件弄反了。
改正方法:應該是*(s+i)!=‘\0‘
6-8 統計子串在母串出現的次數:
1.設計思路
主要描述算法:
第一步:根據函數接口定義和要求可知本題要編寫一個函數,該函數可以統計一個長度為3的字符串在另一個字符串中出現的次數。
第二步:首先定義兩個char類型的數組,分別是輸入的字符串和要求統計的字符串。
第三步:通過指針傳遞,調用fun函數,利用for循環和if語句判斷,如果*(str+i)!=‘\0‘成立,且if中各項成立,則count++,否則不執行。
第四步:返回主函數,輸出出現次數。
2.實驗代碼:
int fun(char *str,char *substr) { int i,count=0;for(i=0;*(str+i)!=‘\0‘;i++) { if(*(str+i)==*(substr)) { if(*(str+i+1)==*(substr+1)) { if(*(str+i+2)==*(substr+2)) { count++; } } } } return count; }
3.本題調試過程碰到問題及解決辦法:
遇到的問題1:將for語句中的*(str+i)!=‘\0‘的情況判斷成*(str+i)=‘\0‘,導致編譯答案錯誤
改正方法:加上一個“!”符號,運行成功。
遇到的問題2:沒有將調用函數返回主函數。
改正方法:將return count寫入程序,編譯成功。
6-9 字符串中除首尾字符外的其余字符按降序排列:
1.設計思路:
主要描述算法:
第一步:根據函數接口定義和要求可知本題要編寫函數fun,對字符串中除首、尾字符外的其余字符按降序排列。
第二步:首先定義一個char類型的數組,儲存輸入的字符串。
第三步:通過指針傳遞,調用fun函數,對字符指針所指的字符串中除首、尾字符外的其余字符按降序排列。
第四步:返回主函數,輸出s.
2.實驗代碼;
int fun(char *s,int num) { int i,m,n,temp; for(i=1;i<num-2;i++) { n=i; for(m=i+1;m<num-1;m++) { if((*(s+n))<(int)(*(s+m))) { n=m; } } if(n!=i) { temp=*(s+i);*(s+i)=*(s+n);*(s+n)=temp; } } return 0; }
3.本題調試過程碰到問題及解決辦法:
遇到的問題:不明白為什麽要在for循環裏用i<num-2
改正方法:翻看上學期的講的內容,又問了同學,解決了這個問題。
7-1 輸出學生成績:
1.設計思路:
主要描述算法
第一步:根據函數接口定義和要求可知本題要根據輸入學生的成績,統計並輸出學生的平均成績、最高成績和最低成績。
第二步:首先定義學生個數,平均數,最大值,最小值。對n賦值,將指針變量p定義為浮點型,通過malloc函數申請連續內存空間n
第三步:輸入n個數據賦值給*(p+i),求出sum,通過for循環找出成績最大值賦給max,成績最小值賦給min,最後輸出平均數 最高成績和最低成績。
2.實驗代碼:
#include <stdio.h> int main() { int i,n; float sum=0,average,max,min; scanf("%d",&n); float *p=(float *)malloc(n); for(i=0;i<n;i++) { scanf("%f",(p+i)); sum=sum+*(p+i); } min=*(p+0); max=*(p+0); for(i=0;i<n;i++) { if(min>*(p+i)) { min=*(p+i); } if(max<*(p+i)) { max=*(p+i); } } printf("average = %.2f\n",sum/n*1.0); printf("max = %.2f\n",max); printf("min = %.2f\n",min); return 0; }
3.本題調試過程碰到問題及解決辦法:
遇到的問題:由於之前沒有用average,而在輸出的時候卻用了,導致答案錯誤。
改正方法:應將average改成用sum表示的平均數。
7-1 計算職工工資:
1.設計思路;
(1)主要描述算法:
第一步:本題是要求用結構的方式,來計算工資。就要用到結構體 struct...
第二步:首先在主函數前面定義結構struct staff,其中包含姓名及工資信息。
第三步:在主函數內定義結構變量struct staff s1,在for循環裏輸入並打印工資信息,如s1.num。通過計算,輸出職工工資。
(2)流程圖:
2.實驗代碼;
#include <stdio.h> //#include <stdlib.h> struct staff { char name[10]; float b,f,out; float reality; }; int main() { int i,n; struct staff s1,reality; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%s %f %f %f",s1.name,&s1.b,&s1.f,&s1.out); s1.reality=(s1.b+s1.f-s1.out); printf("%s %.2f\n",s1.name,s1.reality); } return 0; }
3.本題調試過程碰到問題及解決辦法:
遇到的問題1:將printf("%s %.2f\n",s1.name,s1.reality)寫在for循環外面,結果是邊輸入邊輸出,答案不符合要求
改正方法:將printf("%s %.2f\n",s1.name,s1.reality)寫在for循環外面,編譯成功。
遇到的問題2:公式中的符號用錯了。
改正方法:仔細看了遍公式,編譯成功。
7-2 計算平均成績;
1.設計思路:
主要描述算法:
第一步:本題是要求用結構的方式,來計算學生成績。用到結構體 struct...
第二步:首先在主函數前面定義結構struct student,其中包含姓名及學生基本信息。
第三步:在主函數內定義數組結構變量struct student s1[N],在for循環裏輸入並打印學生基本信息。計算總和。計算平均值。在另一個for循環裏,將每個人的成績與平均值進行比較,輸出小於平均值的學生信息。
2.實驗代碼:
#include <stdio.h> //#include <stdlib.h> struct student { char num[6]; char name[10]; int grade; }; int main() { double average; int N,i,sum=0; scanf("%d",&N); struct student s1[N]; for(i=0;i<N;i++) { scanf("%s %s %d",s1[i].num,s1[i].name,&s1[i].grade); sum=sum+s1[i].grade; } average=sum/N; printf("%.2f\n",average); for(i=0;i<N;i++) { if(average>s1[i].grade) { printf("%s %s\n",s1[i].name,s1[i].num); } } //system("pause"); return 0; }
3.本題調試過程碰到問題及解決辦法:
遇到的問題:在定義數組的時候,出現段錯誤。
改正方法:再看了討論小組的討論後明白如果定義的數組長度不夠就會出現段錯誤的情況。
6-1 按等級統計學生成績:
1.設計思路:
(1)主要描述算法
第一步:本題是要求用結構數組指針的方式實現一個根據學生成績設置其等級,並統計不及格人數的簡單函數。
第二步:定義結構體類型變量,結構體名為student,結構體中的成員包括整型num,字符數組name[20],整型score和字符型grade。定義結構體變量名為stu[10],*ptr。
第三步:調用set_grade函數,將函數返回count。在set_grade函數中,通過for循環判斷p->score是否<60,成立m++,否則不執行。再判斷等級,返回m的值。輸出個數,每個人的學號、姓名、等級。
(2)流程圖:
2.實驗代碼:
int set_grade( struct student *p, int n ) { int i,m=0; for(i=0;i<n;i++,p++) { if(p->score<60) { m++; } if((p->score>=85)&&(p->score<=100)) { p->grade =‘A‘; }else if((p->score>=70)&&(p->score<=84)) { p->grade =‘B‘; }else if((p->score>=60)&&(p->score<=69)) { p->grade=‘C‘; }else{ p->grade=‘D‘; } } return m; }
3.本題調試過程碰到問題及解決辦法:
遇到的問題1:在執行else時,沒有給出另一種情況的語句。
改正方法:要在for後給出else if 的判斷語句。
6-2 結構體數組按總分排序:
1.設計思路:
主要描述算法
第一步:本題是要求用結構數組指針的方式實現按成績總和從高到低對數據進行排序。
第二步:本題有兩個調用函數,1.調用calc函數,在calc函數中通過兩個for循環求出各自分數總和(p+i)->sum的值;2.調用sort函數,在sort函數中定義整型i,j,m,定義結構體變量,變量名為temp,通過選擇排序法對這組數據進行排序
第三步:輸出成員的學號,姓名,各科的分數和總分。
2.實驗代碼:
void calc(struct student *p,int n) { struct student sum; int i,j=0; for(i=0;i<n;i++) { for(j=0;j<3;j++) (p+i)->sum=(p+i)->sum+(p+i)->score[j]; } } void sort(struct student *p,int n) { int i,j,m; struct student temp; for(i=0;i<n-1;i++) { m=i; for(j=i;j<n;j++) { if(((p+m)->sum)<((p+j)->sum)) { m=j; } } if(m!=i) { temp=*(p+i); *(p+i)=*(p+m); *(p+m)=temp; } } }
3.本題調試過程碰到問題及解決辦法:
遇到的問題:在求分數和的時候,把數組score寫成了單個數組
改正方法:應改為score[j].
學習總結和進度:
1、總結兩周裏所學的知識點有哪些學會了?(可記錄每道作業題目所用的知識點)哪些還沒有學會?
這兩周主要學習了結構以及有關結構的應用。首先學習的就是對結構體的概念和定義,學到了結構要定義在主函數外面,而且在運用時要定義結構變量。之後學習到結構數組,還有結構與指針的結合,學到了一個重要的結構指針引用格式p->結構成員名。
在做前兩次的pta時覺得還可以理解,但是第三次的時候就感覺有些困難了,證明還是掌握的不熟練,要多加練習。
點評同學:
孫銘婧:http://www.cnblogs.com/sun031915/p/8687824.html
張心悅:http://www.cnblogs.com/zxy980612/p/8696690.html
吳曉明:http://www.cnblogs.com/gu-an-cheng-wxm/p/8697025.html
學習進度表:
2018上C語言程序設計(高級)作業- 第2次作業