天天看點

C進階第二次PTA作業

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)流程圖:

C進階第二次PTA作業

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語句中判斷條件中數字字元沒加單引号。

改正方法:數字字元要加單引号。

C進階第二次PTA作業

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:無

C進階第二次PTA作業

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.本題調試過程碰到問題及解決辦法:

C進階第二次PTA作業

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作業

C進階第二次PTA作業(2)

7-1 計算職工工資

C進階第二次PTA作業

第一步:定義一個結構體變量,結構體的名為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)流程圖

C進階第二次PTA作業
#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:

C進階第二次PTA作業

錯誤原因:在循環變量中i的初值為1,條件為i<=N;導緻結構體變量數組越界了。

改正方法:i的初值為0,條件為i<N;

C進階第二次PTA作業

7-2 計算平均成績

C進階第二次PTA作業

第一步:定義一個結構體結構體名稱為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;
}      
C進階第二次PTA作業

錯誤原因:學号(由5個數字組成的字元串)、姓名(長度小于10的不包含空白字元的非空字元串),是以就定義char num[5];char name[10];忽略了字元串還有結束标志'\0',是以就輸出錯誤

C進階第二次PTA作業

改正方法:将char num[5];char name[10];改成char num[6];char name[11];使字元串包含結束标志'\0'.

C進階第二次PTA作業

 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的值,

第六步:輸出分數小于六十的人的個數,輸出每個人的學号、姓名、等級。

C進階第二次PTA作業

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;
}       
C進階第二次PTA作業

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,使用選擇排序法進行排序按總分從高到低對這組資料進行排序,

第六步:輸出所有成員的學号,姓名,各科的分數和總分。

C進階第二次PTA作業
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:

C進階第二次PTA作業

錯誤原因:定義交換的temp為整型,他是不可能和結構體變量交換的

改正方法:定義temp為結構體變量就可以了

問題2:

C進階第二次PTA作業

錯誤的原因:在交換的時候由于馬虎将代碼打錯了

C進階第二次PTA作業

修改方法:将temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;改成temp=*(p+i);*(p+i)=*(p+t);*(p+t)=temp;

C進階第二次PTA作業

我所評論的人:

辛靜瑤: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

評論我的人:

陳天胤:

李新華:

申怡苗:

焦瑞君:

王文博:

C進階第二次PTA作業
C進階第二次PTA作業

 https://gitee.com/tmjl/c_advanced_second_times_pta_operation/tree/master

知識點:

結構體的辨別符 struct;在定義結構體變量時,不要忽略最後的分号

在結構體變量中,在編譯時對壘形勢不配置設定空間的,隻對其中的變量配置設定空間。

結構體變量的引用是   “.”運算符(成員運算符),優先級是最高的,對結構體變量的指派知更一個個指派,不能整體指派。

->  是指向運算符,p->n,表示得到p指向的結構體變量中的成員n的值。

結構體變量的變量名可以是數組,指針變量,在結構體中盡量多使用指針,可以減少編譯的時間,同時可以加深對指針的使用。

在做題時所使用的知識點:

選擇排序法;如何動态配置設定記憶體和相關的函數malloc,calloc函數;

結構體的定義與使用,如何對結構體變量指派;

->指向運算符;.是成員運算符;