一、PTA实验作业
题目1:6-3查找指定人员
1. 本题PTA提交列表
2. 设计思路(伪代码或流程图)
while(std++)
如果 std->num==num
返回 *std
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
(1)只会输出第一个人的信息
因为大意,在if语句后多了分号
题目2:7-1计算职工工资
1. 本题PTA提交列表
2. 设计思路(伪代码或流程图)
struct worker //结构体
{
char name[10];//姓名
float basic;//基本工资
float floating;//浮动工资
float expend;//支出
float sum;//求和
};该结构体表示职员的姓名,职员的基本工资,职员的浮动工资,职员的支出,职员的最后工资
定义整型变量N表示职员数量,定义循环变量i
输入 N
定义结构体类型work[N]储存职员信息
for i=0 to i=N
输入 name,basic,floating,expend
sum 等于 basic 加 floating 减 支出
end
for i=0 to i=N
输出 name ,sum;
end
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
错误一:work[i]不是指针,我用work[i]->name的方式表示;
题目2:7-2 时间换算
1. 本题PTA提交列表
2. 设计思路
struct time{
int hour;
int minute;
int second;
};该结构体表示时间中的小时,分钟,秒
定义结构类型 time1
整型 second2表示增加的秒数
输入时间
输入增加的秒数
将增加的秒数加到原来的秒time1->second上
如果 second 大于等于 60
second 减 60
minute 加 1
end
如果 minute 大于等于 60
minute 减 60
hour 加 1
end
如果 hour 大于等于 24
hour 减 24
end
按 输出两位十进制整数,不足往左边补零的格式 输出
3.代码截图
4.本题调试过程碰到问题及PTA提交列表情况说明。
错误一:运用指针的方法使用结构体导致程序崩溃
错误二:没有定义结构体变量,直接用结构体类型进行
错误三:关于输出格式,%02d,输出两位十进制整数,左边补零
二、截图本周题目集的PTA最后排名。
三、阅读代码
军霖同学关于删除子串的代码
#include<stdio.h>
#include<string.h>
void del(char s[],char sub[]){
char *p;
if( ( p=strstr(s,sub) )!=NULL ){
char *mark=p+strlen(sub);
while( (*p++=*mark++) );
del(s,sub);
}
}
int main(){
char s[81],sub[81];
gets(s);
gets(sub);
del(s,sub);
puts(s);
return 0;
}
(1)他的功能:输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
(2)他的优势:
1.使用函数del达到删除子串的功能
相对于上个博客,军霖同学的办法,使用函数使整个程序看起来更加清晰简洁
void del(char s[],char sub[]){
char *p;
if( ( p=strstr(s,sub) )!=NULL ){//p是子串出现的地址
char *mark=p+strlen(sub);//子串结束的地址
while( (*p++=*mark++) );//跳过一个子串将主串的其他部分给p
del(s,sub);
}
}
2.函数的嵌套使用
在函数里又再一次调用了函数,每一次调用都会生成新的主串,即又去掉一个子串的主串,直到主串中没有子串
即
if( ( p=strstr(s,sub) )!=NULL )中p=strstr(s,sub) )==NULL
进入不了循环
3.新主串的储存
while( (*p++=*mark++) );
即
*p=*mark
p++;
mark++;
直到mark为'\0'
跳过一个子串将主串的其他部分给p
此时原来的主串在第一个子串后的字符发生了改变
4.关于strstr函数
返回子串第一次出现的地址
(2)因为在做阶级赛的时候做不出,所以和军霖同学拿了这道tokenizor
#include<stdio.h>
#include<string.h>
int main(){
char s[44];
gets(s);
for(int i=0;s[i];i++){
if(s[i]=='-'||s[i]=='+') {
if(!i) printf("%c",s[0]);
else {
if(s[i-1]>='0'&&s[i-1]<='9') printf("\n%c\n",s[i]);
else if(s[i-1]=='(') printf("%c",s[i]);
else printf("%c\n",s[i]);
}
}
else if(s[i]>='0'&&s[i]<='9'||s[i]=='.') printf("%c",s[i]);
else{
if(s[i-1]>='0'&&s[i-1]<='9') printf("\n%c\n",s[i]);
else printf("%c\n",s[i]);
}
}
return 0;
}
(1)他的功能:tokenizor
(2)他的优势:吴同学通过对字符的判断对输出格式中回车键的有无及位置的进行改变达到题目的要求,减少了判断量。
四、本周学习总结
12.18,周一
一,课堂派
(1)预习作业--结构体
- 1,关于取名
可以通过下划线来表示相关变量
例如
struct book{
int book_number;
};
中用下划线表示number与book的关系,但注意变量名的长度
- 2.关于结构体赋值
不可以直接赋值,错误赋值代码:
*(p+2)={102030,“数据结构”,40}
- 正确赋值方法一:
(*(p+2))=(struct book){102030,“数据结构”,40};
- 正确的赋值方法二:(一个个赋值)
p=p+2;
p->book_number=102030;
strcpy(p->book_name,"数据类型");
- 正确的赋值方法三:
p=&book_num[2]
然后一一赋值
注意:
二。课堂笔记
1.总结本周学习内容。
(1)验证各类指针分配空间大小的方式
sizeof(int*);
(2)常见的数值转换函数
#include<stdlib.h>
- 1.字符串s转换为双精度浮点型
double atof(char *s)
- 2.字符串s转换为整型数
int atoi(char *s)
- 3.字符串s转换为长整型数
long atol(char*s)
- 4.以seed为种子(初始值)计算产生一个无符号的随机整数
srand(unsigned int seed)
(3)给固定数或者结构变量取名
- 1.给固定数名称
#define MAXN 20
- 2.给结构体名称
typedef struct sqlist
{
int data[N];
int last;
}LIST;
及后来结构体类型变量的定义
int main()
{
LIST list;
}
(4)共用体
- 声明共用体及定义共用体变量的一般形式
union data{
int i;
char ch;
double d;
};
data a,b,c;
- 与结构体的区别:
1.共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量。
2.结构体变量所占长度是各成员占的内存长度之和。每个成员分别占有自己的内存单元。共用体变量所占的内存长度等于最长的成员的长度。
3.共用体变量中的值是最后一次存放的成员的值
如:
a.i = 1;
a.ch = 'a';
a.f = 1.5;
完成以上三个赋值语句后共用体边量的值是 1.5而 a.i=1 和 a.ch='a'已无意义
4.共用体变量不能初始化例
union data
{
int i;
char ch;
float f;
}a={1,'a', 1.5} 错误!!!
5.优点
共用体常用来节省内存,特别是一些嵌入式编程,内存是非常宝贵的!
(5)枚举类型
- 背景:
在实际应用中,有的变量只有几种可能取值。
如:
人的性别只有两种可能取值,
星期只有七种可能取值。
在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型。
-
定义:
所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。
-
定义的形式:
1.定义一个变量是枚举类型,可以先定义一个枚举类型名,然后再说明这个变量是该枚举类型。
如:
enum weekday{sun,mon,tue,wed,thu,fri,sat};
定义了一个枚举类型名 enum weekday,然后定义变量为该枚举类型。
如:
enum weekday day;
2.直接定义枚举类型变量
enum weekday{sun,mon,tue,wed,thu,fri,sat} day;
其中,sum,mon,…,sat 等称为枚举元素或枚举常量,它们是用户定义的标识符
- 枚举元素
① 枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值。
② 枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为,1,2,…。
在上面的说明中,sun 的值为 0,mon 的值为 1,…sat 的值为 6,如果有赋值语句
day=mon;
则 day 变量的值为 1。当然,这个变量值是可以输出的。
例如:
printf ("%d",day);
将输出整数 1。
如果在定义枚举类型时指定元素的值,也可以改变枚举元素的值。
例如:
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;
这时,sun 为 7,mon 为 1,以后元素顺次加 1,所以 sat 就是 6 了。
③ 枚举值可以用来作判断。
例如:
if (day==mon) {…}
if (day>mon) {…}
枚举值的比较规则是:按其在说明时的顺序号比较,如果说明时没有人为指定,则第一个枚举元素的值认作 0。
例如:
mon>sun,sat>fri。
④ 一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值。
例如:
day=(enum weekday)2;
这个赋值的意思是,将顺序号为 2 的枚举元素赋给 day,相当于workday=tue;
2.罗列本周一些错题。
(1)C语言复习作业--结构体
-
4,输入要有&号
-
5.改错
(1)结构体的定义
(2)字符数据的读取
(3),(4)字符的读取及输入格式
(5)注意输出格式%7.2f;
- 7,读结构体
(2)PTA
结构体,7-6 通讯录的录入与显示
- 错误一:输入数组的时候是不用&,直接使用数组名的
- 错误二:忽略了输入的空格
scanf("%s %s %c %s %s\n",infor[i].name,infor[i].birth,&infor[i].sex,infor[i].fnum,infor[i].tnum);
- 错误三:没有扩大数组:题目说不超过15个数字,就只定义15个空间,导致K输入不了
struct book{
char name[11];
char birth[11];
char sex;
char fnum[17];
char tnum[17];//加号1数字15结束符1, 17
};
- 错误四:关于num与K1的关系,编号是从0开始的,所以如果K1等于num也是找不到的