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 }