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 }