6-7 刪除字符串中數字字符
1.設計思路:
(1)算法:
第一步:定義一個字符數組item,輸入一個字符串賦給字符數組item。調用函數delnum,
第二步:在函數delnum中定義循環變量i=0,和變量j=0,
第三步:借助for循環表達式二條件為*(s+i)!='\0',如果*(s+i)不是數字就執行*(s+j)=*(s+i),j++,否則什么都不執行,然后i++,
第四步:*(s+j)='\0'
第五步:輸出字符串item
(2)流程圖:
2.實驗代碼:
void delnum(char *s){ int i,j=0; for(i=0;*(s+i)!='\0';i++){ if(*(s+i)>='0'&&*(s+i)<='9'){ }else{ *(s+j)=*(s+i); j++; } } *(s+j)='\0'; }
3.本題調試過程碰到問題及解決辦法:
錯誤信息1:編譯錯誤
錯誤原因:在if語句中判斷條件中數字字符沒加單引號。
改正方法:數字字符要加單引號。
6-8 統計子串在母串出現的次數
1.設計思路:
(1)算法:
第一步:定義字符數組str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd",定義整型數字n的值為函數fun(str,substr)
第二步:在函數fun中定義循環變量i=0,count=0;
第三步:在for循環中判斷條件為*(str+i)!='\0',如果*(str+i)==*(substr)成立並且*(str+i+1)==*(substr+1)和*(str+i+2)==*(substr+2)同時成立,count++;否則什么都不執行,i++
第四步:輸出n;
(2)流程圖:
略
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; }
目前的代碼只能解決題目,而不具備通用性,
修改后的代碼如下:
int fun(char *str,char *substr) { int i=0,j=0,k=0,count=0; for(i=0;str[i]!='\0';i++) { for(j=i,k=0;str[j]==substr[k];j++,k++)//起始的判斷條件為str的第i個元素與substr的第0個元素是否相等 if(substr[k+1]=='\0') { count++; } } } return count; }
3.本題調試過程碰到問題及解決辦法:
錯誤信息1:無
6-9 字符串中除首尾字符外的其余字符按降序排列
1.設計思路:
(1)算法:
第一步:定義一個字符數組s[10],
第二步:輸入一個字符串賦給s[10],
第三步:調用函數fun,
第四步:在函數fun中對數組元素除了首尾元素外進行選擇排序,並從大到小排列,
第五步:輸出字符串s,
(2)流程圖:
2.實驗代碼:
int fun(char *s,int num){ int i,j,k,temp; for(i=1;i<num-2;i++){ k=i; for(j=i+1;j<num-1;j++){ if((int)(*(s+k))<(int)(*(s+j))){ k=j; } } if(k!=i){ temp=*(s+i);*(s+i)=*(s+k);*(s+k)=temp; } } return 0; }
3.3.本題調試過程碰到問題及解決辦法:
7-1 輸出學生成績
1.設計思路:
(1).算法
第一步:定義浮點型數sum=0,average,max,min整型數i,n
第二步:對n賦值,
第三步:定義指針變量p為浮點型,借助malloc函數申請連續內存空間,內存為n,
第四步:輸入n個數據一次賦值給*(p+i),並求出總分數sum,
第五步:借助for循環找出最大成績賦給max最小成績賦給min,
第六步:輸出平均數 最高成績和最低成績,
(2)流程圖:
2.實驗代碼:
#include <stdio.h> #include <stdlib.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+=*(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.本題調試過程碰到問題及解決辦法:
碰到的問題:不會使用malloc函數不知道如何在內存的動態存儲區中分配連續內存空間,
解決辦法:用手機在百度上搜索在CSDN博客中了解如何使用。
malloc函數:
函數原型為 void *malloc(unsigned int size);
malloc(100);/*開辟100個字節的臨時分配域,返回值為其第一個字節的地址*/
例如:int *p=malloc(100)/*開辟100個字節的臨時分配域把起始地址賦給整型指針變量p*/
calloc函數:
函數原型為void *calloc(unsigned n,unsigned size);
例如:int *p=calloc(50,4)/*開辟50個字節的臨時分配域,每個分配域的大小為4(整型),,把起始位置賦給指針變量p。
C高級第二次PTA作業(2)
7-1 計算職工工資
1.設計思路:
(1)算法:
第一步:定義一個結構體變量,結構體的名為wage,結構體中的成員為定義指針數組name[10],浮點型數字base_pay,floating_wage,expend,net_payroll,
第二步:在主函數中定義整型變量N,i,讀入一個數字賦給N。
第三步:聲明結構體的變量名,結構體的變量名為數組salary[N];
第四步:i=0,借助一個for循環對結構體變量進行賦值,並且求出結構體變量中的結構體變量salary[i].net_payroll=salary[i].base_pay+salary[i].floating_wage-salary[i].expend
第五步:i=0,借助for循環輸出每一位職員的姓名和實發工資及輸出salary[i].name,salary[i].net_payroll。
(2)流程圖
2.實驗代碼:
#include <stdio.h>
#include <stdlib.h>
struct wage{ char name[10]; float base_pay; float floating_wage; float expend; float net_payroll; }; int main() { int N,i; scanf("%d",&N); struct wage salary[N]; for(i=0;i<N;i++){ scanf("%s %f %f %f",salary[i].name,&salary[i].base_pay,&salary[i].floating_wage,&salary[i].expend); salary[i].net_payroll=salary[i].base_pay+salary[i].floating_wage-salary[i].expend*1.0; } for(i=0;i<N;i++){ printf("%s %.2f\n",salary[i].name,salary[i].net_payroll); } return 0; }
3.本題調試過程碰到問題及解決辦法:
錯誤信息1:
錯誤原因:在循環變量中i的初值為1,條件為i<=N;導致結構體變量數組越界了。
改正方法:i的初值為0,條件為i<N;
7-2 計算平均成績
1.設計思路:
(1)算法:
第一步:定義一個結構體結構體名稱為information,在結構體變量中成員有字符數組num[6]和name[11],整型變量grade。
第二步:在主函數中定義征信變量i和n,浮點型數average=0,整型數sum=0,讀入一個數賦給n。
第三步:聲明結構體的變量名為數組information massage[n]。
第四步:i=0,借助for循環條件為i<n,對結構體變量名information massage[i]賦值。求出sum=sum+massage[i].grade。
第五步:求出average=um*1.0/n,輸出average。
第六步:i=0,借助for循環,判斷條件為i<n,輸出
(2)流程圖:
2.實驗代碼:
錯誤的代碼:
#include <stdio.h>
#include <stdlib.h>
struct information{ char num[5]; char name[10]; int grade; }; int main() { int i,N; float average=0; int sum=0; scanf("%d",&N); struct information massage[N]; if(N>0&&N<=10){ for(i=0;i<N;i++){ scanf("%s %s %d",massage[i].num,massage[i].name,&massage[i].grade); sum=sum+massage[i].grade; } average=sum*1.0/N; printf("%.2f\n",average); for(i=0;i<N;i++){ if(average>massage[i].grade){ printf("%s %s\n",massage[i].name,massage[i].num); } } } return 0; }
修改后的正確代碼:
#include <stdio.h>
#include <stdlib.h>
struct information{ char num[6]; char name[11]; int grade; }; int main() { int i,N; float average=0; int sum=0; scanf("%d",&N); struct information massage[N]; if(N>0&&N<=10){ for(i=0;i<N;i++){ scanf("%s %s %d",massage[i].num,massage[i].name,&massage[i].grade); sum=sum+massage[i].grade; } average=sum*1.0/N; printf("%.2f\n",average); for(i=0;i<N;i++){ if(average>massage[i].grade){ printf("%s %s\n",massage[i].name,massage[i].num); } } } return 0; }
3.本題調試過程碰到問題及解決辦法:
錯誤信息1:
錯誤原因:學號(由5個數字組成的字符串)、姓名(長度小於10的不包含空白字符的非空字符串),所以就定義char num[5];char name[10];忽略了字符串還有結束標志'\0',所以就輸出錯誤
改正方法:將char num[5];char name[10];改成char num[6];char name[11];使字符串包含結束標志'\0'.
C高級PTA作業(3)
6-1 按等級統計學生成績
1.設計思路:
(1)算法: 第一步:定義結構體類型變量,結構體名為student,結構體中的成員包括整型num,字符數組name[20],整型score,字符型grade。
第二步:定義結構體變量名為stu[10],*ptr。定義整型變量n,i,count。ptr=stu,讀入一個書賦給n。
第三步:i=0,借助for循環對stu[i]賦值,條件為i<n。
第四步:調用set_grade函數,將函數的返回值賦給count。
第五步:在set_grade函數中,定義整型變量i,q=0。i=0,借助for循環判斷p->score是否<60,成立q++,否則什么都不執行,在for循環中判斷p->score屬於什么等級,將等級賦給p->grade,返回q的值,
第六步:輸出分數小於六十的人的個數,輸出每個人的學號、姓名、等級。
(2)流程圖:
2實驗代碼:
int set_grade( struct student *p, int n ){
int i,q=0; for(i=0;i<n;i++,p++){ if(p->score<60){ q++; } 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 q; }
3.本題調試過程碰到問題及解決辦法:
6-2 結構體數組按總分排序
1.設計思路:
(1)算法:
第一步:定義結構體變量,結構體名為student,結構體的成員包括整型num,字符數組name[15],浮點型數組score[3],浮點型sum。
第二步:在主函數中定義結構體變量名為stu[5],整型變量i,j,浮點型數字f。
第三步:i=0,借助for循環對結構體變量stu[5]賦值,
第四步:調用calc函數,在calc函數中定義整型=0i,借助for循環求出(p+i)->sum的值,(p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2],
第五步:調用sort函數,在sort函數中定義整型i,j,t,定義結構體變量,變量名為temp,使用選擇排序法進行排序按總分從高到低對這組數據進行排序,
第六步:輸出所有成員的學號,姓名,各科的分數和總分。
(2)流程圖:
2.實驗代碼:
void calc(struct student *p,int n){
int i; for(i=0;i<n;i++){ (p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2]; } } void sort(struct student *p,int n){ int i,j,t; struct student temp; for(i=0;i<n-1;i++){ t=i; for(j=i;j<n;j++){ if(((p+t)->sum)<((p+j)->sum)){ t=j; } } if(t!=i){ temp=*(p+i);*(p+i)=*(p+t);*(p+t)=temp; } } }
3.本題調試過程碰到問題及解決辦法:
問題1:
錯誤原因:定義交換的temp為整型,他是不可能和結構體變量交換的
改正方法:定義temp為結構體變量就可以了
問題2:
錯誤的原因:在交換的時候由於馬虎將代碼打錯了
修改方法:將temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;改成temp=*(p+i);*(p+i)=*(p+t);*(p+t)=temp;
我所評論的人:
辛靜瑤:http://www.cnblogs.com/X-JY/p/8652592.html
姜健:http://www.cnblogs.com/jj990519/
袁中:http://www.cnblogs.com/2719610441qqcom/p/8660431.html
李新華:http://www.cnblogs.com/Lixinhua18/p/8671886.html
評論我的人:
陳天胤:
李新華:
申怡苗:
焦瑞君:
王文博:
https://gitee.com/tmjl/c_advanced_second_times_pta_operation/tree/master
知識點:
結構體的標識符 struct;在定義結構體變量時,不要忽略最后的分號
在結構體變量中,在編譯時對壘形勢不分配空間的,只對其中的變量分配空間。
結構體變量的引用是 “.”運算符(成員運算符),優先級是最高的,對結構體變量的賦值知更一個個賦值,不能整體賦值。
-> 是指向運算符,p->n,表示得到p指向的結構體變量中的成員n的值。
結構體變量的變量名可以是數組,指針變量,在結構體中盡量多使用指針,可以減少編譯的時間,同時可以加深對指針的使用。
在做題時所使用的知識點:
選擇排序法;如何動態分配內存和相關的函數malloc,calloc函數;
結構體的定義與使用,如何對結構體變量賦值;
->指向運算符;.是成員運算符;