10.1 结构
两个同类型的结构变量,可以互相赋值,但不能进行比较运算。结构的成员变量可以是任何类型的。
10.2 全局变量,局部变量,静态变量
定义在函数的内部的变量为局部变量(函数的形参也是局部变量),只能在定义它的函数内部使用;定义在所有函数的外面的变量为全局变量,在所有函数中都可以使用。
全局变量都是静态变量,局部变量定义时如果添加了static关键字则也为静态变量。静态变量的存放地址在整个程序运行期间都固定不变。
非静态变量一定是局部变量,其地址每次函数调用时都可能不同,在函数的一次执行期间不变。
如果未初始化,则静态变量会被自动初始化为全0(每个bit都是0),局部非静态变量的值随机。
10.3 变量的作用域和生存期
变量名,函数名和类型名统称为标识符,其能够起作用的的范围称之为作用域。单文件程序中,结构、函数和全局变量的作用域是其定义所在的整个文件。
函数形参的作用域是整个函数。局部变量的作用域,是从定义它的语句开始,到包含它的最内层的那一对大括号的右大括号为止。for循环的控制变量作用域是整个for循环。
同名标识符的作用域,可能存在一个被另一个包含,则在小的作用域里,作用域大的那个标识符被屏蔽不起作用。
变量的生存期是指在此期间变量占有内存空间,只能归其使用,而生存期终止后,不再占有该内存空间,该空间随时可能派做他用。
全局变量的生存期,从程序被装入内存开始到整个程序结束。静态局部变量的生存期,从定义它语句第一次被执行开始,到整个程序结束为止。
函数形参的生存期从函数执行开始,到函数返回时结束。非静态局部变量的生存期,一旦程序执行到了作用域之外即告终止。
10.4 简单排序
1 void SelectionSort(int a[], int size) 2 { 3 for(int i=0; i
1 void InsertionSort(int a[], int size) 2 { 3 for(int i=1; ia[i]) { 6 int tmp = a[i]; 7 for(int k=i; k>j; k--) 8 a[k] = a[k-1]; 9 a[j] = tmp;10 break;11 }12 }13 }14 }
1 void BubbleSort(int a[], int size) 2 { 3 for(int i=size-1; i>0; i--) { 4 for(int j=0; j a[j+1]) { 6 int tmp = a[j]; 7 a[j] = a[j+1]; 8 a[j+1] = tmp; 9 }10 }11 }12 }
作业
1.成绩排序
Description:给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。
Input:
第一行为n (0 < n < 20),表示班里的学生数目;
接下来的n行,每行为每个学生的名字和他的成绩, 中间用单个空格隔开。名字只包含字母且长度不超过20,成绩为一个不大于100的非负整数。
Output:把成绩单按分数从高到低的顺序进行排序并输出,每行包含名字和分数两项,之间有一个空格。
Sample Input:
4
Kitty 80
Hanmeimei 90
Joey 92
Tim 28
Sample Output:
Joey 92
Hanmeimei 90
Kitty 80
Tim 28
1 #include2 #include 3 4 using namespace std; 5 6 struct Student{ 7 char name[30]; 8 int score; 9 } students[30];10 11 int main()12 {13 int n;14 cin >> n;15 for(int i=0; i > students[i].name >> students[i].score;17 for(int i=n-1; i>=0; --i)18 for(int j = 0; j < i; ++ j)19 if(students[j].score 0) {20 Student tmp;21 tmp = students[j];22 students[j] = students[j+1];23 students[j+1] = tmp;24 }25 26 for(int i=0; i
2.分数线划定
Description:
世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
Input:
第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的志愿者人数。输入数据保证m*150%向下取整后小于等于n。第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。
Output:
第一行,有两个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。从第二行开始,每行包含两个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
Sample Input:
6 3
1000 903239 882390 957231 841005 951001 88Sample Output:
88 5
1005 952390 951000 901001 883239 881 #include2 #include 3 4 using namespace std; 5 6 struct Student{ 7 int id; 8 int score; 9 } students[5010];10 11 int main()12 {13 int n, m;14 cin >> n >> m;15 for(int i=0; i > students[i].id >> students[i].score;17 18 for(int i=n-1; i>=0; --i)19 for(int j=0; j students[j+1].id) {21 Student tmp;22 tmp = students[j];23 students[j] = students[j+1];24 students[j+1] = tmp;25 }26 int k = m*1.5;27 int lineScore = students[k-1].score;28 29 while(students[k].score == lineScore)30 ++k;31 cout << lineScore << " " << k << endl;32 for(int i=0; i
3.病人排队
Description:
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1. 老年人(年龄 >= 60岁)比非老年人优先看病。
2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3. 非老年人按登记的先后顺序看病。
Input:
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
Output:按排好的看病顺序输出病人的ID,每行一个。
Sample Input:
5
021075 40004003 15010158 67021033 75102012 30Sample Output:
021033
0101580210750040031020121 #include2 #include 3 4 using namespace std; 5 6 struct Patient{ 7 char id[20]; 8 int age; 9 int No;10 } patients[110];11 12 bool priority( Patient p1, Patient p2)13 { 14 if(p1.age>=60 && p2.age<60)15 return true;16 if(p1.age<60 && p2.age>=60)17 return false;18 if(p1.age<60 &&p2.age<60)19 return p1.No < p2.No;20 if(p1.age>=60 && p2.age>=60)21 return p1.age > p2.age;22 }23 24 int main()25 {26 int n;27 cin >> n;28 for(int i=0; i > patients[i].id >> patients[i].age;30 patients[i].No = i;31 }32 for(int i=n-1; i>=0; --i)33 for(int j=0; j
4.mysort
Description:程序填空题,自己编写排序函数 mysort,使得其能够对任意类型的数组排序
1 #include2 using namespace std; 3 struct A { 4 int nouse1; 5 int nouse2; 6 int n; 7 }; 8 // Your Code Here 9 int MyCompare1( const void * e1,const void * e2) 10 {11 int * p1 = (int * ) e1;12 int * p2 = (int * ) e2;13 return * p1 - * p2;14 }15 int MyCompare2( const void * e1,const void * e2) 16 {17 int * p1 = (int * ) e1;18 int * p2 = (int * ) e2;19 if( (* p1 %10) - (* p2 % 10))20 return (* p1 %10) - (* p2 % 10);21 else22 return * p1 - * p2;23 }24 int MyCompare3( const void * e1,const void * e2) 25 {26 A * p1 = (A*) e1;27 A * p2 = (A*) e2;28 return p1->n - p2->n;29 }30 int a[20];31 A b[20];32 int main ()33 { 34 int n;35 while(cin >> n) {36 for(int i = 0;i < n; ++i) {37 cin >> a[i];38 b[i].n = a[i];39 }40 mysort(a,n,sizeof(int),MyCompare1);41 for(int i = 0;i < n; ++i) 42 cout << a[i] << "," ;43 cout << endl;44 mysort(a,n,sizeof(int),MyCompare2);45 for(int i = 0;i < n; ++i) 46 cout << a[i] << "," ;47 cout << endl;48 mysort(b,n,sizeof(A),MyCompare3);49 for(int i = 0;i < n; ++i) 50 cout << b[i].n << "," ;51 cout << endl;52 }53 return 0;54 }
Input:多组数据。每组数据以整数 n开头(n<10),然后是n个整数。
Output:
对每组数据,输出三行。
第一行是整数从小倒大排序的结果;第二行是按个位数从小到大排序的结果(如果个位数相同,小的排在前面);第三行还是整数从小倒大排序的结果。
Sample Input:
5 21 3 76 48 445
6 73 29 45 8737 2 1Sample Output:
3,21,48,76,445,
21,3,445,76,48,3,21,48,76,445,1,2,29,45,73,8737,1,2,73,45,8737,29,1,2,29,45,73,8737,1 int mysort(void* a, int n, int w, int(*compare)(const void* e1, const void* e2)) { 2 char* s = (char*)a; 3 for(int i=n-1; i>=0; --i) 4 for(int j=0; j 0) { 8 for(int k=0; k
5.从字符串中取数
Description:编写GetDoubleFromString函数,该函数可以不断从字符串中取出正浮点数或整数,无数可取,则返回值小于0。
1 #include2 #include 3 using namespace std; 4 double GetDoubleFromString(char * str) 5 { 6 // Your Code Here 7 } 8 9 int main()10 {11 char line[300];12 while(cin.getline(line,280)) {13 double n;14 n = GetDoubleFromString(line);15 while( n > 0) {16 cout << fixed << setprecision(6) << n << endl;17 n = GetDoubleFromString(NULL);18 }19 }20 return 0;21 }
Input:多组数据,每组数据一行。
Output:针对每组数据,将其中的数输出来。每行一个数,保留小数点后面6位。输入数据中只会有正数,不用考虑负号。两个数之间有至少一个非数字非小数点的字符。
Sample Input:
please 121a1 stand 0.7 9.2 1010.3983 0.00001 black stand what 1324.3
12.34 45 78ab78.34Sample Output:
121.000000
1.0000000.7000009.2000001010.3983000.0000101324.30000012.34000045.00000078.00000078.3400001 static char* p; 2 if(str) 3 p = str; 4 double num = 0; 5 while(*p && !(*p>='0'&&*p<= '9')) 6 ++p; 7 if(*p == 0) 8 return -1; 9 while(*p>='0' && *p<='9') {10 num = num*10+*p-'0';11 ++p;12 }13 if(*p == '.') {14 ++p;15 double i = 10;16 while(*p>='0' && *p<='9') {17 num += (*p-'0')/i;18 ++p;19 i *= 10;20 }21 }22 23 return num;