大学第二次作业



  1. 删除字符串中数字字符:
    设计思路:首先定义一个数组,然后写入数组,引用函数,输出。定义一个指针p并将s赋给p,用一个for循环遍历字符串,并在其中用一个if语句判断是否是数字,如果是 p++=*s ,循环过后将最后一个赋上‘\0’;

`
#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';
 
}       

2 统计子串在母串出现的次数 1.设计思路:通过题目给出的字符串,使用双重for循环遍历数组,从循环中先找出相同的字符串,再判断出现次数。 代码:
#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. 字符串中除首尾字符外的其余字符按降序排列 .设计思路: 先定义字符数组s,写入字符串,引用函数,输出排序后所得的字符串。用一个for循环表示循环的趟数,由于只需要排出排除首尾的顺序所以只需要循环num-3次,在此循环下再用一次循环进行排序,并且只需要排出从第二个到num-j-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;

}
`

  1. 输出学生成绩:
    设计思路:
    输入数字个数n,动态存储分配。用for语句进行输入数据,并计算和,for语句结束后计算出平均值。令最大,最小值等于第0个数,遍历所有数据,并在其中用两个if语句判断出最大值和最小值并记录。输出最大最小值和平均数。
    实验代码:`

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);

}
5.计算职工工资 1.设计思路:首先定义结构体变量,然后输入,引用结构体变量,使用循环输出各项。 2.实验代码:
#include<stdio.h>

typedef struct work  

{  

    char name[100];  

    float base;  

    float fdgz;  

    float expend;  

    float sum;  





}WORK;  

int main()  

{  

    WORK s[10000];  

    int n, i,j;  

    scanf("%d", &n);  

    for (i = 0; i < n; i++)  

    {  



        scanf("%s", &s[i].name);  

        scanf("%f", &s[i].base);  

        scanf("%f", &s[i].fdgz);  

        scanf("%f", &s[i].expend);  

        s[i].sum = (s[i].base + s[i].fdgz)-s[i].expend;  

    }  

    for (j = 0; j < n;j++)  

    {  

        printf("%s %.2f\n", s[j].name, s[j].sum);  



    }  

    return 0;  

}

`
流程图:
6. 计算平均成绩:
设计思路:
定义一个结构体,并在其中定义学号num,姓名name,分数score。主函数中先输入整数n,引用结构体,用一个for循环输入学号,姓名,分数并计算出分数的和。计算出平均数。用一个for循环遍历数据,并用if语句判断当前分数是否低于平均数,如果是输出相应的姓名和学号。
实验代码: #include<stdio.h>

struct student{

    char num[6];

    char name[10];

    double grade;

}s[1000];

int main()

{

    int n;

    scanf("%d\n",&n);

    int i;

    double sum=0;

    double average;

    for(i=0;i<n;i++)

    {

        scanf("%s %s %lf",&s[i].num,&s[i].name,&s[i].grade);



    }

         int j;

    for(j=0;j<n;j++)

    {

            sum=sum+s[j].grade;

    }

    average=sum/n;

    printf("%.2lf\n",average);

    for(j=0;j<n;j++)

    {

        if(average>s[j].grade)

        {

            printf("%s %s\n",s[j].name,s[j].num);

        }

    }

    return 0;



}

`
7.按等级统计学生成绩
设计思路:先定义函数,引入变量,在for循环中通过if语句进行多层判断,将学生成绩分出等级,然后使小于60分的单独计算出其数目,最后返回其值(count)即可。
2.实验代码: int set_grade( struct student *p, int n ){

    int count = 0, i;

    for(i = 0;i<n;i++,p++){

        if(p->score<60){

            p->grade = 'D';

            count++;

        }

        else if((p->score<70)&&(p->score>=60)){

            p->grade = 'C';

        }

        else if((p->score<85)&&(p->score>=70)){

            p->grade = 'B';

        }

        else{

            p->grade = 'A';

        }

    }

    return count;

}

流程图:![](https://images2018.cnblogs.com/blog/1238411/201804/1238411-20180408184733311-899188134.png) 8. 结构体数组按总分排序 设计思路:调用calc函数,使用循环进行计算。然后调用sort函数,使用for循环,在循环中用if语句判断,进而返回值。 实验代码:
void calc(struct student *p,int n)

{

int i=0;

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 j=0,min=0;

struct student a;

for(j=0;j<n;j++)

{

if((p+j)->sum<(p+min)->sum)

{

  min=j;

}

}

a=*(p+min);

(p+min)=(p+n-1);

*(p+n-1)=a;

if(n>1)

{

n--;

sort(p,n);

}

}
`
点评同学
1http://www.cnblogs.com/lhyyy/p/8711554.html
2http://www.cnblogs.com/shilcz/p/8696341.html
3http://www.cnblogs.com/DavidPark/p/8664273.html
总结:近2周的学习,让我在c语言的学习中有了很大进展,也获得了许多新知识,比如结构体struct,再比如如何使用已定义的变量类型定义变量,如何多变的使用指针等。现在我的思路还是不太好,并不能快速的理解和在脑内构成解题的程序,常常需要他人提醒,我还需要勤加联系

posted @ 2018-04-08 18:57  流淌的时之沙  阅读(198)  评论(4编辑  收藏  举报