当前位置: 首页 > news >正文

C语言——第二次作业(2)

作业要求一

PTA作业的提交列表

第一次作业

1238335-20180328205438988-1793216027.gif

第二次作业

1238335-20180401191132499-2081255675.gif

第三次作业

1238335-20180402203541962-248339938.gif

作业要求二

题目1.删除字符串中数字字符(函数题)

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义i=0、j=0,i为原字符数组角标,j为删除后字符数组角标。使用循环语句读取字符数组元素,当字符数组元素为数字字符'0'~'9'时不进行操作,当字符数组元素为其它字符元素时,吧s[i]赋值给s[j],并让j加一。当s[i]为结束字符'\0'时,循环结束,并添加结束字符。

第三步:结果返回主函数。

- (2)流程图

1238335-20180403214333241-1211147017.png

2.实验代码

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

完整代码

#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)
{
    int i,j;
    for(i = 0, j = 0; s[i] != '\0'; i++) 
    {
        if (!s[i] >= '0' && s[i] <= '9') 
        {
            s[j] = s[i];
            j++;
        }   
    }
    s[j] = '\0';
    return;
}

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

本题未遇到问题。

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

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义i、j、n,使用双重循环结构,外层循环用来遍历数组元素,内层循环判断字符数组元素是否相等,完全相等时,可遍历子串,则次数加一。

第三步:结果返回主函数。

- (2)流程图:略。

2.实验代码

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

完整代码

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

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

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

解题没有什么错误,但是我自己有两个小问题。

(1)当我写完代码后,发现自己解题并没有使用指针的思想,于是想尝试重新用指针的方式解题,但是却没有什么好的思路,最多就是将a[i]和*(a+i)进行替换,所以我现在还是不能较好的使用指针。

(2)PTA题目所给出的主函数只能应用于题目所给出的案例,不好验证代码的正确性,所以我将主函数内直接给出的字符串改成输入进行运行调试。

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

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义i、j,使用双重循环结构,外层循环用来遍历字符串中除首尾字符外的其余字符,内层循环判断字符数组元素大小(选择排序法)。

第三步:结果返回主函数。

- (2)流程图:略。

2.实验代码

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

完整代码

#include <stdio.h>
int fun(char *s,int num);
int main()
{
    char s[10];
    gets(s);
    fun(s,10);
    printf("%s",s);
    return 0;
 }
int fun(char *s,int num)
{
    int i,j;
    for(i = 1; *(s+i+2) != '\0'; i++)
    {
        for(j = i; *(s+j+2) != '\0'; j++)
        {
            if(*(s+i) < *(s+j+1))
            {
                int t;
                t = *(s+i);
                *(s+i) = *(s+j+1);
                *(s+j+1) = t;
            }
        }
    }
    return *s;
} 

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

同上一题,PTA题目所给出的主函数可应用范围很小。

题目4. 输出学生成绩

1.设计思路

- (1)算法

第一步:定义所需变量,输入学生人数。

第二步:使用动态内存分配语句。

第三步:使用循环结构,对学生成绩进行输入,并计算平均成绩。使用冒泡排序法,将成绩从大到小排列。

第四步:输出结果。

- (2)流程图:略

2.实验代码

#include<stdio.h>
int main()
{
    int N, a[N];
    float sum, average;
    scanf("%d",&N);
    if ((a[N] = (float *)malloc(N*sizeof(float))) == NULL)
    {
        printf("Not able to allocate memory. \n");
        exit (1);
    }
    int i, j, k;
    for(i = 0; i < N; i++)
    {
        scanf("%d",&a[i]);
        sum = sum + a[i];
    }
    average = sum / N;
    for(j = 0; j < N - 1; j++)
    {
        for(k = 0; k < N - 1 - j; k++)
        {
            int t = 0;
            if(a[k] > a[k+1])
            {
                t = a[k];
                a[k] = a[k+1];
                a[k+1] = t;
            }
        }
    }
    printf("average = %.2f\nmax = %.2f\nmin = %.2f",average,(float)a[N-1],(float)a[0]);
    return 0;
}

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

第一次提交未使用动态内存分配,不过提交通过了,之后经提醒添加使用了动态内存分配语句。

题目5. 计算职工工资

1.设计思路

- (1)算法

第一步:定义结构体变量,成员包括——姓名、基本工资、浮动工资、支出和实发工资。

第二步:输入人数n,引用结构体变量。

第三步:使用循环结构,输入姓名、基本工资、浮动工资、支出,计算实发工资,并输出姓名和实发工资。

- (2)流程图

1238335-20180403212857199-113232132.png

2.实验代码

#include<stdio.h>
struct clerk
{
    char name[10];
    float wages, floating, pay, wage;
}c1;
int main()
{
    int n, i;
    scanf("%d",&n);
    struct clerk c[n];
    for(i = 0; i < n; i++)
    {
        scanf("%s %f %f %f",c[i].name, &c[i].wages, &c[i].floating, &c[i].pay);
        c[i].wage = c[i].wages + c[i].floating - c[i].pay;
        printf("%s %.2f\n",c[i].name, c[i].wage);
    }
}

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

无。

题目6. 计算平均成绩

1.设计思路

- (1)算法

第一步:定义结构变量,成员包括——学号、姓名和成绩。

第二步:输入人数N,引用结构体变量。

第三步:使用循环结构,输入学号、姓名和成绩,计算总成绩。

第四步:计算平均成绩并输出。

第五步:使用循环结构,选择成绩低于平均的并输出。

- (2)流程图:略。

2.实验代码

#include<stdio.h>
struct student
{
    char id[6], name[10];
    int achievement;
}s1;
int main()
{
    int N, i;
    double sum = 0, average = 0;
    scanf("%d",&N);
    struct student s[N];
    for(i = 0; i < N; i++)
    {
        scanf("%s %s %d",s[i].id,s[i].name,&s[i].achievement);
        sum = s[i].achievement + sum;
    }
    average = sum / N;
    printf("%.2f\n",average);
    for(i = 0; i < N; i++)
    {
        if(s[i].achievement < average)
            printf("%s %s\n",s[i].name,s[i].id);
    } 
}

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

本题出现了一个小错误,输入时成绩没有加“&”符号,导致程序无法运行。要时刻保持认真的态度,不要犯这样的错误。

题目7.按等级统计学生成绩(函数题)

1.设计思路

- (1)算法

第一步:调用定义函数。

第二步:使用循环结构,循环判断每个学生的等级,N为不及格人数,当学生为D等级时,N加一。

第三步:结果返回主函数。

- (2)流程图

1238335-20180403213921904-1273084797.png

2.实验代码

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

完整代码

#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,N = 0;
    for(i = 0; i < n; i++)
    {
        if((p+i)->score <= 100 && (p+i)->score >= 85)
            (p+i)->grade = 'A';
        else if((p+i)->score <= 84 && (p+i)->score >= 70)
            (p+i)->grade = 'B';
        else if((p+i)->score <= 69 && (p+i)->score >= 60)
            (p+i)->grade = 'C';
        else if((p+i)->score <= 59 && (p+i)->score >= 0)
        {
            (p+i)->grade = 'D';
            N++;
        }   
    }
    return N;
}

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

错误一:本题出现了编译错误,后发现我将题目中完整代码进行了提交。

1238335-20180402213030272-367921913.gif

错误二:本次有测试点出现错误,错误提示为warning: ignoring return value of ‘scanf’。

1238335-20180402213312973-290110004.gif

解决方法:使用原输入值n对循环进行判断,问题解决。

题目8.结构体数组按总分排序(函数题)

1.设计思路

- (1)算法

第一步:调用calc函数,使用双重循环结构,内层循环通过循环计算单个学生总成绩,外层循环通过循环改变学生。

第二步:调用sort函数,通过对sum的比较使用冒泡排序法对学生进行排序。

- (2)流程图:略。

2.实验代码

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

完整代码

#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, j;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < 3; j++)
        { 
            p->sum = p->score[j] + p->sum;
        }
        p++;
    }
} 
void sort(struct student *p,int n)
{
    int i, j;
    struct student t;
    for(i = 1; i < n; i++)
       for(j = 0; j < n - i; j++)
           if(p[j].sum < p[j+1].sum){
              t = p[j];
              p[j] = p[j+1];
              p[j+1] = t;
           }
}

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

本题在void函数中添加了返回语句,删除即可解决问题。

1238335-20180402213542556-1938098070.gif

作业要求三

1、学习总结

所学知识点:对指针的复习,动态内存分配,定义结构体变量及结构体变量的引用,以及数组、指针、结构的结合使用。

有关动态内存的分配,老师讲述较为简单,不过网上有很多相关资料,在这里分享一篇我找到的较为详尽的文章:《C语言中手把手教你动态内存分配》。

存在问题:不能较好的使用指针。

2、我的Git地址

1238335-20180402212023447-1970943921.gif

3、点评链接(待添加)

链接一

链接二

链接三

4、图表

1238335-20180408175341297-712594299.png
1238335-20180408175449178-1392185914.png
1238335-20180408175528417-1778184425.png

转载于:https://www.cnblogs.com/dx2017/p/8666072.html

相关文章:

  • Mark
  • winform httpclient 多文件上传
  • 一维数组高效率解决杨辉三角
  • 使用 Except 和 Intersect
  • ES6 使用forEach遍历数组
  • 初学MySQL基础知识笔记--02
  • Shell报错bash^M /bin/bash^M: bad interpreter: No such file or directory
  • TFRecords文件的生成和读取(1)
  • lis最长递增子序列
  • Python全栈之路系列之深浅拷贝
  • mysql之count,max,min,sum,avg,celing,floor
  • 课堂小练习
  • 【题解】 [POI2012]FES-Festival (差分约束)
  • mac环境下配置nginx
  • 迭代器(Iterator)
  • Angular 2 DI - IoC DI - 1
  • ECS应用管理最佳实践
  • github指令
  • iOS 系统授权开发
  • JavaScript标准库系列——Math对象和Date对象(二)
  • javascript从右向左截取指定位数字符的3种方法
  • leetcode-27. Remove Element
  • Material Design
  • Octave 入门
  • PHP CLI应用的调试原理
  • python3 使用 asyncio 代替线程
  • Python连接Oracle
  • Redis中的lru算法实现
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 闭包--闭包作用之保存(一)
  • 警报:线上事故之CountDownLatch的威力
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 再次简单明了总结flex布局,一看就懂...
  • Python 之网络式编程
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (2)STL算法之元素计数
  • (AngularJS)Angular 控制器之间通信初探
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)c52学习之旅-独立按键
  • (十一)手动添加用户和文件的特殊权限
  • (转)fock函数详解
  • (状压dp)uva 10817 Headmaster's Headache
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net 6.0 处理跨域的方式
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 中的轻量级线程安全
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net和jar包windows服务部署
  • .NET企业级应用架构设计系列之技术选型
  • ??javascript里的变量问题