c语言学习2
函數(shù)
// 函數(shù)使用 // 輸入:最大最小值 // 輸出:范圍內所有整數(shù)之和 #include <stdio.h> int main() {int add(int,int);// 函數(shù)聲明// 自定義函數(shù)如果在main后, 在調用前要聲明(只注類型即可),否則會提示找不到該函數(shù)// 如果在main前,可不必聲明int a,b;printf("請輸入要求和的區(qū)域:\n");scanf("%d%d",&a,&b); //分別把變量賦值給了a,b printf("輸出求和后的結果:%d\n",add(a,b)); // 調用函數(shù) return 0; }int add(int a,int b) {int x = a, y = b,sum = 0;for(;x<=y;x++) {sum +=x;}return sum; } // 函數(shù)的遞歸:調用自身 // 輸入一個數(shù) ,求出對應的階乘,求出結果后打印輸出 #include <stdio.h> #include <stdlib.h> int main() {int div(int); // 函數(shù)聲明 int n;long num;printf("請輸入一個整數(shù):\n");scanf("%d",&n);num = div(n);printf("輸出%d的階乘為:%ld\n",n,num); }int div(int n) //定義函數(shù) {// 這里用到exit(0),所以需要導入 <stdlib.h>庫文件if(n<0){printf("輸入數(shù)據有誤\n");exit(0);} if(n==0||n==1) //0和1的階乘是1 return 1;// 遞歸調用函數(shù)自身else return n*div(n-1);}結構體
// 結構體 #include <stdio.h>struct date // data是結構體名 {int year,month,day; // 結構體成員 };struct person {char name[15];// 在本結構體中引用另外一個結構體struct date born; }p1 = {"Jay",{1888,10,10}};int main() {struct person p2;printf("請輸入p2的信息,依次為姓名,出生年月日:\n");scanf("%s%d%d%d",&p2.name,&p2.born.year,&p2.born.month,&p2.born.day);// 輸出結構體的p1,p2的信息printf("%s出生于%d年%d月%d日\n",p1.name ,p1.born.year,p1.born.month,p1.born.day);printf("%s出生于%d年%d月%d日\n",p2.name ,p2.born.year,p2.born.month,p2.born.day); return 0; } #include <stdio.h> int main(){// 如果只需要 stu1 變量,后面不需要再使用結構體名定義其他變量,// 那么在定義時也可以不給出結構體名 /*struct{ // 在{前沒有寫結構體名 stu char *name; //姓名int num; //學號int age; //年齡char group; //所在小組float score; //成績} stu1;//給結構體成員賦值stu1.name = "Tom";stu1.num = 12;stu1.age = 18;stu1.group = 'A';stu1.score = 136.5;//讀取結構體成員的值printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);*/ // 定義結構體時同時賦值 struct{char *name; //姓名int num; //學號int age; //年齡char group; //所在小組float score; //成績 } stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };//這里只對stu2賦值 printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);return 0; } // 結構體數(shù)組 #include <stdio.h> struct{char *name; //姓名int num; //學號int age; //年齡char group; //所在小組float score; //成績 }class[] = {{"Li ping", 5, 18, 'C', 145.0},{"Zhang ping", 4, 19, 'A', 130.5},{"He fang", 1, 18, 'A', 148.5},{"Cheng ling", 2, 17, 'F', 139.0},{"Wang ming", 3, 17, 'B', 144.5} }; int main(){int i, num_140 = 0;float sum = 0;for(i=0; i<5; i++){sum += class[i].score;if(class[i].score < 140) num_140++;}printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);return 0; } // 求結構體大小// 1. 結構體變量中當前成員的偏移量必須是【當前成員大小】的整數(shù)倍(0被認為是任何數(shù)的整數(shù)倍) // 2.結構體大小必須是【所有成員】大小的整數(shù)倍,也即所有成員大小的公倍數(shù)。 // 第n個成員的偏移量=第n-1個成員的偏移量+第n-1個成員的大小(字節(jié)) // 結構體大小=最后一個成員的偏移量+最后一個成員的大小 // 對于嵌套的結構體,需要將其展開。對結構體求sizeof時,上述兩種原則變?yōu)?#xff1a;// 1. 展開后的結構體的第一個成員的偏移量應當是被展開的結構體中最大的成員的整數(shù)倍。// 2. 結構體大小必須是所有成員大小的整數(shù)倍,這里所有成員計算的是展開后的成員,而不是將嵌套的結構體當做一個整體。 #include <stdio.h> struct stu{char c1; char c2; int i; }; // 嵌套結構體 struct stu5 { short i; struct { char c; // ss.c的偏移量=4,不是2int j; } ss; int k; } ; int main() { printf("%d\n",sizeof(struct stu));// c1的偏移量是0// c2的偏移量=c1的偏移量+c1的大小=0+1=1,1是c2本身char的整數(shù)倍,無須補字符// i的偏移量=c2的偏移量+c2大小=1+1=2,2不是i本身int的整數(shù)倍 ,補2個字符,偏移量為4// 因此結構體大小=4+4=8 printf("%d",sizeof(struct stu5));//16return 0; }結構體指針的使用
// 結構體指針的使用 // 結構體指針就是指向結構體變量的指針 #include <stdio.h> int main(){struct{char *name; //姓名int num; //學號int age; //年齡char group; //所在小組float score; //成績} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;// *pstu = &stu1相當于把stu1的地址幅值給pstu,指針指向地址,所以&//讀取結構體成員的值printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);printf("%s的學號是%d,年齡是%d,在%c組,今年的成績是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);return 0; }結構體數(shù)組指針的使用
// 結構體數(shù)組指針的使用 #include <stdio.h> struct stu{char *name; //姓名 8個字節(jié) int num; //學號 4個字節(jié) int age; //年齡char group; //所在小組 1個字節(jié)float score; //成績 4個字節(jié) }stus[] = {{"Zhou ping", 5, 18, 'C', 145.0},{"Zhang ping", 5, 18, 'C', 145.0},}, *ps; // struct定義了兩個數(shù)據類型,一個是結構體數(shù)組stus,一個是指針*ps int main(){//求數(shù)組長度int len = sizeof(stus) / sizeof(struct stu);printf("%d\n",sizeof(stus));//48,這里有2個這樣stu的類型,2*24=48 printf("%d\n",sizeof(struct stu)) ;//24printf("%d\n",len) ;//2printf("Name\t\tNum\tAge\tGroup\tScore\t\n");// 用指針變量輸出結構數(shù)組// 定義ps為指向stu類型的指針// 指針變量ps指向一個結構數(shù)組stus,這時結構指針變量ps的值是整個結構數(shù)組的首地址// 數(shù)組名字stus便是數(shù)組的首地址for(ps=stus; ps<stus+len; ps++){printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);} return 0; }結構體指針作為函數(shù)參數(shù)
// 結構體指針作為函數(shù)參數(shù) // 計算全班學生的總成績、平均成績和以及 140 分以下的人數(shù) #include <stdio.h> struct stu{char *name; //姓名int num; //學號int age; //年齡char group; //所在小組float score; //成績 }stus[] = {{"Li ping", 5, 18, 'C', 145.0},{"Zhang ping", 4, 19, 'A', 130.5},};int main(){int len = sizeof(stus) / sizeof(struct stu);average(stus, len);return 0; } void average(struct stu *ps, int len){ //指針作為函數(shù)的參數(shù)int i, num_140 = 0;float average, sum = 0;for(i=0; i<len; i++){sum += (ps + i) -> score;if((ps + i)->score < 140) num_140++;}printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/len, num_140); }共用體
#include <stdio.h> union type { int cid; //班級 char title[20]; //職稱 }; struct Person { char name[10]; //姓名 char sex; //性別 int age; //年齡 int flag; //標志是老師還是學生 union type tp; }; int main() { struct Person person[10]; int i; int num; char ch; printf("請輸入要錄入的人數(shù):\n"); scanf("%d",&num); for(i = 0;i<num;i++) { printf("請輸入第%d個人員的信息:\n",i + 1); printf("姓名: ");scanf("%s",&person[i].name);getchar(); printf("性別: ");scanf("%c",&person[i].sex);getchar(); printf("年齡: ");scanf("%d",&person[i].age); printf("職業(yè)標識符: ");scanf("%d",&person[i].flag); if(person[i].flag == 0) { printf("請輸入學生的班級id: "); scanf("%d",&person[i].tp.cid); } else if(person[i].flag == 1) { printf("請輸入老師的職稱: "); scanf("%s",&person[i].tp.title); } else { printf("輸入有誤,請重新輸入!\n"); i -= 1; } } printf("\n輸出所有錄入人員的信息:\n"); for(i = 0;i<num;i++) { printf("輸出第%d個人員的信息:\n",i + 1); printf("姓名: ");puts(person[i].name); printf("性別: ");printf("%c",person[i].sex); printf("\t年齡: ");printf("%d",person[i].age); if(person[i].flag == 0) { printf("\t學生的班級id: "); printf("%d\n",person[i].tp.cid); } else if(person[i].flag == 1) { printf("\t老師的職稱: "); puts(person[i].tp.title); } } return 0; }枚舉
// 枚舉 //Mon、Tues、Wed 這些名字都被替換成了對應的數(shù)字。這意味著, //Mon、Tues、Wed 等都不是變量,它們不占用數(shù)據區(qū)(常量區(qū)、全局數(shù)據區(qū)、棧區(qū)和堆區(qū))的內存, //而是直接被編譯到命令里面,放到代碼區(qū),所以不能用&取得它們的地址。這就是枚舉的本質。 #include <stdio.h> int main(){enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } day;//枚舉值從 1 開始遞增 scanf("%d", &day);switch(day){case Mon: puts("Monday"); break;case Tues: puts("Tuesday"); break;case Wed: puts("Wednesday"); break;case Thurs: puts("Thursday"); break;case Fri: puts("Friday"); break;case Sat: puts("Saturday"); break;case Sun: puts("Sunday"); break;default: puts("Error!");}return 0; }類型定義符
// 類型定義符 #include <stdio.h> struct Point {double x;double y;double z; }; struct Point oPoint1={100,100,0};// 等價于以下 typedef struct tagPoint {double x;double y;double z; } Point; Point oPoint1={100,100,0};總結
- 上一篇: android init(system/
- 下一篇: c 语言学习:基本操作,数组,字符串,指