作業要求二
第一次PTA
題目6-7删除字元串中數字字元
1.設計思路
(1).描述算法:
第一步:閱讀題目,明确題意要求。
第二步:找到對應函數中的實參和形參并寫出函數接口。
第三步:重新定義一個指針變量*a,對*s中的字元進行周遊。
第四步:若s[]中的字元不在‘0’到‘9’中,則将字元儲存在a[]中。
(2).流程圖:

2.實驗代碼:
void delnum(char *s)
{ int i,j;
char *a=s;
for(i=0,j=0;s[i]!='\0';i++)
{
if(s[i]<'0'||s[i]>'9')
{
a[j]=s[i];
j++;
}
}
a[j]='\0' ;
}
3.本題調試過程碰到的問題和解決辦法
錯誤資訊:答案錯誤。
錯誤原因:在儲存字元串結束後,沒有加結束标志'\0';沒有将指針*a指向s最後輸出的還是原來的字元串。
改正方法:在循環結束後,加一個a[j]='\0';定義指針字元串時,讓其指向s。
題目6-8統計子串在母串出現的次數
第一步:閱讀題目,明确題意要求。
第二步:找到對應函數中的實參和形參并寫出函數接口。
第三步:周遊一次母串,并且母串的周遊的每一個字元都要和字串的第一個字元比較,如果相等的話,這時候母串和字串開始同時周遊。
第四步:當滿足一次子串能夠周遊到結束符的時候,說明子串出現,num++;
int fun(char *str,char *substr)
{
int i,j,k,num;
for(i=0;str[i]!='\0';i++)
{
for(j=i,k=0;substr[k]==str[j];k++,j++)
{
if(substr[k+1]=='\0')
{
num++;
break;
}
}
}
return num;
}
3.本題調試過程碰到的問題和解決辦法(無)
題目6-9字元串中除首尾字元外的其餘字元按降序排列
第一步:閱讀題目,明确題意要求。
第二步:找到對應函數中的實參和形參并寫出函數接口。
第三步:從s中的第二個字元元素開始經行周遊,直到倒數第二個字元元素(也就是第一個和最後一個字元元素不進行判斷)。
第三步:然後再讓相鄰的兩個字元元素進行比較,若是s[i]>s[i-1],重新定義一個字元串,進行交換,否則i++,繼續判斷。
2.實驗代碼
int fun(char *s,int num)
{
int i=1,j=1;
int len;
strlen(len);
for(i=1;i<len-1;i++)
{
for(j=1;j<i;j++)
{
if(s[i]>s[j])
{
char *t;
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
錯誤資訊:
錯誤原因:
改正方法:
題目7-1. 輸出學生成績
1.設計思路:
(1)描述算法:
第一步:輸入人數n;
第二步:分别輸入n個人的分數,并求和;
第三步:用一次循環,比較出n個人分數的最大值,最小值;
第四步:按題意輸出。
#include <stdio.h>
int main()
{
int i,n,a[n];
float sum = 0,average = 0,max,min;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum = sum + a[i];
}
max = a[0];
min = a[0];
for(i=0;i<n;i++)
{
if(a[i]>max)
{
max=a[i];
}
if(a[i]<min)
{
min=a[i];
}
}
printf("average = %.2f\nmax = %.2f\nmin = %.2f",sum/n,max,min);
return 0;
}
第二次PTA
題目7-1 計算職工工資
第一步:定義結構類型。
第二步:輸入人數n,再用一個for循環輸入n個職員的資訊。
第三步:for循環分别輸出每位職員的實發工資。
#include <stdio.h>
struct staff
{
char name[1000];
float fixation;
float floating;
float outlay;
float salary;
}a[1000];
int main()
{
int i,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s%f%f%f",a[i].name,&a[i].fixation,&a[i].floating,&a[i].outlay);
a[i].salary=a[i].fixation+a[i].floating-a[i].outlay;
}
for(i=0;i<n;i++)
{
printf("%s %.2f\n",a[i].name,a[i].salary);
}
return 0;
}
錯誤資訊:部分錯誤
錯誤原因:定義的數組過小
改正方法:将name[10],a[10]改為name[1000],a[1000].
題目7-2 計算平均成績
第一步:定義結構類型
第二步:輸入人數n,再用一個for循環輸入每個人的資訊,并求出總的分數和。
第三步:在for循環中判斷是否每個人的分數小于平均數,若小于則輸出名字和學号。
#include <stdio.h>
struct student
{
char s[1000];
char name[1000];
int code;
};
int main()
{
int i,N,sum=0;
double average;
struct student a[1000];
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%s %s %d",a[i].s,a[i].name,&a[i].code);
sum = sum + a[i].code;
}
average=sum/N*1.0;
printf("%.2f\n",average);
for(i=0;i<N;i++)
{
if(a[i].code<average)
{
printf("%s %s\n",a[i].name,a[i].s);
}
}
return 0;
}
(1)錯誤資訊:編譯錯誤。
錯誤原因:sum定義成了結構類型。
改正原因:因為sum是所有人的分數和,是以不能定義成結構類型,應該定義成整型。
(2)錯誤資訊:格式錯誤
錯誤原因:在輸出後沒有加‘\n’。
第三次PTA
題目6-1 按等級統計學生成績
第一步:閱讀題目,明确題意要求。
第二步:找到對應函數中的實參和形參并寫出函數接口。
第三步:在for循環中,周遊每個學生的成績,然後做判斷。
第四步:根據判斷,确定成績等級。
int set_grade( struct student *p, int n )
{
int i;
int count = 0;
for(i=0;i<n;i++,p++)
{
if(p->score<60)
{
p->grade = 'D';
count++;
}else if(( p->score>=85)&&(p->score<=100))
{
p->grade = 'A';
}else if(( p->score>=70)&&(p->score<85))
{
p->grade = 'B';
}else
{
p->grade = 'C';
}
}
return count;
}
3.本題調試過程碰到的問題和解決辦法:
錯誤資訊:答案錯誤
錯誤原因:if做判斷時,沒有考慮到1-100内的所有數字。
改正方法:認真檢查哪裡需要加“=”号,哪裡不需要。
題目6-2 結構體數組按總分排序
第一步:閱讀題目,明确題意要求。
第二步:找到對應函數中的實參和形參并寫出函數接口。
第三步:函數calc:使用一個for循環周遊每個學生的成績,計算出每名學生的總分。
第四步:函數sort:使用冒泡排序法對學生總成績按降序排序。
void calc(struct student *p,int n)
{
int i;
for(i=0;i<n;i++,p++)
{
p->sum=p->score[0]+p->score[1]+p->score[2];
}
}
void sort(struct student *p,int n)
{
int i,j;
struct student t;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if((p+j)->sum<(p+j+1)->sum)
{
t=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=t;
}
}
}
}
錯誤資訊:編譯錯誤
進行交換的是(p+i)和(p+i+1)的值,而不是位址。
作業要求三
1.總結。
(1).這兩周主要學會了結構體:結構體的定義,結構體類型的定義,結構體變量的定義,結構體初始化以及結構體的引用。
(2).上兩周學的指針在這幾次作業中有應用,也比剛學的時候熟悉很多。
2.git托管平台。
https://github.com/Vinecy666/C-/tree/master
3.點評。
王文博
李伍壹
馬钰娟