《计算机科学》课程主页在:
http://blog.csdn.net/sxhelijian/article/details/13705597
1、阅读程序:阅读下面的程序,写出运行结果,上机时运行程序,记录结果,从而能够理解指针的用法
(1)
你认为运行结果为:_________________
实际运行的结果为:_________________
(2)
实际运行的结果为:_________________
实际运行的结果为:_________________
(4)
实际运行的结果为:_________________
实际运行的结果为:_________________
2、程序填空及设计
(1)下面程序要把数组元素中的最大值放入a[0]中,请补充完整括号中缺少的部分
3、动态数组应用 输入学生成绩,输出高于平均成绩的学生序号和成绩,其中学生人数不定,也需要由键盘输入。
分析:学生人数不定,动态分配存储成绩的空间是个更适合的方案
下面的程序结构供参考:
1、阅读程序:阅读下面的程序,写出运行结果,上机时运行程序,记录结果,从而能够理解指针的用法
(1)
#include<stdio.h> int main() { int a, b, temp; int *p1, *p2; p1 = &a; p2 = &b; scanf("%d %d",p1,p2); temp = *p1; *p1 = *p2; *p2 =temp; printf("%d %d", a, b); return 0; }若程序运行中输入: 10 100
你认为运行结果为:_________________
实际运行的结果为:_________________
(2)
#include <stdio.h> int main( ) { int x[] = {10, 20, 30, 40, 50 }; int *p ; p=x; printf("%d", *(p+2)); return 0; }你认为运行结果为:_________________
实际运行的结果为:_________________
(3)
#include <stdio.h> int main() { int a[ ]= {1, 2, 3, 4, 5, 6}; int x, y, *p; p = &a[0]; x = *(p+2); y = *(p+4); printf("*p=%d, x=%d, y=%d\n", *p, x, y); return 0; }你认为运行结果为:_________________
实际运行的结果为:_________________
(4)
#include <stdio.h> int main( ) { int a[]= {1, 2, 3, 4, 5}; int i, x, *p; p=a; for(i=1; i<5; i+=2) { x=*(p+i); printf("%d: %d \n", *p, x); } return 0; }你认为运行结果为:_________________
实际运行的结果为:_________________
(5)
#include<stdio.h> struct point { int x, y; }; int main() { struct point p1, p2; struct point *pc = &p1; pc->x = 10; //等价于 p1.x=10 pc->y = 20; pc = &p2; (*pc).x = 100; //等价于pc-> = 100 (*pc).y = 200; printf("(%d %d),", p1.x, p1.y); printf("(%d %d)", pc->x, pc->y); return 0; }你认为运行结果为:_________________
实际运行的结果为:_________________
2、程序填空及设计
(1)下面程序要把数组元素中的最大值放入a[0]中,请补充完整括号中缺少的部分
#include <stdio.h> int main( ) { int a[10]= {6,7,2,9,1,10,5,8,4,3}; int *p=a,i; for(i=0;i<10;i++,p++) if(________) *a=*p; printf("%d",*a); return 0; }
(2)上面的程序运行过后,如果原a[0]非最大值,a[0]的值将“丢失”,请改写程序,采取交换的策略,不丢失原数组中的任何一个值。
【参考解答】
(1)*a<*p
在此程序情境下,*a还可以表示为a[0],而*p的等价表示方法更多,*p相当于a[i]、*(a+i),所以a[0]<a[i]、*a<*(a+i)之类,全正确
(2)
#include <stdio.h> int main( ) { int a[10]= {6,7,2,9,1,10,5,8,4,3}; int *p=a,i,t; for(i=0; i<10; i++,p++) if(*a<*p) //需要时,立即交换 { t=*a; *a=*p; *p=t; } for(i=0; i<10; i++) printf("%d ",*(a+i)); return 0; }
或更“经济”的做法,循环中记录下最大值位置,循环后再交换
#include <stdio.h> int main( ) { int a[10]= {6,7,2,9,1,10,5,8,4,3}; int *p=a+1,i,t,m=0; for(i=1; i<10; i++,p++) if(*(a+m)<*p) //记录最大值的位置 { m=i; } t=*a; *a=*(a+m); *(a+m)=t; for(i=0; i<10; i++) printf("%d ",*(a+i)); return 0; }
3、动态数组应用 输入学生成绩,输出高于平均成绩的学生序号和成绩,其中学生人数不定,也需要由键盘输入。
分析:学生人数不定,动态分配存储成绩的空间是个更适合的方案
下面的程序结构供参考:
#include<stdio.h> #include_________ //m?????.h int main() { int number; //学生人数 int *score; //动态数组的首地址 int sum=0,ave; //成绩和、均分 //输入学生人数,为动态数组score分配合适大小的空间 //读入学生成绩,并求出成绩和 //求平均成绩 //输出高于平均分的学生的学号(即序号)和成绩 //释放动态分配的空间 }
【参考解答】
#include<stdio.h> #include<malloc.h> int main() { int number; //学生人数 int *score; //动态数组的首地址 int sum=0,ave; //成绩和 int i; //输入学生人数,为动态数组score分配合适大小的空间 printf("输入学生人数: "); scanf("%d", &number); score = (int*)malloc(sizeof(int)*number); //读入学生成绩,并求出成绩和 printf("输入这 %d 名学生的成绩: ", number); for (i=0; i<number; i++) { scanf("%d",&score[i]); //或scanf("%d",(score+i)); sum += *(score+i); } //求平均成绩 ave = sum/number; //输出高于平均分的学生的学号(即序号)和成绩 printf("平均分是 %d,高于平均分的学生为: \n", ave); for (i=0; i<number; i++) if(*(score+i)>ave) printf("%d %d\n", i, *(score+i)); //释放动态分配的空间 free(score); return 0; }