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 };