《计算机科学》课程主页在:
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;
}