C语言——第二次作业(2)
作业要求一
PTA作业的提交列表
第一次作业
第二次作业
第三次作业
作业要求二
题目1.删除字符串中数字字符(函数题)
1.设计思路
- (1)算法
第一步:调用定义的函数。
第二步:定义i=0、j=0,i为原字符数组角标,j为删除后字符数组角标。使用循环语句读取字符数组元素,当字符数组元素为数字字符'0'~'9'时不进行操作,当字符数组元素为其它字符元素时,吧s[i]赋值给s[j],并让j加一。当s[i]为结束字符'\0'时,循环结束,并添加结束字符。
第三步:结果返回主函数。
- (2)流程图
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)流程图
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)流程图
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.本题调试过程碰到问题及解决办法
错误一:本题出现了编译错误,后发现我将题目中完整代码进行了提交。
错误二:本次有测试点出现错误,错误提示为warning: ignoring return value of ‘scanf’。
解决方法:使用原输入值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函数中添加了返回语句,删除即可解决问题。
作业要求三
1、学习总结
所学知识点:对指针的复习,动态内存分配,定义结构体变量及结构体变量的引用,以及数组、指针、结构的结合使用。
有关动态内存的分配,老师讲述较为简单,不过网上有很多相关资料,在这里分享一篇我找到的较为详尽的文章:《C语言中手把手教你动态内存分配》。
存在问题:不能较好的使用指针。
2、我的Git地址
3、点评链接(待添加)
链接一
链接二
链接三
4、图表
C语言——第二次作业(2)的更多相关文章
- C语言--第二周作业
****学习内容总结**** 1.Git和编辑器截图 2.MOOC截图 3.阅读<提问的智慧>感想 读完<提问的智慧>之后,我认为在提问时,要根据以下步骤: 谨慎明确的描述症状 ...
- C语言第二次作业 ,
一:修改错题 1输出带框文字:在屏幕上输出以下3行信息. 将源代码输入编译器 运行程序发现错误 错误信息1: 错误原因:将stido.h拼写错误 改正方法:将stido.h改为stdio.h 错误信息 ...
- c++语言第二次作业
一题目7-1统计学生成绩 1实验代码 #include<stdio.h> int main(void) { int i,n,grade,A,B,C,D,E; A=B=C=D=E=; sca ...
- C语言--第二周作业评分和总结(5班)
作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1026 一.评分要求 要求1 阅读指定博客+阅读收获+例子.(5分) 要求2 ...
- C语言第二次作业-----顺序结构
一:改错题 (1)输出指定信息: 将给定源代码输入编译器: 执行编译命令,发现编译器报错,错误信息如下: 经检查,发现源程序将"stdio.h"误拼为"stido.h&q ...
- c语言第二次作业2
---恢复内容开始--- (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 源程序 对源程序进行编译 错误信息1: 错误原因:stdio.h输入错误 改正方法:i和d互换位置 错误信息2: ...
- 2018C语言第二次作业
一.学习内容总结 1.指针是一种数据类型,同样占有空间,其存储的是内存地址: 2.定义指针变量要在变量名之前加“*”字符表示: 3.“&”是取地址运算符,“*”是间接运算符: (注:声名和使用 ...
- 网络1712--c语言第二次作业总结
1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...
- C语言第二次作业
一.PTA实验作业 题目1:7-1 计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if (x>=0) { y=sqrt( ...
随机推荐
- C#方法有关内容的总结--C#基础
1.静态方法与实例方法 using System;using System.Collections.Generic;using System.Linq;using System.Text;using ...
- Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库
15.14 传递Unicode字符串给C函数库¶ 问题¶ 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode. 解决方案¶ 这里我们需要考 ...
- [BZOJ2820][Luogu2257]YY的GCD
BZOJ权限题 Luogu 题意:给出n,m,求: \[\sum_{i=1}^{n}\sum_{j=1}^{m}[\gcd(i,j)\mbox{为质数}]\] 多组数据,\(n\le 10^7\) s ...
- mysql执行计划简介
介绍 本篇主要通过汇总网上的大牛的知识,简单介绍一下如何使用mysql的执行计划,并根据执行计划判断如何优化和是否索引最优. 执行计划可显示估计查询语句执行计划,从中可以分析查询的执行情况是否最优,有 ...
- 关于Android 7.0无法进行https抓包的问题
在App进行数据请求的时候,如果每次都打印log去判断是一件很不"人性化"的操作行为,所以一般都会进行抓包分析. 以最常用的软件Fiddler来说,进行普通的http抓包没什么事, ...
- iptables 学习
本博客是学习慕课网课程 用iptables搭建一套强大的安全防护盾 整理而成 iptables相当于在ip层挂载一个hook point对用户进行控制 组成: 四张表+ 五条链(hook point) ...
- ssh框架中struts.xml 的配置参数详解
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...
- 30.Django CSRF 中间件
CSRF 1.概述 CSRF(Cross Site Request Forgery)跨站点伪造请求,举例来讲,某个恶意的网站上有一个指向你的网站的链接,如果某个用户已经登录到你的网站上了,那么当这个用 ...
- Java单例模式的5种实现方式
1.饿汉式.不支持并发: package com.ou; //饿汉式 public class Singleton1 { private Singleton1() { } private static ...
- kubernete的证书总结
服务端保留公钥和私钥,客户端使用root CA认证服务端的公钥. kubernetes的证书类型主要分为3类: serving CA: 用于签署serving证书,该证书用于加密https通信.用于签 ...