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=;
for(i=;*(s+i)!='\0';i++){
if(*(s+i)>=''&&*(s+i)<=''){
}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=;
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:无
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=;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.本题调试过程碰到问题及解决办法:
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作业(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函数;
结构体的定义与使用,如何对结构体变量赋值;
->指向运算符;.是成员运算符;