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 統計子串在母串出現的次數
第一步:定義字元數組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;
略
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;
}
錯誤資訊1:無
6-9 字元串中除首尾字元外的其餘字元按降序排列
第一步:定義一個字元數組s[10],
第二步:輸入一個字元串賦給s[10],
第三步:調用函數fun,
第四步:在函數fun中對數組元素除了首尾元素外進行選擇排序,并從大到小排列,
第五步:輸出字元串s,
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).算法
第一步:定義浮點型數sum=0,average,max,min整型數i,n
第二步:對n指派,
第三步:定義指針變量p為浮點型,借助malloc函數申請連續記憶體空間,記憶體為n,
第四步:輸入n個資料一次指派給*(p+i),并求出總分數sum,
第五步:借助for循環找出最大成績賦給max最小成績賦給min,
第六步:輸出平均數 最高成績和最低成績,
#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;
}
碰到的問題:不會使用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 計算職工工資
第一步:定義一個結構體變量,結構體的名為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)流程圖
#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;
}
錯誤資訊1:
錯誤原因:在循環變量中i的初值為1,條件為i<=N;導緻結構體變量數組越界了。
改正方法:i的初值為0,條件為i<N;
7-2 計算平均成績
第一步:定義一個結構體結構體名稱為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,輸出
錯誤的代碼:
#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;
}
錯誤原因:學号(由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)算法: 第一步:定義結構體類型變量,結構體名為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實驗代碼:
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;
}
6-2 結構體數組按總分排序
第一步:定義結構體變量,結構體名為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,使用選擇排序法進行排序按總分從高到低對這組資料進行排序,
第六步:輸出所有成員的學号,姓名,各科的分數和總分。
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;
}
}
}
問題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函數;
結構體的定義與使用,如何對結構體變量指派;
->指向運算符;.是成員運算符;