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 }

 

posted @ 2015-03-30 12:58  我死在了编程的路上  阅读(192)  评论(0编辑  收藏  举报