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=;
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函数;
结构体的定义与使用,如何对结构体变量赋值;
->指向运算符;.是成员运算符;
C高级第二次PTA作业的更多相关文章
- 第二周c语言PTA作业留
6-1 计算两数的和与差(10 分) 本题要求实现一个计算输入的两数的和与差的简单函数. 函数接口定义: void sum_diff( float op1, float op2, float psum ...
- C高级第二次作业
PTA作业第一部分 6-7 删除字符串中数字字符(10 分) 删除一个字符串中的所有数字字符. 函数接口定义: void delnum(char *s); 其中 s是用户传入的参数. 函数的功能是删除 ...
- C高级第一次PTA作业 要求三
要求一.要求二 内容链接:http://www.cnblogs.com/X-JY/p/8550457.html 一.PTA作业中的知识点总结 1.6-1 计算两数的和与差(10 分) (1)*在程序中 ...
- 2018上C语言程序设计(高级)博客作业样例
要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...
- 2018上C语言程序设计(高级)- 第1次作业成绩
作业地址 https://edu.cnblogs.com/campus/hljkj/CS2017-01/homework/1638 评分准则 第一次作业各项成绩包括三项: 完成PTA所有题目:20分 ...
- C高级第三次作业
C高级第三次作业(1) 6-1 输出月份英文名 1.设计思路 (1)算法: 第一步:定义整型变量n,字符指针s,输入一个数赋给n. 第二步:调用函数getmonth将值赋给s. 第三步:在函数getm ...
- 2016福州大学软件工程第二次团队作业——预则立&&他山之石成绩统计
第二次团队作业--预则立&&他山之石成绩统计结果如下: T:团队成绩 P:个人贡献比 T+P:折算个人成绩,计算公式为T+T/15*团队人数*P 学号 组别 Team P T+P 03 ...
- 关于Axure RP软件的介绍——软件工程实践第二次个人作业
关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...
- SDN 第二次上机作业
SDN第二次上机作业 1.控制器floodlight所示可视化图形拓扑的截图,及主机拓扑连通性检测截图 拓扑 连通性 2.利用字符界面下发流表,使得'h1'和'h2' ping 不通 流表截图 连通性 ...
随机推荐
- linux删除文件后不释放磁盘的问题
1. 用df 检查发现根目录可用空间越为200M # df -h Filesystem Size Used Avail Use% Mounted on /dev/xvde1 .9G .4G 232M ...
- Spring JdbcTemplate 查询结果集Map反向生成Java实体(转)
原文地址:Spring JdbcTemplate 查询结果集Map反向生成Java实体 以前写过一篇文章吐槽过Spring JdbcTemplate的queryForList方法(参见:http:// ...
- JAVA的SPI简单应用
最近在研究dubbo时,发现了JAVA的SPI特性.SPI的全名为Service Provider Interface,是JDK内置的一种服务发现机制. 具体实现: 1.定义一个接口 public i ...
- C#如何通过反射调用类下的方法
首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...
- Win10系列:VC++ Direct3D模板介绍1
Visual Studio为开发Direct3D应用程序提供了便捷的模版,读者可以不必手动去新建Direct3D中所使用到的基础资源,而只需专注于图形的绘制.本小节主要为读者介绍这个模版中用于绘制图形 ...
- es6新增的math函数有哪些
Math.trunc():用于去除一个数的小数部分,返回整数部分. Math.sign():用来判断一个数到底是正数.负数.还是零. Math.cbrt():用于计算一个数的立方根. Math.hyp ...
- 《Python》常用模块之collections模块
内置的数据类型: int float complex str list tuple dict set 基础数据类型: int float complex str list tuple ...
- [leetcode53]最长子数组 Maximum Subarray Kadane's算法
[题目] Given an integer array nums, find the contiguous subarray (containing at least one number) whic ...
- python socket 网络编程selector用法 (实用)
Server端: import socketimport selectors class Server(object):def init(self,sel,sock):self.sel = selse ...
- Cracking The Coding Interview 3.6
// Write a program to sort a stack in ascending order. You should not make any assumptions about how ...