C語言——第二次作業


題目6-7 刪除字符串中數字字符##

1.設計思路
(1)主要描述題目算法
第一步:本題要求設計一個刪除數字字符的調用函數,我的思路是在用戶輸入元素后額外定義一個數組,將非數字字符存到額外數組里,再將這些字符覆蓋到輸入的指定數組。
第二步:定義數組temp以及變量i、j。利用while循環將非數字字符與數字字符分離。再利用一次while循環將非數字字符覆蓋到所需數組內,最后根據temp的長度結束s。
2.實驗代碼

void delnum(char *s)
{
  char temp[80];
  int j=0,i=0;
  while(s[i])
  {
    if(!(*(s+i)>='0'&&*(s+i)<='9'))
    {
      temp[j++]=*(s+i);
    }
    i++;
  }
  temp[j]='\0';
  i=0;
  while(temp[i])
  {
    *(s+i)=temp[i++];
  }
  s[i]='\0';
}

3.本題調試過程碰到問題及解決辦法

題目6-8 統計子串在母串出現的次數##

1.設計思路
(1)主要描述題目算法
第一步:本題要求設計計算子串在母串中出現的次數的函數。
第二步:從母字符串中的第一個字符開始尋找與子字符串第一個字符相同的子串,然后從第二個字符開始,直到母字符串結束。
(2)流程圖
主函數:

調用函數:

2.實驗代碼

int fun(char *str,char *substr)
{
  int num=0;
  char *a;
  char *b;
  while(*str!='\0')
  {
    a=str;
    b=substr;
    while((*a==*b)&&(*a!='\0')&&(*b!='\0'))
    {
        a++;
        b++;
    }
    if(*b=='\0')
    {
      num++;
    }
    str++;
  }
  return num;
}

3.本題調試過程碰到問題及解決辦法
開始時直接用str與substr在程序中運算導致運算超時,通過上網查詢使用字符串輔助指針a、b后答案正確。

題目6-9 字符串中除首尾字符外的其余字符按降序排列##

1.設計思路
(1)主要描述題目算法
第一步:本題要求設計函數將字符串中除首尾元素外的元素按降序排序。
第二步:利用雙循環結構,第一次循環表示循環的趟數,第二次的循環將較小值向前移動。最后得到目標字符串。
2.實驗代碼

int fun(char *s,int num)
{
  int i,j;
  int t;
  for(i=1;i<=num-2;i++)
  {
    for(j=num-2;j>i;j--)
    {
     if(*(s+j)>*(s+j-1))
      {
        t=*(s+j);
       *(s+j)=*(s+j-1);
        *(s+j-1)=t;
      }
    }  
  }
}

3.本題調試過程碰到問題及解決辦法
本題因標點問題編譯錯誤,已改正。

題目7-1 輸出學生成績##

1.設計思路
(1)主要描述題目算法
第一步:定義題目需要的變量,輸入N。
第二步:申請N個雙精度長度的空間,將首地址賦值給p。
第三步:利用循環輸入成績並算出成績的總和。
第四步:將首地址的元素賦給最大/最小值,利用循環找出最大/最小值,將其賦給max,min。
第五步:成績總和除以個數N得到平均值,按格式輸出。
第六步:釋放改動態內存。
2.實驗代碼

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int N;
    double sum=0,max,min,avg,*p;
    int i;
    scanf("%d",&N);
    if((p=(double *)calloc(N,sizeof(double)))==NULL)
    {
        printf("Not able to allocate memory.\n");
        exit(1);
    }
    for(i=0;i<N;i++)
    {
        scanf("%lf",p+i);
        sum=sum+*(p+i);
    }
    max=*p,min=*p;
    for(i=0;i<N;i++)
    {
        if(*(p+i)>max)
        {
          max=*(p+i);
        }
        if(*(p+i)<min)
        {
          min=*(p+i);
        }
    }
    avg=sum*1.0/N;
    printf("average = %.2lf\n",avg);
    printf("max = %.2lf\n",max);
    printf("min = %.2lf\n",min);
    free(p);
}

3.本題調試過程碰到問題及解決辦法
本題上學期做過,但此次新增了動態內存的運用,這部分不是很了解,通過詢問同學得到了運用方法,但有照搬照抄的成分,以后會多了解其用法。

題目7-1 計算職工工資##

1.設計思路
(1)主要描述題目算法
第一步:定義結構體,給定N個職員的信息,包括姓名、基本工資、浮動工資和支出。
第二步:定義相關變量i,n,定義結構變量。輸入n。
第三步:本題沒有計算過程,按格式輸入與輸出即可。通過for循環實現多名員工信息的輸入,輸出。
(2)流程圖
結構體:

主函數:

2.實驗代碼

#include<stdio.h>
struct pay
{
  char name[20];
  float ji,fu,out;
};
int main()
{
  int i=0,n; 
  struct pay pay[1000];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%s %f %f %f",pay[i].name,&pay[i].ji,&pay[i].fu,&pay[i].out);
  }
  for(i=0;i<n;i++)
  {
    printf("%s %.2f\n",pay[i].name,pay[i].ji+pay[i].fu-pay[i].out);
  }
}

3.本題調試過程碰到問題及解決辦法
剛編譯時定義結構變量只定義了容量為一的變量導致只能輸入和輸出一名職工的信息,導致錯誤,后來學習到定義結構數組,正確。

題目7-2 計算平均成績##

1.設計思路
(1)主要描述題目算法
第一步:定義結構體,包括學號(由5個數字組成的字符串)、姓名(長度小於10的不包含空白字符的非空字符串)和成績([0,100]區間內的整數)
第二步:定義相關整形變量n,i,sum與浮點型變量aver,定義結構數組。輸入n。
第三步:通過for循環輸入所需的信息,計算出成績和sum。
第四步:求出平均值。
第五步:按格式輸出。
2.實驗代碼

#include<stdio.h>
struct student
{
  char num[6];
  char name[11];
  int score;
};
int main()
{
  int n,i=0;
  int sum=0;
  double aver;
  struct student students[10];
  scanf("%d",&n);
  for(i=0;i<n;i++)
  {
    scanf("%s %s %d",&students[i].num,students[i].name,&students[i].score);
    sum+=students[i].score;
  }
  aver=sum/n*1.0;
  printf("%.2lf\n",aver);
  for(i=0;i<n;i++)
  {
    if(students[i].score<aver)
    {
      printf("%s %s\n",students[i].name,students[i].num);
    }
  }
}

3.本題調試過程碰到問題及解決辦法
定義結構信息的時候最后的“}”后面忘記加分號導致編譯錯誤,以后注意。

題目6-1 按等級統計學生成績##

1.設計思路
(1)主要描述題目算法
第一步:本題要求設計函數,根據學生成績設置其等級,並統計不及格人數。
第二步:定義變量i,fail(不及格數)。利用if條件語句把各段成績分開,將各分段對應的字母賦給grade,並在計算不及格分段時計算不及格人數(fail++)。
(2)流程圖
結構體:

主函數:

調用函數:

2.實驗代碼

int set_grade( struct student *p, int n )
{
  int i,fail=0;
  for(i=0;i<n;i++)
  {
    if((p+i)->score>=85&&(p+i)->score<=100)
    {
      (p+i)->grade='A';
    }
    else if((p+i)->score>=70&&(p+i)->score<=84)
    {
      (p+i)->grade='B';
    }
    else if((p+i)->score>=60&&(p+i)->score<=69)
    {
      (p+i)->grade='C';
    }
    else if((p+i)->score>=0&&(p+i)->score<=59)
    {
      (p+i)->grade='D';
      fail++;
    }
  }
  return fail;
}

3.本題調試過程碰到問題及解決辦法
取值范圍弄串導致答案錯誤,已改正。

題目6-2 結構體數組按總分排序##

1.設計思路
(1)主要描述題目算法
第一步:本題要求設計兩個函數,第一個calc函數要求計算每名學生的總分,第二個sort函數要求按每名學生的總分從高到低對總分進行排序。
第二步:calc函數:定義變量i=0.利用for循環將結構體數組中每名學生的三門成績求和。
第三步:sort函數:定義變量i=0,j=0,定義結構變量swap作為交換變量。利用雙循環將n名學生的總分按降序排序。
2.實驗代碼

void calc(struct student *p,int n)
{
  int i=0;
  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=0,j=0;
    struct student swap;
    for(i = 1; i < n; i++)
    {
      for(j = 0; j < n - i; j++)
      {
        if(p[j].sum < p[j+1].sum)
          {
              swap = p[j];
              p[j] = p[j+1];
              p[j+1] = swap;
           }
      }
    }
}

3.本題調試過程碰到問題及解決辦法

提交列表##






1.學習總結和進度
對指針的運用有了更多的了解。主要是學習了結構體這個全新的知識點。帶有結構體的函數中,定義結構體數組再運用較為頻繁,需要強加練習。
此外上課時還講解了動態內存的分配,不過沒有聽明白,只能根據PPT中的內容和請教同學來使用,后續應該自己去查找具體的內容學習。
2.git地址: https://git.coding.net/ZJY15/ZJY15.git

3.點評
點評同學
豐大為: http://www.cnblogs.com/DavidPark/p/8664273.html
高立彬: http://www.cnblogs.com/gao628526/p/8665187.html
董雅潔: http://www.cnblogs.com/exo123/p/8663311.html

4.圖表


免責聲明!

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



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