第二次作业
2018-03-27 22:07 梁圣然 阅读(281) 评论(8) 编辑 收藏 举报6-7 删除字符串中数字字符
一.设计思路
(1) 描述算法:
1.仔细阅读题目,了解题意。
2.查看主函数,并找出函数中的实参和形参。
3.定义一个字符串利用gets();函数输出字符串
4.调用函数delnum();删除字符串中的数字,输出结果。
(2)流程图:
二.实验代码:
void delnum(char *s){
int i,k;
k=0;
for(i=0;*(s+i)!='\0';i++){
if(!('0'<=*(s+i)&&*(s+i)<='9')){
*(s+k)=*(s+i);
k++;
}
}*(s+k)='\0';
}
三.调试过程中碰到的问题和解决办法
错误信息1:
错误原因:做题的时候马虎语句后“;”是中文格式由于在编程的时候经常借助shift输入符号导致错误
改正方法:在每句语句后注意加“;”注意,编程中符号英文
6-8 统计子串在母串出现的次数
一.设计思路
(1) 描述算法:
1.仔细阅读题目,了解题意。
2.查看主函数,并找出函数中的实参和形参。
3.利用while循环条件为遇到'\0'终止循环 在循环中char字符串组和 substr字符串组进行比较。
4.定义一个变量count 充当“计数器”最后return(count)。
(2) 流程图
二.实验代码
int fun(char *str,char *substr){
int count = 0;
while(*(str+3)!='\0')
{
if(*(str)==*(substr))
if(*(str+1)==*(substr+1))
if(*(str+2)==*(substr+2)){
count++;
}
str++;
}return (count);
}
三.调试过程中碰到的问题和解决办法
错误信息1:
错误原因:没有打出 str++导致while循环陷入死循环无法跳出
改正方法:在循环中打str++
6-9 字符串中除首尾字符外的其余字符按降序排列
一.设计思路
(1)描述算法
1.仔细阅读题目,了解题意。
2.查看主函数,并找出函数中的实参和形参。
3.定义四个变量i,j,k,change选择排序法因为不对第一个和最后一个进行排序所以i=1; i<num 同理j=i+1;j<num-1
4.通过for的双重循环实现选择排序法就会实现前一个和后一个相比较第一个 for k=i 第二个for中加入if语句比较大小,如果前一个小于后一个将k=j
5.利用if语句判断k是否等于i,不等于利用change变量实现交换,跳出函数
(2)流程图
略
二.实验代码
int fun(char *s,int num){
int i,j,k,change;
for(i=1;i<num-2;i++){
k=i;
for(j=i+1;j<num-1;j++){
if(*(s+k)<*(s+j)){
k=j;
}
}if(k!=i){
change=*(s+i);*(s+i)=*(s+k);*(s+k)=change;
}
}
}
三.调试过程中碰到的问题和解决办法
错误信息1:
错误原因:没有定义k直接利用i与j进行比较,这样改变了i值导致循环出错
改正方法:定义一个k 将i值赋给k 与j进行比较实现循环
7-1 输出学生成绩
一.设计思路
(1)描述算法
1.仔细阅读题目,了解题意。
2.定义出i,max,min,average,num,n
3.for循环输入学生的成绩,将数组中第一个值赋给max min 利用for 循环比较找出最大值最小值赋给max min
4.在循环中加入num=num+*(p+i)实现学生成绩累加和
5.平均值为总和除与人数最后输出注意输出格式还有所有数据为float型
(2) 流程图
略
二.实验代码
#include<stdio.h>
#include<malloc.h>
int main()
{
float average=0;
int n,i;
float num=0;
float *p=(float *)malloc(n);
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%f",&*(p+i));
}
i=0;
float max=*(p+i);
float min=*(p+i);
for(i=0;i<n;i++){
if(max<*(p+i)){
max=*(p+i);
}if(min>*(p+i)){
min=*(p+i);
}
num=num+*(p+i);
}average=num/n;
printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min);
}
三.调试过程中碰到的问题和解决办法
错误信息1:
错误原因:定义错误将float型定义成了int型
改正方法:根据题意改正从新定义改为float型
错误信息2:
错误原因:1.输出里没有按照float类型输出 2.没有符合题意格式输出顺序不对,没有加‘\n’
改正方法:printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",average,max,min)
7-1 计算职工工资(15 分)
一.设计思路
(1)描述算法
1.仔细阅读题目,了解题意
2.定义一个结构变量命名为money 在结构变量中定义char name[10]; float basic_salary;//基本工资 float floating_salary;//浮动工资 float expenditure;//支出 float real_wages;//实发工资
3.根据题意主函数中定义i n并输入n
4.声明结构体的变量名 struct money s[n]
5.给结构变量中的变变量赋值,并计算出实发工资
6.在用for循环输出姓名和实发工资注意格式
(2)流程图
略
二.实验代码
#include<stdio.h>
struct money{
char name[10];
float basic_salary;//基本工资
float floating_salary;//浮动工资
float expenditure;//支出
float real_wages;//实发工资
};
int main()
{
int n,i;
scanf("%d",&n);
struct money s[n];
for(i=0;i<n;i++){
scanf("%s %f %f %f",s[i].name,&s[i].basic_salary,&s[i].floating_salary,&s[i].expenditure);
s[i].real_wages=s[i].basic_salary+s[i].floating_salary-s[i].expenditure;
}
for(i=0;i<n;i++){
printf("%s %.2f\n",s[i].name,s[i].real_wages);
}
}
三.调试过程中碰到的问题和解决办法
错误信息1
错误原因:输出结构变量中的姓名name不用加& 因为name就代表字符串首地址 有的语句结束每家;号
改正方法:将s[i].name前的&去掉,在结束语句后补上;
错误信息2
错误原因:输出中没有加入“\n”换行
改正方法:加入“\n"符合题意
7-2 计算平均成绩
一.设计思路
(1)描述算法
1.仔细阅读题目,了解题意
2.定义一个结构表变量命名为change 在结构变量中定义 学号为student_number[6] 姓名为name[11] 成绩grade
3.主函数定义 i n average num i为循环变量输入n average为平均值 num为成绩的和
4.利用for循环输入学号,姓名,成绩 将成绩累加sum=sum+s[i].grade
5.求出平均值 总成绩除以人数,并将其输出
6.利用for循环然后学生成绩逐个比较输出成绩和学号姓名
(2)流程图
二.实验代码
#include<stdio.h>
struct change{
char student_number[6];
char name[11];
int grade;
};
int main()
{
int n,i;
float average=0;
int sum=0;
scanf("%d",&n);
struct change s[n];
for(i=0;i<n;i++){
scanf("%s %s %d",s[i].student_number,s[i].name,&s[i].grade);
sum=sum+s[i].grade;
}
average=sum*1.0/n;
printf("%.2f\n",average);
for(i=0;i<n;i++){
if(average>s[i].grade){
printf("%s %s\n",s[i].name,s[i].student_number);
}
}
}
三.调试过程中碰到的问题和解决办法
错误信息1
错误原因:姓名为10位 学号为5位 但是字符串中‘\0’占一个字符所以定义时加一
改正方法 char student_number[6]; char name[11]
错误信息2
错误原因:在输出平均成绩处没有加‘\n’
改正方法: printf("%.2f\n",average)
6-1 按等级统计学生成绩
一.设计思路
(1)描述算法
1.仔细阅读题目,了解题意
2.定义结构变量 结构变量中定义 num 姓名name[20] 成绩score 字符型grade
3.定义结变量名为stu[MAXN],*prt 定义整形i n count 循环输如每名学生的姓名学号成绩
4.调用函数set-grade 在函数中定义整形 i j利用循环调用结构体中的成绩依次判断,并记录不合格的学生返回j
5.最后输出学生的姓名学号成绩
(2)流程图
略
二.实验代码
int set_grade( struct student *p, int n ){
int i;
int j=0;
for(i=0;i<n;i++){
if((p+i)->score>=85 && (p+i)->score<=100){
(p+i)->grade = 'A';
}else if((p+i)->score>=70 && (p+i)->score<85){
(p+i)->grade = 'B';
}else if((p+i)->score>=60 && (p+i)->score<70 ){
(p+i)->grade = 'C';
}else{
(p+i)->grade = 'D';
j++;
}
}
return (j);
}
三.调试过程中碰到的问题和解决办法
错误信息1
错误原因:if....else 的语法错误else后不用加条件
改正方法:if(条件)........else
6-2 结构体数组按总分排序
一.设计思路
(1)描述算法
1.定义一个结构体变量命名为student 定义整形num 数组串name 成绩score 学号sun
2.定义变量名,定义整形i,j, 浮点型fioat 利用for循环输入同学的学号 姓名 内层循环输入成绩
3.调用函数calc 函数中定义i 用for循环求出三门成绩的总和
4.调用函数sort 定义整形i j k 选择排序法比较将学生的成绩排序
5.输出学生的成绩
(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,k;
k=0;
struct student t;
for(i=0;i<n-1;i++){
k=i;
for(j=i;j<n;j++){
if(((p+k)->sum)<((p+j)->sum)){
k=j;
}
}
if(k!=i){
t=*(p+i);*(p+i)=*(p+k);*(p+k)=t;
}
}
}
三.调试过程中碰到的问题和解决办法
错误信息1
错误原因:交换的时候也需要定义成结构变量体
改正方法:struct student t;
时间表
托管
链接
https://gitee.com/messi_beammessi6/second_pta_operation/tree/master
我评论的人
马卿辉 www.cnblogs.com/yeahbody
李伍壹 http://www.cnblogs.com/chenxidream/p/8654245.html
邓欣茹 http://www.cnblogs.com/dxfish/p/8747579.html
总结:
定义结构体的方法必须有struct标识符,在最后一定要有分号“;”,
在编译时对结构体类型是不分配内存的,只对变量分配内存。只能对结构体中的各个成员分别进行输入输出,不能够整体赋值,
“.”是成员(分量)运算法,优先级是最高的。
结构体变量既可以是数组也可以是指针变量。
(*p).name等价于p->name。->是指向运算符,p->name表示p指向结构体变量中的成员那么的值。