while(std++) 若是 std->num==num 返回 *std
由于大意,在if语句后多了分号sql
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
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 按 输出两位十进制整数,不足往左边补零的格式 输出
#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; }
相对于上个博客,军霖同窗的办法,使用函数使整个程序看起来更加清晰简洁编程
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); } }
在函数里又再一次调用了函数,每一次调用都会生成新的主串,即又去掉一个子串的主串,直到主串中没有子串
即数组
if( ( p=strstr(s,sub) )!=NULL )中p=strstr(s,sub) )==NULL
进入不了循环数据结构
while( (*p++=*mark++) ); 即 *p=*mark p++; mark++; 直到mark为'\0'
跳过一个子串将主串的其余部分给p函数
此时原来的主串在第一个子串后的字符发生了改变学习
返回子串第一次出现的地址设计
#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; }
struct book{ int book_number; };
中用下划线表示number与book的关系,但注意变量名的长度3d
不能够直接赋值,错误赋值代码:指针
*(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] 而后一一赋值
注意:调试
sizeof(int*);
#include<stdlib.h>
double atof(char *s)
int atoi(char *s)
long atol(char*s)
srand(unsigned int seed)
#define MAXN 20
typedef struct sqlist { int data[N]; int last; }LIST; 及后来结构体类型变量的定义 int main() { LIST list; }
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.优势
共用体经常使用来节省内存,特别是一些嵌入式编程,内存是很是宝贵的!
在实际应用中,有的变量只有几种可能取值。
如:
人的性别只有两种可能取值,
星期只有七种可能取值。
在 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;
4,输入要有&号
5.改错
(1)结构体的定义
(2)字符数据的读取
(3),(4)字符的读取及输入格式
(5)注意输出格式%7.2f;
scanf("%s %s %c %s %s\n",infor[i].name,infor[i].birth,&infor[i].sex,infor[i].fnum,infor[i].tnum);
struct book{ char name[11]; char birth[11]; char sex; char fnum[17]; char tnum[17];//加号1数字15结束符1, 17 };