8.4 实验八 指针
一、 实验目的与要求
1. 理解和掌握指针的概念,定义和使用指针变量。 2. 掌握函数之间指针的传递关系。
3. 掌握通过指针操作数组中元素的方法。 4. 实验2学时
二、实验内容
1.程序调试
(1)调试本程序,了解运算符*与&的用法,并注意容易出错的地方。 #include
float *xptr; //① xptr=&x; //②,此处是否可以用*xptr=&x;? x=7.9;
printf(“The address of x is %x\\n”,&x); printf(“The value of xptr is %x\\n”,xptr); printf(“The value of x is %f\\n”,x);
printf(“The value of *xptr is %f\\n”,*xptr); //③ }
程序运行结果如下:
在上面的程序中,注意区别*ptr的不同意义。语句①中的*表示此处的xptr是作为一个指针变量来定义的,而语句③中的*则表示取变量xptr所指向的值,在本题中就是变量x的值,这时的*可以作为运算符来看待。这也可以理解为什么语句②中用了xptr=&x而不是*xptr=&x,因为在运算过程中*xptr所表示的就是x,如果将x的地址赋给x,肯定会产生错误。明白了*与&的用法后,可以接着看下面一个例子,分析其出错的原因。
(2) 调试程序。下面程序中有错误,请调试修改
输入3个整数,按从小到大的顺序输出。 #include “stdio.h” void main( ) { int a,b,c ;
int *p1,*p2,*p3 ; //定义3个指针变量 void swap(int *p1,int *p2) ; scanf(“%d,%d,%d”,&a,&b,&c) ;
p1=&a ; p2=&b ; p3=&c ; //3个指针分别指向3个整型变量
//用swap函数交换2个数,使较小数放到变量a中,较大数放到变量b中 if(a>b) swap(p1,p2) ; // ① if(a>c) swap(p1,p3); if(b>c) swap(p2,p3);
printf(“%d,%d,%d”,a,b,c); //按从小到大的顺序输出3个数
}
void swap(int *p1,int *p2) //swap函数试图实现2个数的交换 { int *x;
x=p1; // ② p1=p2; //③ p2=x; //④ }
本题编译连接都没有问题,但是不能运行出正确结果。原因在哪里呢?对语句①的调用进行分析,请大家仔细观察swap函数的实现部分。语句①表明a>b成立,因此需要将变量a和b中的数值进行调换,使其满足从小到大的排列顺序。swap函数中定义了一个指针变量x,语句②~④是以指针变量x作为中间变量,将形参指针p1和p2所指的方向进行了调换,即,使形参指针p2指向了较小值,而p1指向了较大值,但是这种交换对变量a和b并没有产生任何影响,当swap函数调用完毕后,变量a和b依然维持原有情况,无法使它们中的数值按从小到大的顺序重新排列,因此无法得到正确的运行效果。
对swap函数如何改造才能得到正确结果呢?请大家结合本题进行改错。
2. 程序完整题
运用指针对传递进来的两个整型量计算它们的和与积之后,通过参数返回,并予以输出。划横线的位置是本程序缺失的部分,请填写正确内容并运行此程序。
#include
void compute(int m, int n, int *sum, int *p) { }
void main() { }
int x,y,sum,product;
scanf(\ //输入两个整型量
compute(x,y,&sum,&product); //将两数和存入变量sum,积存入变量product printf(\
3.一般编程题
1. 用指针法统计10个数中正数、负数和零的个数,并分别求正数的总和,负数的总和。
2. 通过指向整型数组的指针将数组a[m][n]的内容按m行n列的格式输出,如一个2×3的
数组将显示为如下所示的2行3列的形式:
4.较难编程题
1. 输入一行字符,开始用一个指针指向这行字符的开头,并依次向后移,分别统计出其中
英文字母、空格、数字和其它字符的个数。
2. 输入一个正整数表示一个星期中的某一天,若此数字在[1,7]内,则 输出对应英文星期
名,否则表示输入错误,例如,输入2,程序输出“Tuesday”,输入“16”,程序输出“Illegal day” 要求用指针数组处理。
9.4 实验九 结构体与链表
一、 实验目的与要求
1. 2. 3. 4.
掌握结构体类型变量的定义和使用。 掌握结构体类型数组的定义和使用。 掌握利用结构和指针处理单向链表的方法 实验4学时。
二、实验内容
1. 程序完整题
定义一个结构体变量(包括年、月、日),计算该日在本年中是第几天,注意闰年问题。以下的程序没有考虑闰年问题,请调试以下程序,并将闰年的判断加在程序中使其完整。
#include
void main( ) { int i,days; int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; printf(“Input year, month, day:”); scanf(“%d,%d,%d”, &date.year, &date.month, &date.day); days=0; for(i =1; i //此处遗漏判断闰年的语句,请补充 printf(“%d/%d is the %dth day in %d.”, date.month, date.day, days, date.year); } 2. 程序改写题 改写上面的程序,用一个函数days来实现上面第1题的计算,由主函数将年、月、日传递给days函数,计算后将日数传回主函数输出。 #include