C-语言第二次作业(大一下)

要求一、设计过程

                                                      作业(1)

1.提交列表

6-7 删除字符串中数字字符

 2.设计思路(6分)

     (1)主描述题目算法。
         第一步:设出字符char *srt,char*substr;

         第二步:使用for循环语句和if语句,判断是否数字字符;

                   第三步: 循环寻找或结束语句。
     (2)流程图

主函数调用:

返回主函数:

 3.实验代码

void delnum(char *s)
{
        int i,m=0;
        for(i=0;*(s+i)!='\0';i++)
        {
            if(*(s+i)>='0'&&*(s+i)<='9')
            {
            }else
            {
                *(s+m)=*(s+i);
                m++;
            }
        }
        *(s+m)='\0';
    }

 

 

4.本题调试过程碰到问题及解决办法。

    
       改正方法:并且符号是两个&&。

     

6-8 统计子串在母串出现的次数

     (1)描述题目算法
         第一步:列出char*str,并使用函数char str[81]="asdasas";
         第二步:使用for语句和if语句统计字符出现字数,令str依次srt+i,str+i+1...; 

         第三步:返回函数。

3.实验代码(2分)   

int fun(char *str,char *substr){
        int i,count=0;
        for(i=0;*(str+i)!='\0';i++){
            if(*(str+i)==*(substr)){
                if(*(str+i+1)==*(substr+1)){
                    if(*(str+i+2)==*(substr+2)){
                        count++;
                    }
                }
            }
        }
        return count;
    }

 4.本题调试过程碰到问题及解决办法(4分)

    

       改正方法:‘\0'忘记加\,字符串是以\0为结束标志,找不到\0会越界访问。

      .

6-9 字符串中除首尾字符外的其余字符按降序排列

     (1)描述题目算法
         第一步:设出指针,用外循环控制循环数,num-1次;
         第二步:用for循环和if语句判断字符ASCII大小;

         第三步:判断后交换大小。

3.实验代码

int fun(char *s,int num){
         int i,j,k,temp;
         for(i=1;i<num-2;i++){
             k=i;
             for(j=i+1;j<num-1;j++){
                 if((int)(*(s+k))<(int)(*(s+j))){
                     k=j;
                 }
             }
            if(k!=i){
             temp=*(s+i);*(s+i)=*(s+k);*(s+k)=temp;
             }
        }
         return 0;
     }

 4.本题调试过程碰到问题及解决办法

     

       改正方法:第一次限制循环未控制在num-1次。

     

7-1 输出学生成绩

     (1)描述题目算法
         第一步:输入学生人数,动态分配;
         第二步:用for循环相加成绩;

         第三步:令max,min,等于数组第一个元素,比较大小,并用for循环交换。

3.实验代码   

 #include <stdio.h>
#include <stdlib.h>
int main()
{
    int i,n;
    float sum=0,average,max,min;
    scanf("%d",&n);
    float *p=(float *)malloc(n);
    for(i=0;i<n;i++){
        scanf("%f",(p+i));
        sum+=*(p+i);
    }
    min=*(p+0);max=*(p+0);
    for(i=0;i<n;i++){
        if(min>*(p+i)){
            min=*(p+i);
        }
        if(max<*(p+i)){
            max=*(p+i);
        }
    }
    printf("average = %.2f\n",sum/n*1);
    printf("max = %.2f\n",max);
    printf("min = %.2f\n",min);
    return 0;
}

4.本题调试过程碰到问题及解决办法

     

       错误原因:min=*(p);max=*(p);输出后与列子不同。
       改正方法:min=*(P+0);max=*(p+0);表示依次加。


 作业(2) 

1.提交列表

.

2.设计思路(6分)

 7-1 计算职工工资

        (1)描述题目算法。

         第一步:设出变量,使用结构算法;
         第二步:用for循环语句,保证正确输出;

                   第三步:令实际工资=s1.j+s1.f-s1.z,输出。
 

     (2)流程图

     

3.实验代码   

#include <stdio.h>
struct clerk
{
  float j,f,z;
  char name[10];
};

int main()
{
  int i,n;
  float pay;
  scanf("%d",&n);
  struct clerk s1;
  for(i=1;i<=n;i++)
  {
  scanf("%s %f %f %f",s1.name,&s1.j,&s1.f,&s1.z);
  pay=s1.j+s1.f-s1.z;
  printf("%s %.2f\n",s1.name,pay); 
  }
  return 0;
}

 4.本题调试过程碰到问题及解决办法。   

         错误原因:第一次使用数组的方法,麻烦且没有成功。
       改正方法:使用简单的for循环,数据结构就很容易编写。

7-2 计算平均成绩

      (1)描述题目算法。

         第一步:定义结构;

         第二步:计算平均值 ,输出;         

         第三步:用for循环,if语句,判断每人成绩是否小于平均值;若是。则输出,学生和学号。

3.实验代码 

#include <stdio.h>
struct student
{
  char num[6];
  char name[10];
  int grade;
  double average;
};

int main()
{
  int i,N,sum = 0;
  double average;
  scanf("%d",&N);
  struct student s[N];
  for(i=0;i<N;i++)
  {
  scanf("%s %s %d",s[i].num,s[i].name,&s[i].grade);
  sum = sum + s[i].grade;
  }
  average = (double)(sum/N);
  printf("%.2f\n",average);
  for(i=0;i<N;i++)
  {
  if(s[i].grade<average)
  {
   printf("%s %s\n",s[i].name,s[i].num);  
  }
  }  
  
  return 0;
}   

 4.本题调试过程碰到问题及解决办法。

                          解决方法:'\n'一直打成'/n',令答案错误。

作业(3)

1.提交列表

 2.设计思路(6分)

6-1 按等级统计学生成绩

          (1)描述题目算法。

         第一步:列出指针;     

         第二步:用for循环,if语句判断学生成绩是否小于60;

         第三步:count 在每次又小于60的同学,逐渐+1;

         第四步:返回count的值到主函数。

      (2)流程图

3.实验代码   

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

 4.本题调试过程碰到问题及解决方法。

 

                                    解决方法:要定义n。

6-2 结构体数组按总分排序

     (1)描述题目算法。
         第一步:列出指针,结构体;
         第二步:用for循环,一个循环第n个人的成绩总数值,一个计算第n个人的成绩总值;

                  第三步:用冒泡法排序,按总成绩大小排序,交换。

3.实验代码  

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

 4.本题调试过程碰到问题及解决办法(4分)

    

 

       错误原因:if((p+t)->sum)<((p+j)->sum)),少加一个括号。
       改正方法:加上即可。

要求二、学习总结和进度

1、总结两周里所学的知识点有哪些学会了?哪些还没有学会?

在这两周学习了结构和在结构体中使用指针。将结构和两个结构的写法听的很清楚明白并感觉对for循环和if语句又有了更清楚的认识。没有学习明白指针在结构的使用,还是对函数有些苦恼,会尽快弄明白。

2、GIT:https://git.coding.net/GUANCHENG/101.git

3、点评3个同学的本周作业。

  张心悦:http://www.cnblogs.com/zxy980612/p/8696690.html

  丰大为:http://www.cnblogs.com/DavidPark/p/8664273.html

  王姝雯:http://www.cnblogs.com/phsudie/p/8661686.html

4、折线图。

 

posted @ 2018-04-07 20:00  顾安城  阅读(293)  评论(8编辑  收藏  举报