第二次作业
提交列表
第一题
设计思路
1.因为要删除所有数字,那么在输出字符时,当数组内的元素等于数字时,数组输出零
2.用循环,把输出出来的新数组整合,就能得到想要的结果
流程图
代码
void delnum(char *s)
{
int i=0,j=0;
for(;s[i]!=\'\\0\';i++)
{
if(s[i]>\'9\'||s[i]<\'0\')
{
*(s+j++)=*(s+i);
}
}
*(s+j)=\'\\0\';
}
调试
对或跟且运用不是很熟悉
第二题
设计思路
1.设计个循环控制数组输出
2.当数组连续三次都相等时让num+1,最后输出num,即为出现的次数
代码
int fun(char *str,char *substr)
{
int num=0,i;
for(i=0;str[i]!=\'\\0\';i++)
{
if((str[i]==substr[0])&&(str[i+1]==substr[1])&&(str[i+2]==substr[2])){
num++;
}
}
return (num);
}
调试
改正方法:‘\\0\'忘记加,字符串是以\\0为结束标志,找不到\\0会越界访问。
第三题
设计思路
1.设计两个循环形成循环嵌套,然后控制字符串排序
2.借用冒泡排序法的思路,完成代码
代码
int fun(char*s,int num)
{
char t;
int i,j;
for(i=1;i<num-2;i++){
for(j=i+1;j<num-1;j++){
if(s[i]<s[j])
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
调试
无错误
第四题
设计思路
1.输入学生人数,动态分配,用for循环相加成绩
2.令max,min,等于数组第一个元素,比较大小,并用for循环交换
代码
#include<stdio.h>
float max_a(float x,float y);
float min_a(float x,float y);
int main()
{
int N,flag=1,D;
float average,max,min,sum=0.0;
scanf("%d",&N);
int i=0;
for(;i<N;i++){
scanf("%d",&D);
sum=sum+D;
if (flag==1)
{
max=D;
min=D;
flag--;
}
max=max_a(max,D);
min=min_a(min,D);
}
average=sum/N;
printf("average = %.2f\\nmax = %.2f\\nmin = %.2f",average,max,min);
}
float max_a(float x,float y)
{
float z;
if(x>y)
z=x;
else
z=y;
return(z);
}
float min_a(float x,float y)
{
float z;
if(x<y)
z=x;
else
z=y;
return(z);
}
调试
原因:缺少函数定义 float *p=(float *)malloc(n);
方法:通过与同学交流并查询书籍得知
第五题
设计思路
1.定义结构体。
2.用for循环输入n个员工的姓名 基本工资 浮动工资 支出。
3.计算并输出。
流程图
代码
#include<stdio.h>
struct person{
char name[100];
float w;
float w1;
float account;
}person1;
int main()
{
int n,i;
float pay;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s %f %f %f",&person1.name,&person1.w,&person1.w1,&person1.account);
pay=person1.w+person1.w1-person1.account;
printf("%s %.2f\\n",person1.name,pay);
}
return 0;
}
调试
问题:在编译器运行时结果跟输出样例一样,但是PTA判断我答案错误。
原因:在我仔细的审过题目后,我发现我漏掉了这一点 把定义的变量类型改为float后答案正确。
第六题
设计思路
1.使用结构体类型进行结构体变量的引用,且根据题意后面应为s1[10]。
2.输入N的值,遍历数组,输入s1[i].number,s1[i].name,s1[i].score并将它们储存起来,计算出sum的值。
3.在for循环中,判断s1[i].score与avg的大小,最后按要求输出元素
流程图
代码
#include <stdio.h>
struct score {
char number[6];
char name[10];
int score;
} s1[10];
int main ()
{
int N,i,sum=0;
float avg;
scanf("%d",&N);
for(i=0;i<N;i++) {
scanf("%s %s %d",s1[i].number,s1[i].name,&s1[i].score);
sum = sum + s1[i].score;
}
avg = sum/N;
printf("%.2f\\n",avg);
for(i=0;i<N;i++) {
if(s1[i].score<avg) {
printf("%s %s\\n",s1[i].name,s1[i].number);
}
}
return 0;
}
问题:输出时将s1[i].number的%s写成%d。
解决:在单步调试后知道错误的代码行,重新观察后找出问题所在
第七题
设计思路
1.定义一个结构体,并在其中定义学号num,姓名name,分数score,成绩等级grade。
2.主函数中:引用结构体,并输入学生个数n,用一个for语句进行数据录入,引用函数进行计算,最后进行输出。
3.函数中:用for语句进行遍历,并用if语句进行等级的区分,其中如果在D等级则不及格人数count加一。最后返回count值
代码
#include <stdio.h>
#define MAXN 10
int set_grade( struct student *p, int n )
{
int j=0,result=0;
for(j=0;j<n;j++)
{
if(p[j].score<60)
{
result++;
}
}
for(j=0;j<n;j++)
{
if(((p+j)->score)>=85&&((p+j)->score)<=100)
{
((p+j)->grade)=\'A\';
}else if(((p+j)->score)>=70&&((p+j)->score)<=84)
{
((p+j)->grade)=\'B\';
}else if(((p+j)->score)>=60&&((p+j)->score)<=69)
{
((p+j)->grade)=\'C\';
}else if(((p+j)->score)>=0&&((p+j)->score)<=59)
{
((p+j)->grade)=\'D\';
}
}
return result;
}
调试
问题:最开始没有看到返回不及格人数的条件,导致前两个点出现错误
第八题
设计思路
1.先定义函数,引入变量
2.在for循环中通过if语句进行多层判断,将学生成绩分出等级,然后使小于60分的单独计算出其数目,最后返回其值(count)即可
代码
#include <stdio.h>
void calc(struct student *p,int n)
{
int k=0;
for(k=0;k<n;k++)
{
(p+k)->sum=(p+k)->score[0]+(p+k)->score[1]+(p+k)->score[2];
}
}
void sort(struct student *p,int n)
{
int k=0,l=0;
struct student swap;
for(k=0;k<n;k++)
{
for(l=k+1;l<n;l++)
{
if(p[k].sum<p[l].sum)
{
swap=p[k];p[k]=p[l];p[l]=swap;
}
}
}
}
点评
学习总结和进度
1.本周学习的结构,但是运用还不是很纯熟,需要多加练习