C高级第二次PTA作业

时间:2023-03-07 15:46:44

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)流程图:

C高级第二次PTA作业

2.实验代码:

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

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

错误信息1:编译错误

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

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

C高级第二次PTA作业

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=;
for(i=;*(str+i)!='\0';i++){
if(*(str+i)==*(substr)){
if(*(str+i+)==*(substr+)){
if(*(str+i+)==*(substr+)){
count++;
}
}
}
}
return count;
}

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

修改后的代码如下:

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

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

错误信息1:无

C高级第二次PTA作业

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

1.设计思路:

(1)算法:

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

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

第三步:调用函数fun,

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

第五步:输出字符串s,

(2)流程图:

C高级第二次PTA作业

2.实验代码:

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

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

C高级第二次PTA作业

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=,average,max,min;
scanf("%d",&n);
float *p=(float *)malloc(n);
for(i=;i<n;i++){
scanf("%f",(p+i));
sum+=*(p+i);
}
min=*(p+);max=*(p+);
for(i=;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 ;
}

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作业

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

7-1 计算职工工资

C高级第二次PTA作业

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)流程图

C高级第二次PTA作业

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:C高级第二次PTA作业

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

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

C高级第二次PTA作业

7-2 计算平均成绩

C高级第二次PTA作业

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:

C高级第二次PTA作业

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

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

C高级第二次PTA作业

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)流程图:

C高级第二次PTA作业

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.本题调试过程碰到问题及解决办法:

C高级第二次PTA作业

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)流程图:

C高级第二次PTA作业

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:

C高级第二次PTA作业

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

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

问题2:

C高级第二次PTA作业

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

C高级第二次PTA作业

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

C高级第二次PTA作业

我所评论的人:

辛静瑶: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

评论我的人:

陈天胤:

李新华:

申怡苗:

焦瑞君:

王文博:

C高级第二次PTA作业

C高级第二次PTA作业

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

知识点:

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

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

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

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

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

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

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

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

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