C高級第二次作業


PTA作業第一部分

6-7 刪除字符串中數字字符(10 分)

刪除一個字符串中的所有數字字符。

函數接口定義:

void delnum(char *s);

其中 s是用戶傳入的參數。 函數的功能是刪除指針 s所指的字符串中的所有數字字符。
裁判測試程序樣例:

#include "stdio.h"
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
 delnum(item);
 printf("%s\n",item);
 return 0;
}

/* 請在這里填寫答案 */

輸入樣例:

a0bc+d496df

輸出樣例:

abc+ddf

1.設計思路:

(1).題目算法描述
第一步:定義i,j 並初始化為0
第二步:遍歷s
第三步:判斷s中每個元素是否為數字如果是數字則覆蓋此元素
第四步:將s的最后一個元素賦值為'\0'

(2).流程圖
流程圖

2.實驗代碼

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

2.錯誤調試

答案正確

答案正確

6-8 統計子串在母串出現的次數(10 分)

編寫一個函數,該函數可以統計一個長度為3的字符串在另一個字符串中出現的次數。例如,假定輸入的字符串為:asdasasdfgasdaszx67asdmklo,字符串為:asd,則應輸出n=4。。

函數接口定義:

int fun(char *str,char *substr);

其中strsubstr是用戶傳入的參數。函數統計substr指針所指的字符串在str指針所指的字符串中出現的次數,並返回次數。

裁判測試程序樣例:

#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
 int n;
 n=fun(str,substr);
 printf("n=%d\n",n);
 return 0;
}


/* 請在這里填寫答案 */

輸出樣例:

n=4

1.設計思路:

(1).題目算法描述
第一步:定義i,j , k, n並初始化為0
第二步:從母串開始遍歷
第三步:母串的每個字符串與子串進行比較
第四步:當子串遍歷完的時候統計次數用的n加一
第五步:返回n

(2).流程圖

2.實驗代碼

int fun(char *str,char *substr)
{
    int i=0,j=0,k=0,n=0;
    for(i=0;str[i]!='\0';i++)//從母串開始遍歷
    {
        for(j=i,k=0;str[j]==substr[k];j++,k++)//每次遍歷的當前字符串都要和子串的第一個字符進行比較把子串遍歷完次數加一
        {
            if(substr[k+1]=='\0')
            {
                n++;
            }
        }
    }
    return n;
}

3.錯誤調試

答案正確

答案正確

6-9 字符串中除首尾字符外的其余字符按降序排列(10 分)

請編寫函數fun,對字符串中除首、尾字符外的其余字符按降序排列。例如,原來的字符串為CEAedca,排序后輸出為CedcEAa。

函數接口定義:

int fun(char *s,int num);

其中snum 都是用戶傳入的參數。函數對字符指針s所指的字符串中除首、尾字符外的其余字符按降序排列。

裁判測試程序樣例:

#include <stdio.h>
int fun(char *s,int num);
int main()
{
 char s[10];
 gets(s);
 fun(s,7);
 printf("%s",s);
 return 0;
 }

/* 請在這里填寫答案 */

輸入樣例:

CEAedca

輸出樣例:

CedcEAa

1.設計思路:

PS:此處不太理題目中給出的num的含義,如果說num代表的是字符串的長度那么難道每個測試字符串的長度都是7嗎,而如果說num不是字符串的長度那么num代表什么含義,是內存空間的浪費嗎?
(1).題目算法描述
第一步:定義i,j,k,n,t
第二步:遍歷統計字符串長度
第三步:遍歷字符串進行排序(遍歷過程中除去首位字符串)
(2).流程圖

2.實驗代碼

 int fun(char *s,int num)
 {
     int i=0, j=0, k=0, n=0, t=0;
     n=strlen(s);
     n--;//去掉末位元素
     for(i=1;i<n;i++)
    {
        for(j=i;j<n-1;j++)
        {
            for(k=j;k<n;i++)
            {
                if(*(s+j)<*(s+k))
                {
                    t=*(s+j);
                    *(s+j)=*(s+k);
                    *(s+k)=t;
                }
            }
        }
    }
}

2.錯誤調試
錯誤提示:運行超時
錯誤改正:關於字符串長度統計函數使用時必須包含string.h頭文件;變量t應該定義為char類型;循環混亂
修改后的代碼:

int fun(char *s,int num)
{
    int i=0, j=0, k=0, n=0;
    char t;
    for(n=0;;n++)
    {
        if(*(s+n)=='\0')break;
    }
    n--;
        for(i=1;i<n-1;i++)
        {
            for(j=i;j<n;j++)
            {
                if(*(s+i)<*(s+j))
                {
                    t=*(s+i);
                    *(s+i)=*(s+j);
                    *(s+j)=t;
                }
            }
        }
}

答案正確

答案正確

7-1 輸出學生成績(20 分)

本題要求編寫程序,根據輸入學生的成績,統計並輸出學生的平均成績、最高成績和最低成績。建議使用動態內存分配來實現。
輸入格式:

輸入第一行首先給出一個正整數N,表示學生的個數。接下來一行給出N個學生的成績,數字間以空格分隔。
輸出格式:

按照以下格式輸出:

average = 平均成績
max = 最高成績
min = 最低成績

結果均保留兩位小數。

輸入樣例:

3
85 90 95

輸出樣例:

average = 90.00
max = 95.00
min = 85.00

1.設計思路:

(1).題目算法描述
第一步:定義N讀入N
第二步:定義數組
第三步:遍歷數組找最值並求和
第四步:求平均值
第五步:輸出
(2).流程圖

2.實驗代碼

#include <stdio.h>
int main()
{
    int N,i;
    float sum=0, average=0, max=0, min=0;
    scanf("%d",&N);
    int a[N];
    for(i=0;i<N;i++)
    {
        scanf("%d",&a[i]);
    }
    max = a[0];
    min=a[0];
    for(i=0;i<N;i++)
    {
        sum = sum + a[i];
        if(a[i]>max){
            max=a[i];
        }
        if(a[i]<min){
            min=a[i];
        }
    }
    average=sum/N;
    printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
    return 0;
}

本題的動態內存分配實現方法有待繼續學習
2.錯誤調試

答案正確

答案正確

關於動態內存分配相關內容的參考:

https://baike.baidu.com/item/動態分配內存/2968252?fr=aladdin
(來源:百度百科)

關於alloc函數:

https://blog.csdn.net/msdnwolaile/article/details/51695361

1.設計思路:

(1).題目算法描述
第一步:定義N讀入N
第二步:使用動態內存分配定義數組
第三步:遍歷數組找最值並求和
第四步:求平均值
第五步:釋放動態內存分配的空間
第六步:按要求輸出結果
(2).流程圖

2.實驗代碼

#include <stdio.h>
#include <stdlib.h>//使用malloc函數的頭文件
int main()
{
    int N,i;
    float sum=0,average=0,max=0,min=0;
    scanf("%d",&N);
    float *p;
    p = (float *)malloc(N);//指針指向動態分配內存
    for(i=0;i<N;i++)
    {
        scanf("%f",(p+i));
        sum+=*(p+i);
    }
    max=*(p+0);
    min=*(p+0);
    for(i=0;i<N;i++)
    {
        if(min>*(p+i)){
            min=*(p+i);
        }
        if(max<*(p+i)){
            max=*(p+i);
        }
    }
    average=sum/N*1.0;
    free(p);//釋放空間
    printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
    return 0;
}


2.錯誤調試

7-1 計算職工工資(15 分)

給定N個職員的信息,包括姓名、基本工資、浮動工資和支出,要求編寫程序順序輸出每位職員的姓名和實發工資(實發工資=基本工資+浮動工資-支出)。
輸入格式:

輸入在一行中給出正整數N。隨后N行,每行給出一位職員的信息,格式為“姓名 基本工資 浮動工資 支出”,中間以空格分隔。其中“姓名”為長度小於10的不包含空白字符的非空字符串,其他輸入、輸出保證在單精度范圍內。
輸出格式:

按照輸入順序,每行輸出一位職員的姓名和實發工資,間隔一個空格,工資保留2位小數。

輸入樣例:

3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80

輸出樣例:

zhao 565.00
qian 430.00
zhou 630.00

1.設計思路:

(1).題目算法描述
第一步:定義結構
第二步:定義N,i
第三步:讀入N
第四步:遍歷輸入數據
第五步:遍歷輸出數據

(2).流程圖

流程圖

2.實驗代碼

#include <stdio.h>
struct money
{
    char name[10];
    float jmoney;
    float fmoney;
    float zmoney;
    float mony;
};
int main()
{
    int N,i=0;
    scanf("%d",&N);
    struct money s[N];
    for(i=0;i<N;i++)
    {
        scanf("%s %f %f %f",&s[i].name,&s[i].jmoney,&s[i].fmoney,&s[i].zmoney);
        s[i].mony=s[i].jmoney+s[i].fmoney-s[i].zmoney;
    }
    for(i=0;i<N;i++)
    {
        printf("%s %.2f\n",s[i].name,s[i].mony);
    }
    return 0;
}

2.錯誤調試
錯誤提示:多種錯誤
改正方法:將struct money s[i]換成struct money s[N]
剛開始定義的時候i=0 struct money s[i]相當於 struct money s[0] 當進入for循環后i的值改變導致導致出現錯誤

答案正確

7-2 計算平均成績(15 分)

給定N個學生的基本信息,包括學號(由5個數字組成的字符串)、姓名(長度小於10的不包含空白字符的非空字符串)和成績([0,100]區間內的整數),要求計算他們的平均成績,並順序輸出平均線以下的學生名單。

輸入格式:

輸入在一行中給出正整數N(≤10)。隨后N行,每行給出一位學生的信息,格式為“學號 姓名 成績”,中間以空格分隔。

輸出格式:

首先在一行中輸出平均成績,保留2位小數。然后按照輸入順序,每行輸出一位平均線以下的學生的姓名和學號,間隔一個空格。
輸入樣例:

5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60

輸出樣例:

80.00
zhang 00001
chen 21987

1.設計思路:

(1).題目算法描述
第一步:定義結構
第二步:定義N,i, sum
第三步:讀入N
第四步:遍歷輸入數據
第五步:計算average
第六步:輸出average
第七步:遍歷判斷每個學生的分數是否大於平均值輸出低於平均分的學生信息

(2).流程圖

2.實驗代碼

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

2.錯誤調試

錯誤提示:輸出錯誤
錯誤的輸出樣式
錯誤輸出樣式
改正方法:定義結構的時候將char num[5];改為char num[6];
學號信息的長度為5定義的字符串長度也為5無法讀入'\0'
由此聯想到名字變量也無法讀入‘/0’將char name[10]改為char name[11]

答案正確:

6-1 按等級統計學生成績(20 分)

本題要求實現一個根據學生成績設置其等級,並統計不及格人數的簡單函數。

函數接口定義:

int set_grade( struct student *p, int n );

其中p是指向學生信息的結構體數組的指針,該結構體的定義為:

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

n是數組元素個數。學號num、姓名name和成績score均是已經存儲好的。set_grade函數需要根據學生的成績score設置其等級grade。等級設置:85-100為A,70-84為B,60-69為C,0-59為D。同時,set_grade還需要返回不及格的人數。
裁判測試程序樣例:

#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

/* 你的代碼將被嵌在這里 */

輸入樣例:

10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78

輸出樣例:

The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

1.設計思路:

(1).題目算法描述
第一步:定義i,x
第二步:指針遍歷結構
第三步:根據分數判斷等級
第四步:用x記錄不及格學生人數
第五步:返回x

(2).流程圖
流程圖

2.實驗代碼

int set_grade( struct student *p, int n )
{
    int i,x;
    for(i=0;i<n;i++,p++)
    {
        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';
            x++;
        }
    }
    return x;
}

2.錯誤調試
錯誤提示:答案錯誤
錯誤原因:定義x的時候沒有初始化
改正方法:定義x的時候將其初始化為0

答案正確:

答案正確

6-2 結構體數組按總分排序(10 分)

有一組學生數據,每個數據中含有三門課成績,請按成績總和從高到低對這組數據進行排序。 編寫函數calc求出每名學生的總分。 編寫函數sort按每名學生的總分從高到低對這組數據進行排序
函數接口定義:

void calc(struct student *p,int n);	 
void sort(struct student *p,int n);

其中 p n 都是用戶傳入的參數。 函數calc求出p指針所指的結構體數組中 n 名學生各自的總分。 函數sort對p指針所指的結構體數組的學生數據按總分降序排序。

裁判測試程序樣例:

#include <stdio.h>
struct student					
{
int num;
char name[15];
float score[3];
float sum;
};
void calc(struct student *p,int n);	 
void sort(struct student *p,int n);
int main()
{
struct student stu[5];
int i,j;
float f;
for(i=0;i<5;i++)
{
	scanf("%d%s",&stu[i].num,stu[i].name);
	for(j=0;j<3;j++)
	{ 
    	scanf("%f",&f);
		stu[i].score[j]=f;
	}
}
calc(stu,5);
sort(stu,5);
for(i=0;i<5;i++)
{
	printf("%5d%15s",stu[i].num,stu[i].name);
	printf("  %.1f  %.1f  %.1f  %.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum);
}
return 0;


/* 請在這里填寫答案 */

輸入樣例:

1 zhang 89 87 85
2 liu  92 98 96
3 li 74 71 72
4 xion 95 98 99
5 liu 99 100 100

輸出樣例:

    5            liu  99.0  100.0  100.0  299.0
    4           xion  95.0  98.0  99.0  292.0
    2            liu  92.0  98.0  96.0  286.0
    1          zhang  89.0  87.0  85.0  261.0
    3             li  74.0  71.0  72.0  217.0

1.設計思路:

(1).題目算法描述
第一個函數:
第一步:定義i;
第二步:遍歷數組求出每個學生成績的總和
第二個函數:
第一步:定義i,j 和用做交換變量的t
第二步:運用冒泡排序根據學生成績進行排序

(2).流程圖

2.實驗代碼

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

2.錯誤調試
錯誤提示:多次嘗試在Cold::Blocks 中無法運行出正確的結果,但是在PTA中提交結果正確
錯誤原因:我調試第一個函數的時候將主函數中將調用第二個函數的代碼注釋掉了,在PTA提交的過程中只提交了函數的部分所以顯示結果正確

答案正確:

作業要求三:

1.所學知識點總結

(1)復習了指針相關的定義和引用,與上次作業總結的內容基本相同就不重復羅列了
(2)學習了相關動態內存分配的內容,但是上課時聽的並不是很明白,在課下自行通過網絡進行了相關問題的解決,具體的鏈接已經附在了前面的博客中
(3)學習了結構的定義與使用等相關的知識
(4)學習了用指針操作結構的相關知識

2.代碼托管

我的Github地址:https://github.com/XINJY/The-homework-of-C
上傳成功截圖:
上傳成功截圖

3.點評同學作業

李伍壹(http://www.cnblogs.com/chenxidream/p/8654245.html)
姜健(http://www.cnblogs.com/jj990519/p/8667152.html)
王文博(http://www.cnblogs.com/wwb986187/p/8727528.html)
袁中(http://www.cnblogs.com/2719610441qqcom/p/8660431.html)
申怡苗(http://www.cnblogs.com/Vinecy/p/8660124.html)

4.表格和折線圖

表格:
折線圖:


免責聲明!

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



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