C语言博客作业--结构体
一、PTA实验作业
题目1:6-2 按等级统计学生成绩
1. 本题PTA提交列表
2. 设计思路
struct student{
int num;
char name[20];
int score;
char grade;
};//该结构体表示学生的学号num、姓名name和成绩score
定义变量i表示循环变量
定义变量count=0计数不及格人数
for i=0 to n-1
p[i].score分数执行判断,如果<60,count++;设置相应的等级
end for
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 不会如何运用结构体表示等级,重新修改,尝试直接返回等级,错误,再次修改,部分正确;
- 部分正确,答案与样例不符,不及格人数没有正确返回;
- 调试发现,每次的运行会一步步执行下去,直到最后所有的输出字符65 ‘A’,没有进入相应的判断条件里面去执行;
- 一直 都是p->,p->指的就是结构体数组的第一个元素,所以出现了问题,要把p->score改成p[i].score,使在p所指向的内容随着i而改变;
题目2:7-2 时间换算
1. 本题PTA提交列表
2. 设计思路
struct time{
int hh;
int mm;
int ss;
};//该时间结构体表示小时、分钟、秒
定义结构体变量t,要加秒数n,初始化总秒数sum=0
输入
加上n后换算成秒运算
/*24小时=86400秒,一小时=3600秒*/
执行:分别求出小时、分钟、秒
end for
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 一开始思路不是很清晰,不知怎么把各个加上后进到相应的位,请教同学,然后练习自己写,需要考虑多种情况;
- 部分正确,其中【最后1秒到0点 答案错误,秒进位,最小起始、最大n 答案错误,全为零 答案错误】,漏掉了几种特殊情况,调试修改,没有考虑到加上后过到第二天的情况;
- 调试发现,输出格式错误导致答案错误,应该要输出%02d,输出两位十进制整数,左边补零;
题目3:7-5 有理数比较
1. 本题PTA提交列表
2. 设计思路
struct num{
int fen;//分子
int mu;//分母
};//该结构变量记录分子、分母
定义结构变量t1,t2,初始化sum=0,字符变量ch
输入
执行运算:sum=t1.fen*t2.mu-t1.mu*t2.fen;
判断相应符号
end for;
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明
- 答案错误,结果运算时,分子分母的数都发生了改变,发现输出里面加上了&,去掉;
- 答案错误,输出出错,输入任何数均为等,把做运算相减的地方进行修改,改变代码结构,简单清楚;
二、截图本周题目集的PTA最后排名
三、阅读代码
优秀指针代码1:
/*函数fun的功能是:将s所指字符串中出现的t1所指字符串全部替换成t2所指字符串,所形成的新的字符串放在w所指的数组中;*/
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
void fun(char *s,char *t1,char *t2, char *w)
{
char *p,*r,*a;
strcpy(w,s);
while (*w)
{p=w; r=t1;
while (*r)
if (*r==*p){r++;p++;}
else break;
if (*r=='\0')
{a=w; r=t2;
while (*r){*a=*r;a++;r++;}
w+=strlen(t2);
}
else w++;
}
}
int main()
{char s[100],t1[100],t2[100],w[100];
system("CLS");
printf("\nPlease enter string S: ");
scanf("%s",s);
printf("\nPlease enter substring t1: ");
scanf("%s",t1);
printf("\nPlease enter substring t2: ");
scanf("%s",t2);
if (strlen(t1)==strlen(t2))
{
fun (s,t1,t2,w);
printf("\nThe result is : %s\n",w);
}
else printf("Error : strlen(t2)\n");
}
小评:在 int fun(char *s,char *t1,char *t2, char *w)中,用int型定义指针数组,动态分配系统返回void指针,void指针具有一般性,可以指向任何类型的数据,并用强制类型转换的方法把char指针转换成了所需的类型,这是道改错题,在查找时可以学会一些它的分析方法;然后,此题同时还用运用到字符串的内容以及对于库函数等的运用,可以利于巩固一些基础的C语言知识;
优秀结构体代码2:
/*查找书籍
输入格式:输入第一行给出正整数n(<<<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。
输出格式:在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书,价格保留2位小数;
输入样例:
3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0
输出样例:
25.00, Programming in Delphi
18.50, Programming in VB*/
#include<stdio.h>
struct book
{
char a[32];
double b;
};
int main()
{
int i, j, n;
char k;
struct book s[11], temp;
scanf("%d", &n);
for (i = 0;i < n;i++)
{
scanf("%c", &k);
gets(s[i].a);
scanf("%lf", &s[i].b);
}
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (s[j].b > s[i].b)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
printf("%0.2f, %s\n", s[0].b, s[0].a);
printf("%0.2f, %s\n", s[n - 1].b, s[n - 1].a);
return 0;
}
小评:代码中运用到了结构体,涉及到有最大最小的选择排序法以及字符串,读起来通俗易懂,没有太过麻烦的东西加进去,主要有利于对结构体的更好掌握,题目难度比较适中;
四、本周学习总结
1.总结本周学习内容
结构体、共用体、枚举这种构造数据类型特点;
- 结构体和数组一样都是构造型数据类型,和数组不一样的是,结构体可以处理不一样类型的数据;如下定义1个学生信息的结构体,这个结构体有三种类型的数据,可以看出结构体里还可以有结构体类型、共用体的类型的数据;
struct student{
int number;
char sex[3];
char name[10];
srtuct birthday birth;
char dep[20];
};
- 共用体是一种多变量共享存储空间的构造类型,它允许几种不一样的变量共用同一存储空间;
- 共用体和结构体的区别:
(1.)结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不一样类型的数据);
(2.)结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间。
(3.)共用体不能赋初值。 - 枚举类型是指变量的值可以全部列出,定义1个枚举变量后,变量的值确定在定义之中;
- 它和结构体、共用体的区别在于,枚举元素是常量,只可以在定义阶段赋值;
递归函数原理
- 递归就是某个函数直接或间接地调用了自身,所谓递归函数,重点是如何处理函数调用自身是如何保证所需要的结果得以在函数间合理"传递";
- 以阶乘为例说明递归的工作原理:
long ff(int n) { long f; if(n<0)
rintf("n<0,input error"); else if(n==0||n==1)
f=1; //为什么f=1,就不再继续递归调用?
else
f=ff(n-1)*n;//这一步到底是怎么工作的?
return(f);
}
例如:求3!=?
一层执行到f=ff(3-1)*3;停止,执行二层ff(3-1),也就是ff(2);
二层执行到f=ff(2-1)*2;停止,执行三层ff(2-1),也就是f(1);
三层执行到else if(n==0||n==1) f=1;然后return(f)到二层的ff(2-1)的位置,二层继续执行;
二层执行f=1*2; 然后就return(f)到一层ff(3-1)的位置,一层继续执行;
一层执行f=2*3; 然后就return(f)到了最初调用ff(3)的main函数里,所以就得到y=6;
这里每次一层都相当于一个不同的函数,你可以给他们起名为ff1,ff2,ff3.....;注意一点,调用一次,不是在代码本身上执行,而是会复制出一份在执行;
2.罗列本周一些错题
课堂派错题1
线性表用顺序实现。请填空写一个求线性表L 中所有奇数之和的算法;
例如:L=(1,2,3,4,5) 其和为 9
#include <stdio.h>
#define N 10
typedef struct sqlist
{
int data[N];
int last;
}LIST;
int Total(List list)
{
return sum;
}
void Show(LIST list)
{
int i;
for(i=0;i<=list.last;i++)
printf("%3d", list.data[i]);
printf("\n");
}
int main()
{
LIST list;
int i,sum;
for(i=0;i<=5;i++)
list.data[i]=i;
list.last=5;
Show(list);
sum=Total(list);
printf("sum=%3d\n",sum);
return 0;
}
参考答案
int sum=0;
for(int i=0;i<=list.last;i++)
if(list.data[i]%2)
sum+=list.data[i];
我的作答//对题目没有理解好
int i,j,n,sum=0;
int b[80];
for(i=0;i<=list.data[i];i++)
if(!(j%2==0)){
b[j]=list.data[i];
j++;
}
b[j]='\0';
n=strlen(b);
for(j=0;j<n;j++){
sum=sum+b[j];
}
课堂派错题2
阅读程序,选择程序的运行结果
#include "stdio.h"
int try(int);
int main() {
int x;
x=try(5);
printf(“%d\n”, x);
}
int try(int n){
if(n>0)
return(n*try(n-2));
else
return(1);
}//当时对递归还不清楚