C高级第二次PTA作业

6-7 删除字符串中数字字符

1.设计思路:

(1)算法:

第一步:定义一个字符数组item,输入一个字符串赋给字符数组item。调用函数delnum,

第二步:在函数delnum中定义循环变量i=0,和变量j=0,

第三步:借助for循环表达式二条件为*(s+i)!='\0',如果*(s+i)不是数字就执行*(s+j)=*(s+i),j++,否则什么都不执行,然后i++,

第四步:*(s+j)='\0'

第五步:输出字符串item

(2)流程图:

 

 

2.实验代码:

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

3.本题调试过程碰到问题及解决办法:

错误信息1:编译错误

错误原因:在if语句中判断条件中数字字符没加单引号。

改正方法:数字字符要加单引号。

 

6-8 统计子串在母串出现的次数

1.设计思路:

(1)算法:

第一步:定义字符数组str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd",定义整型数字n的值为函数fun(str,substr)

第二步:在函数fun中定义循环变量i=0,count=0;

第三步:在for循环中判断条件为*(str+i)!='\0',如果*(str+i)==*(substr)成立并且*(str+i+1)==*(substr+1)和*(str+i+2)==*(substr+2)同时成立,count++;否则什么都不执行,i++

第四步:输出n;

(2)流程图:

2.实验代码:

    int fun(char *str,char *substr){
        int i,count=0;
        for(i=0;*(str+i)!='\0';i++){
            if(*(str+i)==*(substr)){
                if(*(str+i+1)==*(substr+1)){
                    if(*(str+i+2)==*(substr+2)){
                        count++;
                    }
                }
            }
        }
        return count;
    }

目前的代码只能解决题目,而不具备通用性,

修改后的代码如下:

int fun(char *str,char *substr)
{
    int i=0,j=0,k=0,count=0;
    for(i=0;str[i]!='\0';i++)
    {
        for(j=i,k=0;str[j]==substr[k];j++,k++)//起始的判断条件为str的第i个元素与substr的第0个元素是否相等
            if(substr[k+1]=='\0')
            {
                count++;
            }
        }
    }
    return count;
}

 

3.本题调试过程碰到问题及解决办法:

错误信息1:无

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

1.设计思路:

(1)算法:

第一步:定义一个字符数组s[10],

第二步:输入一个字符串赋给s[10],

第三步:调用函数fun,

第四步:在函数fun中对数组元素除了首尾元素外进行选择排序,并从大到小排列,

第五步:输出字符串s,

(2)流程图:

 

 

2.实验代码:

     int fun(char *s,int num){
         int i,j,k,temp;
         for(i=1;i<num-2;i++){
             k=i;
             for(j=i+1;j<num-1;j++){
                 if((int)(*(s+k))<(int)(*(s+j))){
                     k=j;
                 }
             }
            if(k!=i){
             temp=*(s+i);*(s+i)=*(s+k);*(s+k)=temp;
             }
        }
         return 0;
     }

3.3.本题调试过程碰到问题及解决办法:

 

7-1 输出学生成绩

1.设计思路:

(1).算法

第一步:定义浮点型数sum=0,average,max,min整型数i,n

第二步:对n赋值,

第三步:定义指针变量p为浮点型,借助malloc函数申请连续内存空间,内存为n,

第四步:输入n个数据一次赋值给*(p+i),并求出总分数sum,

第五步:借助for循环找出最大成绩赋给max最小成绩赋给min,

第六步:输出平均数 最高成绩和最低成绩,

(2)流程图:

2.实验代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,n;
    float sum=0,average,max,min;
    scanf("%d",&n);
    float *p=(float *)malloc(n);
    for(i=0;i<n;i++){
        scanf("%f",(p+i));
        sum+=*(p+i);
    }
    min=*(p+0);max=*(p+0);
    for(i=0;i<n;i++){
        if(min>*(p+i)){
            min=*(p+i);
        }
        if(max<*(p+i)){
            max=*(p+i);
        }
    }
    printf("average = %.2f\n",sum/n*1.0);
    printf("max = %.2f\n",max);
    printf("min = %.2f\n",min);
    return 0;
}

3.本题调试过程碰到问题及解决办法:

碰到的问题:不会使用malloc函数不知道如何在内存的动态存储区中分配连续内存空间,

解决办法:用手机在百度上搜索在CSDN博客中了解如何使用。

malloc函数:

函数原型为 void *malloc(unsigned int size);

malloc(100);/*开辟100个字节的临时分配域,返回值为其第一个字节的地址*/

例如:int *p=malloc(100)/*开辟100个字节的临时分配域把起始地址赋给整型指针变量p*/

calloc函数:

函数原型为void *calloc(unsigned n,unsigned size);

例如:int *p=calloc(50,4)/*开辟50个字节的临时分配域,每个分配域的大小为4(整型),,把起始位置赋给指针变量p。

 

C高级第二次PTA作业(2)

7-1 计算职工工资

 

1.设计思路:

(1)算法:

第一步:定义一个结构体变量,结构体的名为wage,结构体中的成员为定义指针数组name[10],浮点型数字base_pay,floating_wage,expend,net_payroll,

第二步:在主函数中定义整型变量N,i,读入一个数字赋给N。

第三步:声明结构体的变量名,结构体的变量名为数组salary[N];

第四步:i=0,借助一个for循环对结构体变量进行赋值,并且求出结构体变量中的结构体变量salary[i].net_payroll=salary[i].base_pay+salary[i].floating_wage-salary[i].expend

第五步:i=0,借助for循环输出每一位职员的姓名和实发工资及输出salary[i].name,salary[i].net_payroll。

(2)流程图

 

2.实验代码:

#include <stdio.h>
#include <stdlib.h>
struct wage{
    char name[10];
    float base_pay;
    float floating_wage;
    float expend;
    float net_payroll;
}; 
int main()
{
    int N,i;
    scanf("%d",&N);
    struct wage salary[N];
    for(i=0;i<N;i++){
        scanf("%s %f %f %f",salary[i].name,&salary[i].base_pay,&salary[i].floating_wage,&salary[i].expend);
        salary[i].net_payroll=salary[i].base_pay+salary[i].floating_wage-salary[i].expend*1.0;
    }
    for(i=0;i<N;i++){
        printf("%s %.2f\n",salary[i].name,salary[i].net_payroll);
    }
    return 0;
}

 

3.本题调试过程碰到问题及解决办法:

错误信息1:

 

错误原因:在循环变量中i的初值为1,条件为i<=N;导致结构体变量数组越界了。

改正方法:i的初值为0,条件为i<N;

7-2 计算平均成绩

1.设计思路:

(1)算法:

第一步:定义一个结构体结构体名称为information,在结构体变量中成员有字符数组num[6]和name[11],整型变量grade。

第二步:在主函数中定义征信变量i和n,浮点型数average=0,整型数sum=0,读入一个数赋给n。

第三步:声明结构体的变量名为数组information massage[n]。

第四步:i=0,借助for循环条件为i<n,对结构体变量名information massage[i]赋值。求出sum=sum+massage[i].grade。

第五步:求出average=um*1.0/n,输出average。

第六步:i=0,借助for循环,判断条件为i<n,输出

(2)流程图:

2.实验代码:

错误的代码:

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

修改后的正确代码:

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

3.本题调试过程碰到问题及解决办法:

错误信息1:

错误原因:学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串),所以就定义char num[5];char name[10];忽略了字符串还有结束标志'\0',所以就输出错误

改正方法:将char num[5];char name[10];改成char num[6];char name[11];使字符串包含结束标志'\0'.

 

 C高级PTA作业(3)

6-1 按等级统计学生成绩

1.设计思路:

(1)算法: 第一步:定义结构体类型变量,结构体名为student,结构体中的成员包括整型num,字符数组name[20],整型score,字符型grade。

第二步:定义结构体变量名为stu[10],*ptr。定义整型变量n,i,count。ptr=stu,读入一个书赋给n。

第三步:i=0,借助for循环对stu[i]赋值,条件为i<n。

第四步:调用set_grade函数,将函数的返回值赋给count。

第五步:在set_grade函数中,定义整型变量i,q=0。i=0,借助for循环判断p->score是否<60,成立q++,否则什么都不执行,在for循环中判断p->score属于什么等级,将等级赋给p->grade,返回q的值,

第六步:输出分数小于六十的人的个数,输出每个人的学号、姓名、等级。

(2)流程图:

 

2实验代码:

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

3.本题调试过程碰到问题及解决办法:

6-2 结构体数组按总分排序

1.设计思路:

(1)算法:

第一步:定义结构体变量,结构体名为student,结构体的成员包括整型num,字符数组name[15],浮点型数组score[3],浮点型sum。

第二步:在主函数中定义结构体变量名为stu[5],整型变量i,j,浮点型数字f。

第三步:i=0,借助for循环对结构体变量stu[5]赋值,

第四步:调用calc函数,在calc函数中定义整型=0i,借助for循环求出(p+i)->sum的值,(p+i)->sum=(p+i)->score[0]+(p+i)->score[1]+(p+i)->score[2],

第五步:调用sort函数,在sort函数中定义整型i,j,t,定义结构体变量,变量名为temp,使用选择排序法进行排序按总分从高到低对这组数据进行排序,

第六步:输出所有成员的学号,姓名,各科的分数和总分。

(2)流程图:

 

2.实验代码:

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

3.本题调试过程碰到问题及解决办法:

问题1:

错误原因:定义交换的temp为整型,他是不可能和结构体变量交换的

改正方法:定义temp为结构体变量就可以了

问题2:

错误的原因:在交换的时候由于马虎将代码打错了

修改方法:将temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;改成temp=*(p+i);*(p+i)=*(p+t);*(p+t)=temp;

 

 

 

我所评论的人:

辛静瑶:http://www.cnblogs.com/X-JY/p/8652592.html

姜健:http://www.cnblogs.com/jj990519/

袁中:http://www.cnblogs.com/2719610441qqcom/p/8660431.html

李新华:http://www.cnblogs.com/Lixinhua18/p/8671886.html

评论我的人:

陈天胤:

李新华:

申怡苗:

焦瑞君:

王文博:

 https://gitee.com/tmjl/c_advanced_second_times_pta_operation/tree/master

知识点:

结构体的标识符 struct;在定义结构体变量时,不要忽略最后的分号

在结构体变量中,在编译时对垒形势不分配空间的,只对其中的变量分配空间。

结构体变量的引用是   “.”运算符(成员运算符),优先级是最高的,对结构体变量的赋值知更一个个赋值,不能整体赋值。

->  是指向运算符,p->n,表示得到p指向的结构体变量中的成员n的值。

结构体变量的变量名可以是数组,指针变量,在结构体中尽量多使用指针,可以减少编译的时间,同时可以加深对指针的使用。

 

 

在做题时所使用的知识点:

选择排序法;如何动态分配内存和相关的函数malloc,calloc函数;

结构体的定义与使用,如何对结构体变量赋值;

->指向运算符;.是成员运算符;

posted @ 2018-03-26 21:53  _晨曦  阅读(446)  评论(29编辑  收藏  举报