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

 

 

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函數;

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM