2018上第二次作業


要求一:完成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、學習進度表



免責聲明!

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



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