要求一:完成PTA作業
答:作業已經完成!
要求二:pta作業編程題目的解題思路和調試過程記錄
C高級第二次作業(1)
完成情況如圖:
第一題:刪除字符串中數字字符
1.設計思路:
(1)算法:
第一步:把i,j設置為整形變量,i=0;
第二步:當s[i]不是\0的時候(若是\0,則返回主函數),判斷s[i]是否是數字,如果不是,則i++,再重新循環;
第三步:如果s[i]是數字,把i賦值給j,再當s[j]不是\0的時候,把s[j+1]賦值給s[j],再j++,然后返回主函數,如果s[j]是\0的時候,則直接返回主函數,(因此用continue)。
(2)流程圖:
略。
2.實驗代碼:
void delnum(char *s)
{
int i = 0,j;
while(s[i]!='\0') {
if(s[i] >= '0' && s[i] <= '9') {
j = i;
while(s[j]!='\0') {
s[j] = s[j+1];
j++;
}
continue;
}
i++;
}
}
3.本題調試過程碰到問題及解決的辦法:
問題:本題最開始忘寫了i++
解決辦法:后來補充上,正確。
第二題:統計子串在母串出現的次數
1.設計思路:
(1)算法:
第一步:定義i,j,k,num為整形變量,num=0;
第二步:寫第一個for循環遍歷母串,第二個for循環是找到母串與子串相等的加一;
第三步:在第二個for循環里判斷substr[k+1]是否為\0,若是,則num++,跳出循環;
第四步:返回num的值。
注意:本題當遇到substr[k]==str[j]時不能加一,因為此時只是一個元素相等,需要等到字串輪玩一遍都相等時才可以加一。
(2)流程圖:
略。
2.實驗代碼:
int fun(char *str,char *substr)
{
int i,j,k,num=0;
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.本題調試過程碰到問題及解決的辦法:
問題:本題一開始寫的當substr[k]==str[j]時我就計數了。
解決辦法:后來讀題分析,懂得只有字串全輪一遍都相等才能計數,改正即可。
第三題:字符串中除首尾字符外的其余字符按降序排列
1.設計思路:
(1)算法:
第一步:設a=0, b=0, k=0, n=0,且為整形變量,t為字符變量;
第二步:第一個for循環,如果s[n]是'\0',則跳出循環,此步驟表明了n的大小;
第三步:采用排序法降序;
(2)流程圖:
略。
2.實驗代碼:
int fun(char *s,int num)
{
int a=0, b=0, k=0, n=0;
char t;
for(n=0;;n++)
{
if(*(s+n)=='\0')break;
}
n--;
for(a=1;a<n-1;a++)
{
for(b=a;b<n;b++)
{
if(*(s+a)<*(s+b))
{
t=*(s+a);
*(s+a)=*(s+b);
*(s+b)=t;
}
}
}
}
3.本題調試過程碰到問題及解決的辦法:
問題:對於排序法不太熟練,由於首尾不用排,造成了錯誤。
解決辦法:首尾不用排,因此a=1,從1開始,結尾到n,就是到s[n],而不是s[n+1]。
第四題:輸出學生成績
1.設計思路:
(1)算法:
①由於提交前不會動態分配內存,因此本題用一般方法寫的;
②本題是學生成績,成績最高是100分,所以設的min開始值為100。
第一步:定義n,i為整形變量,max,min,sum,a為double型,且max,min,sum為0;
第二步:輸入n,n為學生人數,用for循環輸入學生成績再用if語句,當遇到比max大的數就賦值給max,比min小的數就賦值給min;
第三步:在for中求和,出for循環用sum除以人數就是平均數,輸出平均數,最大最小值。
注意:最后輸出的結果要保留兩位小數。
(2)流程圖:
2.實驗代碼:
#include <stdio.h>
int main()
{
int n,i;
double max=0,min=100,sum=0,a;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf",&a);
if(a>max){
max=a;
}
if(a<min){
min=a;
}
sum=sum+a;
}
printf("average = %.2lf\n",sum/n);
printf("max = %.2lf\n",max);
printf("min = %.2lf",min);
return 0;
}
3.本題調試過程碰到問題及解決的辦法:
問題:本題的for循環的括號未把求和括進在內。
解決辦法:把sum求和括進去,修改成功。
C高級第二次作業(2)
完成情況如圖:
第一題:計算職工工資
1.設計思路:
(1)算法:
第一步:該題用到新學的知識結構。先創建一個結構,包含名字,基本工資,實發工資,浮動工資,支出;
第二步:定義幾個整形變量,n為人數。輸入n,再用結構定義一個數組a[n],用for循環輸入工作者的信息;
第三步:求出實發工資寫入循環里,再用一個for循環輸出。
(2)流程圖:
略
2.實驗代碼:
#include <stdio.h>
struct people{
char name[10];
double sfgz,jbgz,fdgz,zc;
};
int main()
{
int i,n,j;
scanf ("%d", &n);
struct people a[n];
for(i=0;i<n;i++){
scanf ("%s%lf%lf%lf",&a[i].name,&a[i].fdgz,&a[i].jbgz,&a[i].zc);
a[i].sfgz=a[i].fdgz+a[i].jbgz-a[i].zc;
}
for(j=0;j<n;j++){
printf("%s %.2lf\n",a[j].name,a[j].sfgz);
}
return 0;
}
3.本題調試過程碰到問題及解決的辦法:
問題:
解決辦法:問題是由於我不明白數組有多少個,后來想到先在前面寫輸入員工個數n,那么數組元素個數就迎刃而解了。
第二題:計算平均成績
1.設計思路:
(1)算法:
第一步:讀題。通過題目可得,本題是計算學生的平均成績,並寫出平均線以下的學生的信息;
第二步:先創建一個結構,定義a[n]為結構變量,i,j,n為整形變量,n為學生人數,sum,average為浮點型變量;
第三步:通過for循環讀入學生信息,並且求出學生成績之和;
第四步:求出平均值(總和除以人數),在通過for循環,使得每名學生的成績與平均值比較,如果比平均值小則輸出其學生的部分信息。
(2)流程圖:
2.實驗代碼:
#include <stdio.h>
struct student{
char name[10],num[5];
double chengji;
};
int main()
{
int i,j,n;
double sum=0,average;
scanf("%d",&n);
struct student a[n];
for(i=0;i<n;i++){
scanf("%s %s %lf",&a[i].num,&a[i].name,&a[i].chengji);
sum=sum+a[i].chengji;
}
average=1.0f*sum/n;
printf("%.2lf\n",average);
for(j=0;j<n;j++){
if(average>a[j].chengji){
printf("%s %s\n",a[j].name,a[j].num);
}
}
return 0;
}
3.本題調試過程碰到問題及解決的辦法:
問題:
解決辦法:經過檢查,就是最后少了一個},補充上即可。
C高級第二次作業(3)
完成情況如圖:
第一題:按等級統計學生成績
1.設計思路:
(1)算法:
第一步:讀題目和子函數。題目是讓寫出子函數。而子函數起的作用就是統計低於60分以下的個數和給不同分數的學生划分層次;
第二步:統計60分以下的人數的算法。統計此人數就是設一個整形變量為0,期待計數器的作用,然后通過for循環得到的所有學生信息,再用if語句遇到低於60分的成績計數器就加1;
第三步:划分等級也是用if語句。在for循環里,85-100為A,70-84為B,60-69為C,0-59為D,用if語句一一列出即可。
①本題用到了新學的知識,即->,本題p是指針,p->score就是指結構數組中score的地址所存儲的值;
②注意本題的p++,表示每循環一次p加1,即表示此時結構數組到下一個元素。
(2)流程圖:
略。
2.實驗代碼:
int set_grade( struct student *p, int n )
{
int count=0,i;
for(i = 0; i < n; i++,p++){
if(p->score>=85&&p->score<=100){
p->grade='A';
}
if(p->score>=70&&p->score<=84){
p->grade='B';
}
if(p->score>=60&&p->score<=69){
p->grade='C';
}
if(p->score>=0&&p->score<=59){
p->grade='D';
count++;
}
}
return count;
}
3.本題調試過程碰到問題及解決的辦法:
問題:
解決辦法:經過思考得到。由圖中看出,我所寫的是有很大問題的。在循環學生信息的時候,要想循環到下一個,i加1是沒用的,關鍵是p要加1,這樣才能循環到下一位同學信息,否則只能是一個同學的信息循環十次。想要實現p+1,可以在for循環中寫上p++,也可以在每一個有p的代碼中寫p+i,這樣都保證了每輪循環結束后p都加1。
第二題:結構體數組按總分排序
1.設計思路:
(1)算法:
第一步:讀題目。本題有兩個調用函數,一個是要求每名同學的成績總和;一個是把學生總分按照從大到小排序;
第二步:看主函數。主函數主要就是輸入學生的信息,再通過調用函數對信息進行處理后輸出;
第三步:寫的調用函數。求總和。為了不再有局限性,用for循環求學科總和,不能學科一多就一直寫個沒完;排序用的選擇排序法。
注意:在用循環學科求總和的時候,p->sum是沒賦值的,要讓每位同學最開始的和為0,做一個賦值。我在書寫中習慣在最開始的循環寫p++,這樣省着以后麻煩(和在循環里面寫p+i效果一樣),因此在我的代碼中 for(i=0;i<n;i++,p++){p->sum=0;}有這樣一個賦值。再一個要注意的點就是排序的是根據總分排,而且是整體排,不能只排分數。
(2)流程圖:
主函數:
被調函數calc:
被調函數sort:
2.實驗代碼:
void calc(struct student *p,int n)
{
int i,j;
for(i=0;i<n;i++,p++)
{
p->sum=0;
for(j=0;j<3;j++)
{
p->sum =p->sum + p->score[j];
}
}
}
void sort(struct student *p,int n)
{
int i,k,b;
struct student temp;
for(i=0;i<n;i++){
k=i;
for(b=k+1;b<n;b++){
if((p+k)->sum < (p+b)->sum){
k=b;}
}
if(i!=k){
temp=*(p+i);
*(p+i)=*(p+k);
*(p+k)=temp;
}
}
}
3.本題調試過程碰到問題及解決的辦法:
問題:都畫在圖中了,都是通過dev-c++找到的。
解決辦法:思考。賦值是錯的,這么寫就相當於定義一個新的變量賦值為0,而不是每位同學在累加成績前的總和為0,應該改為 p->sum=0,這么寫的前提是for循環里存在i++,p++;在一個就是if語句那里多寫了個符號,刪掉即可。
要求三:學習總結和進度
1、總結兩周來所有PTA作業中每個題目所使用的知識點。(我學到了什么,未學會什么?)
這兩周復習指針 學習了結構以及結構數組和結構概念,還學習了動態分配內存。作業1主要是指針,動態分配內存,作業2是結構數組,作業三是結構指針。這兩周我學到了結構這一概念,懂得用結構數組和結構指針進行做題,未學到的是對於這些知識點不熟練,希望熟能生巧,另外不會動態分配內存。
2、將PTA作業的源代碼使用git提交到托管平台上。
(1)提交證明:
(2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git
3、點評3個同學的本周作業
1.徐銘博:http://www.cnblogs.com/xmb1547828350/p/8657376.html
2.高立彬:http://www.cnblogs.com/gao628526/p/8665187.html
3.史澤文:http://www.cnblogs.com/shilcz/p/8696341.html
4、學習進度表