iOS开发之c语言基础Lesson-09 高级指针 上课笔记 与 试题练习

main.m 文件

 1 //

 2 // main.m  3 // Lesson09-PointerUpdate  4 //

 5 // Created by lanouhn on 15/3/27.  6 // Copyright (c) 2015年 Ashen. All rights reserved.  7 //  8 

 9 #import <Foundation/Foundation.h>

 10 #import "Student.h"

 11 

 12 

 13 void swap(int *p1, int *p2);  14 void swap(int *p1, int *p2){  15     int temp = *p1;  16     *p1 = *p2;  17     *p2 = temp;  18 }  19 

 20 //初始化数组

 21 void initArr(int *arr, int n);  22 void initArr(int *arr, int n){  23     for (int i  = 0; i < n ;i++) {  24         *(arr+i)= arc4random() % (40 - 20 + 1) + 20;  25  }  26 }  27 //输出数组

 28 void printArr(int *arr, int n);  29 void printArr(int *arr, int n){  30     for (int i = 0;i < n; i++) {  31         printf("%d ",*(arr + i));  32  }  33     printf("\n");  34 }  35 //数组降序排序

 36 void sortArrDesc(int *arr, int n);  37 void sortArrDesc(int *arr, int n){  38     for (int i = 0; i < n - 1; i++) {  39         for (int j = 0; j < n - 1 - i; j++) {  40             if (*(arr +j ) < *(arr + j + 1)) {  41                 //临时变量:  42                 //如果存储整形,用int 定义整形变量  43                 //如果存储地址, 用int * 定义指着变量

 44                 int temp = *(arr + j);  45                 *(arr + j) = *(arr + j + 1);  46                 *(arr + j + 1) = temp;  47  }  48  }  49  }  50 }  51 

 52 //第二大

 53 int getSecondMax(int *arr, int n);  54 int getSecondMax(int *arr, int n){  55     sortArrDesc(arr, n);//降序排序

 56     int secondMax = 0;  57     for (int i = 0; i < n; i++) {  58         if (*(arr + i) != *arr) {  //从第一个开始往后,找到与第一个不一样的 直接break,找到了secondMax

 59             secondMax = *(arr + i);  60             break;  61  }  62  }  63     return secondMax;  64 }  65 //求数组第三大值

 66 int getThirdMax(int *arr, int n);  67 int getThirdMax(int *arr, int n){  68     // int max = 0;  69     // int secondMax = 0;  70     // int thirdMax = 0;  71     //    // for (int i = 0; i < n; i++) {  72     //    // if (*(arr + i) > max) {  73     //    // thirdMax = secondMax;  74     //    // secondMax = max;  75     //    // max = *(arr + i);  76     //    // }else if(secondMax < *(arr + i) && *(arr + i) < max){  77     //    // secondMax = *(arr + i);  78     //    // }else if(thirdMax < *(arr + i) && *(arr + i) < secondMax){  79     //    // thirdMax = *(arr + i);  80     //    // }  81     //    // }  82     //  83     

 84     int thirdMax = 0;  85     sortArrDesc(arr, n);//降序排序

 86     for (int i = 0; i < n; i++) {  87         if (*(arr + i) < getSecondMax(arr, n)) {  88             thirdMax = *(arr + i);  89             break;  90  }  91  }  92     

 93     return thirdMax;  94 }  95 

 96 //第二小

 97 int getSecondMin(int *arr, int n);  98 int getSecondMin(int *arr, int n){  99     int secondMin = 0; 100     // for (int i = 1; i < n; i++) { 101     // if (*(arr + i) <min ) { 102     // secondMin = min; 103     // min = *(arr + i); 104     //

105     // }else if(secondMin > *(arr + i) && *(arr + i) > min){ 106     // secondMin = *(arr + i); 107     // } 108     // }

109     

110  sortArrDesc(arr, n); 111     for (int i = n - 1; i >=0; i--) { 112         if(*(arr + i) > *(arr + n - 1)){ 113             secondMin = *(arr + i); 114             break;//找到即终止

115  } 116  } 117     return secondMin; 118 } 119 int main(int argc, const char * argv[]) { 120     

121     ////////////////////Lessson09 高级指针 课堂笔记//////////

122     

123     //高级指针 124     //指针使用必须具备的两点内容、 125     //1.指针必须要有明确指向。 126     //2.指针必须指向一块可控空间 127     

128     // int a = 10; //只有当指针指向一个变量或者数组的首地址时,才可以修改空间上的内容。 129     // int *ptr = &a; 130     // *ptr = 5; 131     // printf("%d ", a); 132     

133     // int num1 = 5, num2 = 10; 134     // swap(&num1, &num2); //如果想在函数内部操作变量a和b,应该传递地址 135     //    //函数调用的传值方式: 136     //    //1.值传递:直接传递变量中得数据。适用于函数内部只使用外界的数据,不想更改外界的值的场景 137     //    //2.地址传递:直接传递变量地址。适用于函数内部操作想要更改外界的内容的场景 138     //

139     //

140     // printf("num1 = %d, num2 = %d", num1, num2);

141     

142     

143     /////////////////

144     //指针、数组和函数之间的关系 145     // int arr[10] = {0}; 146     // initArr(arr, 10); 147     // printArr(arr, 10); 148     // sortArrDesc(arr, 10); 149     // printArr(arr, 10); 150     // printf("SecondMax = %d \n", getSecondMax(arr, 10)); 151     // printf("ThirdMax = %d \n", getThirdMax(arr, 10)); 152     // printf("SecondMin = %d \n", getSecondMin(arr, 10));

153     

154     /////////////////

155     //    //指针 和 结构体关系 156     // typedef struct student{ 157     // char name[20]; 158     // int age; 159     // float score; 160     // }Stu; 161     //

162     //    // Stu student1 = {"Ashen", 24, 98.9}; 163     //    //    //1. 结构体变量,访问结构体成员,通过 变量.成员 164     //    // printf("%s\n", student1.name); 165     //    //

166     //    //    //结构体指针变量访问结构体成员 结构体指针变量->成员 (指向操作符) 167     //    // Stu *ptr = &student1; //结构体指针变量指向结构体变量的首地址。 168     //    // printf("%s\n", ptr->name); 169     //    //

170     //    // printf("%s\n",(*ptr).name); //*ptr == student1 171     //

172     //

173     //    //////////////////

174     //    //结构体数组和指针的关系 175     // Stu students[5] = { 176     // {"Tom", 32, 89}, 177     // {"Jack", 22, 76}, 178     // {"Rose", 20, 98}, 179     // {"Jobs", 18, 65}, 180     // {"Ashen", 24, 110} 181     // }; 182     // Stu *ptrs = students; 183     //    //

184     //    // printf("%s\n", (ptrs + 2)->name); 185     //    // printf("%s\n", (*(ptrs + 2)).name); 186     //    //

187     //    // printf("%.2f\n", (ptrs + 3)->score); 188     //    //

189     //    // (ptrs + 4)->score = 60; 190     //    // (*(ptrs + 4)).score = 60; 191     //    //

192     //    // printf("%.2f\n", (ptrs + 4)->score); 193     //    // strcpy(ptrs->name, "Cat"); 194     //    // printf("%s\n", ptrs->name); 195     //    // strcpy((*ptrs).name, "Tom is a Cat"); 196     //    // printf("%s\n", ptrs->name); 197     //

198     // for (int i = 0; i < 5 - 1; i++) { 199     // for ( int j = 0; j < 5 - 1 - i; j++) { 200     // if (strcmp((ptrs + j)->name, (ptrs + j + 1)->name) > 0) { 201     // Stu temp = *(ptrs + j); 202     // *(ptrs + j) = *(ptrs + j + 1); 203     // *(ptrs + j + 1) = temp; 204     // } 205     // } 206     // } 207     // for (int i = 0; i < 5; i++) { 208     // printf("Name = %s, Age = %d, Score = %.2f\n", (ptrs + i)->name, (ptrs + i)->age, (ptrs + i)->score); 209     // } 210     //

211     

212     //分别编写函数,实现所有学生按成绩升序, 按年龄降序, 按学号升序, 按姓名降序, 输出所有学生信息, 输入所有学生信息。

213     

214     Stu students[5] = {0}; 215     

216     initStudent(students, 5); 217     printStudents(students, 5); 218     

219     

220     sortScoreAsc(students, 5); 221     

222     sortAgeDesc(students, 5); 223     

224     sortNoAsc(students, 5); 225     

226     sortNameDesc(students, 5); 227     printStudents(students, 5); 228     

229     

230     

231     return 0; 232 }

Student.h文件

 1 //

 2 // Student.h  3 // Lesson09-PointerUpdate  4 //

 5 // Created by lanouhn on 15/3/27.  6 // Copyright (c) 2015年 Ashen. All rights reserved.  7 //  8 

 9 #import <Foundation/Foundation.h>

10 

11 typedef struct student{ 12     char name[20]; 13     int age; 14     int num; 15     float score; 16 }Stu; 17 

18 

19 //分别编写函数,实现所有学生按成绩升序, 按年龄降序, 按学号升序, 按姓名降序, 输出所有学生信息, 输入所有学生信息。 20 

21 //初始化学生

22 void initStudent(Stu *s, int n); 23 

24 //按学生成绩升序

25 void sortScoreAsc(Stu *s, int n); 26 

27 //按年龄降序

28 void sortAgeDesc(Stu *s, int n); 29 

30 //按学号升序

31 void sortNoAsc(Stu *s, int n); 32 

33 //按姓名降序

34 void sortNameDesc(Stu *s, int n); 35 

36 //输出学生

37 void printStudents(Stu *s, int n);

Student.m文件

 1 //

 2 // Student.m  3 // Lesson09-PointerUpdate  4 //

 5 // Created by lanouhn on 15/3/27.  6 // Copyright (c) 2015年 Ashen. All rights reserved.  7 //  8 

 9 #import "Student.h"

10 

11 //初始化学生

12 void initStudent(Stu *s, int n){ 13     

14     char names[10][20] ={"Jack", "Tom", "Rose", "Jobs", "Cook"}; 15     int num[] = {1, 3, 2, 5, 4}; 16     for (int i = 0; i < n;i++) { 17         strcpy((s + i)->name, names[i]); 18         (s + i)->age = arc4random() % (30 - 10 + 1) + 10; 19         (s + i)->num = num[i]; 20         (s + i)->score  = arc4random() % 101; 21  } 22     

23 // for (int i = 0; i< n; i++) { 24 // printf("添加 %d 位学生的信息(e.g. 001 Ashen 24 89):", i + 1); 25 // scanf("%d%s%d%f", &(s + i )->num, (s + i)->name, &(s + i)->age, &(s + i)->score); 26 // }

27     

28 } 29 

30 //按学生成绩升序

31 void sortScoreAsc(Stu *s, int n){ 32     for (int i = 0; i < n - 1; i++) { 33         for ( int j = 0; j < n - 1 - i; j++) { 34             if ((s + j)->score > (s + j + 1)->score) { 35                 Stu  temp = *(s + j); 36                 *(s + j) = *(s + j + 1); 37                 *(s + j + 1) = temp; 38  } 39  } 40  } 41 } 42 

43 //按年龄降序

44 void sortAgeDesc(Stu *s, int n){ 45     for (int i = 0; i < n - 1; i++) { 46         for ( int j = 0; j < n - 1 - i; j++) { 47             if ((s + j)->age < (s + j + 1)->age) { 48                 Stu  temp = *(s + j); 49                 *(s + j) = *(s + j + 1); 50                 *(s + j + 1) = temp; 51  } 52  } 53  } 54     

55 } 56 

57 //按学号升序

58 void sortNoAsc(Stu *s, int n){ 59     for (int i = 0; i < n - 1; i++) { 60         for ( int j = 0; j < n - 1 - i; j++) { 61             if ((s + j)->num > (s + j + 1)->num) { 62                 Stu  temp = *(s + j); 63                 *(s + j) = *(s + j + 1); 64                 *(s + j + 1) = temp; 65  } 66  } 67  } 68     

69 } 70 

71 //按姓名降序

72 void sortNameDesc(Stu *s, int n){ 73     for (int i = 0; i < n - 1; i++) { 74         for ( int j = 0; j < n - 1 - i; j++) { 75             if (strcmp((s + j)->name, (s + j + 1)->name) < 0) { 76                 Stu  temp = *(s + j); 77                 *(s + j) = *(s + j + 1); 78                 *(s + j + 1) = temp; 79  } 80  } 81  } 82     

83 } 84 

85 //输出学生

86 void printStudents(Stu *s, int n){ 87     for (int i = 0; i < n; i++) { 88         printf("Num = %d, Name = %s, Age = %d, Score = %.2f\n",(s + i)->num, (s + i)->name, (s + i)->age, (s + i)->score); 89  } 90     printf("\n"); 91 }

 

你可能感兴趣的:(ios开发)