2018第二次作业

一.代码:

1237539-20180328184024905-1634831031.png
1237539-20180331221000058-1229052350.png
1237539-20180407091611620-643507384.png

1. 删除字符串中数字字符:

1).设计思路:

(1).文字描述:

第一步:主函数,定义一个数组,写入数组,引用函数,输出。
第二步:定义一个指针p并将s赋给p,用一个for循环遍历字符串,并在其中用一个if语句判断是否是数字,如果是 p++=*s ,循环过后将最后一个赋上‘\0’;

(2).流程图:

主函数
1237539-20180401200348074-250336443.png
函数
1237539-20180401200429985-712957507.png

2).实验代码

` 
#include <stdio.h>
void delnum(char *s);
int main ()
{ char item[80];
gets(item);
 delnum(item);
 printf("%s\n",item);
 return 0;
}

void delnum(char *s)
{
    char *p = s;
    for(;*s;s++)
   {
         if ( *s >'9' || *s < '0' )
               *p++=*s ;
   }
   *p='\0';
     
}       
`

3).遇到的问题:

未遇到问题。

2. 统计子串在母串出现的次数:

1).设计思路:

(1).文字描述:

第一步:主函数定义一个待查找的数组并赋值,定义一个被查找的字符串,引用函数并将函数的值赋给n,输出n的值。
第二步:函数,遍历字符串,并在for语句中用一个if语句判断当前三个字符分别为a,s,d如果是n++,最后统计出n的值,最后返回n值。

2).实验代码

`
#include<stdio.h>
int fun(char *str,char *substr);
int main()
{ char str[81]="asdasasdfgasdaszx67asdmklo",substr[4]="asd";
 int n;
 n=fun(str,substr);
 printf("n=%d\n",n);
 return 0;
}

/* int fun(char *str,char *substr)
{
    int n=0,i;
    for(i = 0;*(str + i) != '\0';i++){
        if(*(str + i) == 'a'&&*(str+i+1) == 's' && *(str + i + 2) == 'd'){
            n++;
        }
    }
    return n;
    
}  */ 

int fun(char *str,char *substr) 
{
    int count = 0;
    char *p=str,*ps= substr;
    for(;*p != '\0';p++){
        ps = substr;
        if(*ps == *p){
            while(*p == *ps){
                if(*p == *ps){
                p++;
                ps++;
            }else break;
            }
            
        }
        if(*p == '\0'){
            count ++;
        }
    }   
    return count;
 }      
`

3).遇到的问题:

未遇到问题。

3. 字符串中除首尾字符外的其余字符按降序排列:

1).设计思路:

(1).文字描述:

第一步:主函数,定义字符数组s,写入字符串,引用函数,输出排序后所得的字符串。
第二步:函数,用一个for循环表示循环的趟数,由于只需要排出排除首尾的顺序所以只需要循环num-3次,在此循环下再用一次循环进行排序,并且只需要排出从第二个到num-j-2个数的顺序。

2).实验代码

`    
#include <stdio.h>
int fun(char *s,int num);
int main()
{
 char s[10];
 gets(s);
 fun(s,7);
 printf("%s",s);
 return 0;
 }

int fun(char *s,int num)
{
    int i,j;
    char t;
    for(j=0;j<num-3;j++)
       for(i=1;i<num-j-2;i++)
        if(s[i]<s[i+1])
       {t=s[i]; s[i]=s[i+1]; s[i+1]=t;}
}    
`

3).遇到的问题:

在for语句中循环次数错过两次,出现下面的问题。
1237539-20180328185320778-1105430202.png
这个问题是因为运用冒泡排序法的时候for循环次数过多。
之后通过改进for循环的次数纠正了错误。

4. 输出学生成绩:

1).设计思路:

(1).文字描述:

第一步:输入数字个数n,动态存储分配。
第二步:用for语句进行输入数据,并计算和,for语句结束后计算出平均值。
第三步:令最大,最小值等于第0个数,遍历所有数据,并在其中用两个if语句判断出最大值和最小值并记录。
第四步:输出最大最小值和平均数。

2).实验代码

`
#include<stdio.h>

int main()
{
    int *p,i,sum = 0,max,min,n;
    double avg;
    scanf("%d",&n);
    
    if((p=(int*)calloc(n,sizeof(int)))==NULL){
         exit(1);
    }
    
    for(i=0;i<n;i++){
        scanf("%d",&*(p+i));
        sum = sum + *(p+i);}
    
    avg = (double)sum /(double) n;
    max = *p;
    min = *p;
    for(i=1;i<n;i++){
        if(*(p + i) > max){
            max = *(p+i);
        }
        
        if(*(p + i) < min){
            min = *(p+i);
        }
    }
      
    printf("average = %.2lf\nmax = %.2lf\nmin = %.2lf",avg,(double)max,(double)min);
              free(p);
    
}        
`

3).遇到的问题:

再求平均数的时候忘记转化成double型了,导致最后输出的数全为整数。

5计算职工工资:

1).设计思路:

(1).文字描述:

第一步:定义一个结构体,并在其中定义姓名,基本工资,浮动工资和支出。
第二步:主函数中输入数据个数n,引用结构体。
第三步:用一个for循环进行数据录入,再用一个for循环将计算后的数据输出。

(2).流程图:

1237539-20180401200733076-692331309.png

2).实验代码

`
#include <stdio.h>


struct emp{
        char  name[10];
        double jbg;
        double fdg;
        double zc;
    } ;
    
int main ()
{
    
    int i, n;
    scanf("%d", &n);
    struct emp s[n] ;
 for(i=0;i<n;i++)
 {
    scanf("%s %lf %lf %lf",s[i].name,&s[i].jbg,&s[i].fdg,&s[i].zc);
 }
     for (i = 0; i < n; i++)
  {
    printf ("%s %.2lf\n", s[i].name, s[i].jbg + s[i].fdg - s[i].zc);
  }
}
`

3).遇到的问题

在主函数中忘记引用“struct emp s[n] ;”导致错误。
请教班级的同学后进行改正。

6. 计算平均成绩:

1).设计思路:

(1).文字描述:

第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score。
第二步:主函数中先输入整数n,引用结构体,用一个for循环输入学号,姓名,分数并计算出分数的和。
第三步:计算出平均数。
第四步:用一个for循环遍历数据,并用if语句判断当前分数是否低于平均数,如果是输出相应的姓名和学号。

2).实验代码

`
#include <stdio.h>

struct student{
        
        char num[10],name[10];
        double score;
};
    
int main ()
{
    double avg,sum = 0;
    int i, n;
    scanf("%d", &n);
    struct student s[n] ;
    for(i = 0;i < n;i ++)
    {
        scanf("%s %s %lf",&s[i].num,s[i].name,&s[i].score);
        sum = sum + s[i].score;
    }
     
     avg = sum / n;
     printf("%.2lf\n",avg);
     
    for(i = 0; i < n; i++)
    {
        if(s[i].score < avg)
        printf ("%s %s\n", s[i].name,s[i].num);
    }
}
`

3).遇到的问题:

1237539-20180331212220388-331528684.png
出现上面的情况输出学号的时候前面的0不见了。
后来想到要想保留前面的0需要将学号的类型改为字符型。

7. 按等级统计学生成绩:

1).设计思路:

(1).文字描述:

第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score,成绩等级grade。
第二步:主函数中:引用结构体,并输入学生个数n,用一个for语句进行数据录入,引用函数进行计算,最后进行输出。
第三步:函数中:用for语句进行遍历,并用if语句进行等级的区分,其中如果在D等级则不及格人数count加一。最后返回count值。

2).实验代码

`
#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

int set_grade( struct student *p, int n )
{
    int i,count = 0;
    for(i = 0;i < n;i ++,p++){
        if(p->score <=100 && p->score >= 85){
            p->grade = 'A';
        }else if(p->score <85 && p->score >= 70){
            p->grade = 'B';
        }else if(p->score <70 && p->score >= 60){
            p->grade = 'C';
        }else{
            p->grade = 'D'; 
            count ++;
        }
    }
    return count;
 } 

    `

3).遇到的问题:

最开始没有看到返回不及格人数的条件,导致前两个点出现错误。

8. 结构体数组按总分排序:

1).设计思路:

(1).文字描述:

第一步:定义一个结构体,并在其中定义学号num,姓名name,分数score,分数和sum。
第二步:主函数中:先引用结构体,用一个for语句进行数据输入,引用函数calc求出每名学生的总分,函数sort按每名学生的总分从高到低对这组数据进行排序,用一个for语句进行输出。
第三步:函数calc:仅需一个for语句进行遍历,并在遍历过程中算出sum值。
第四步:函数sort:定义一个结构体t为之后交换做准备,之后用冒泡排序法进行排序即可。

(2).流程图:

主函数:
1237539-20180403191237184-1953698793.png
函数calc:
1237539-20180403191352912-1194083411.png

函数sort:
1237539-20180403191430933-140705077.png

2).实验代码

`
#include <stdio.h>
struct student                  
{
int num;
char name[15];
float score[3];
float sum;
};
void calc(struct student *p,int n);  
void sort(struct student *p,int n);
int main()
{
struct student stu[5];
int i,j;
float f;
for(i=0;i<5;i++)
{
    scanf("%d%s",&stu[i].num,stu[i].name);
    for(j=0;j<3;j++)
    { 
        scanf("%f",&f);
        stu[i].score[j]=f;
    }
}
calc(stu,5);
sort(stu,5);
for(i=0;i<5;i++)
{
    printf("%5d%15s",stu[i].num,stu[i].name);
    printf("  %.1f  %.1f  %.1f  %.1f\n",stu[i].score[0],stu[i].score[1],stu[i].score[2], stu[i].sum);
}
return 0;

}

void calc(struct student *p,int n)
{
    int i;
    for(i = 0;i < n;i ++,p++){
        p->sum = p->score[0] + p->score[1] + p->score[2];
        
    }
}

void sort(struct student *p,int n)
{
    int j,i;
    struct student t;
        for(j=1;j<=n-1;j++)
       for(i=0;i<=n-j-1;i++){
            if((p + i)->sum < (p + i + 1)->sum){
                t = *(p + i);
                *(p + i)= *(p+ i + 1);
                *(p+ i + 1)= t;
               }
       }
}
    


    `

3).遇到的问题:

1237539-20180402205222006-1413878650.png

最初在第二个函数中将t定义为int型,发现编译的时候出现问题,最后改为引用结构体定义t;

二,学习总结和进度:

1.近期所学知识点:

首先是对指针进行了深入的复习,并对pta中出现的问题进行讲评。之后,这两周主要学习了结构。首先学习的就是对结构体的概念和定义,并且在所需结构调用时需要在函数中调用一下结构体再去使用。再之后学习到结构数组,其中引用格式为结构数组名[下标].结构成员名。最后,学到了结构指针引用格式可以为p->结构成员名。

2.Git:

Git地址;
1237539-20180407092335597-351765677.png

3.学习进度:

1).表格:

日期代码行数代码时间博客字数博客时间知识点
3.261009000pta
3.2715012000pta
3.2800500120博客园
3.2920012000pta
3.30503000结构体
3.311005010060pta
4.1005060博客园
4.22009030090pta
4.30020060博客园
4.4503000结构体的引用
4.51005000结构体与数组
4.6803000结构体与数组
4.71006010060结构体与指针
4.8806010030结构体与指针

2).折线图:

1237539-20180408190029083-806469480.png

4.作业互评:

1,点评同学作业:

于耀淞;
胡景文;
赵寅胜;

2,邀请同学点评作业:

胡景文;
班庆泽;
董欣;

转载于:https://www.cnblogs.com/DavidPark/p/8664273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值