c程序实验报告
姓名:黄志乾 实验地点:教学楼514教室 实验时间:4月30日
实验项目:
1、指针基础及指针运算
2、数据交换
3、输出指定行数的杨辉三角形
4、数组元素奇偶排列
一、实验目的与要求
1.指针基础及指针运算
● 本实验旨在及爱情学生对指针数据类型的理解,熟悉指针的定义、通过指针间接访问变量
2.数据交换
● 本实验旨在加强学生对指针类型作为函数参数传递的理解,通常将实参传递给形参时,有两种方式,即按值传递和按地址传递,其中指针类型参数即是按地址。
实验要求:
● 定义两个函数,分别为void swap1(int a ,int b)和void swawp2(int *a,int *b),用于交换a,b的值。
● 从主函数中分别输入两个整型变量a、b
●从主函数中分别调用上述两个交换函数,并打印输出交换后a、b的结果
3.字符串翻转及字符串连接
● 本实验旨在加强学生对字符指针以及将指针作为函数的返回类型的理解,并通过指针对字符串进行操作,通常来说,一个字符串在内存中是连续存放的,起开始地址为指向该字符串的指针值,字符串均以' '作为结束字符
实验要求
●定义两个字符指针,通过gets()函数输入两个字符串
●定义一个函数charreverse(char str),通过指针移动方式将字符串反转
●定义一个函数charlink(charstr1,char *str2),通过指针移动方式将两个字符串连接起来。
●从主函数中分别调用上述函数,输入字符串并打印输出结果。
4.数组元素奇偶排列
●本实验旨在加强学生对使用指针对数组进行操作的理解,通常数组的名称及整个数组的起始存储地址,可以定义一个指针指向它,然后通过指针移动来访问各个数组成员。
实验要求
●定义一个整型一堆数组,任意输入数组的元素,其中包含奇数和偶数
●定义一个函数,实现将数组元素奇数存在左,偶数在右的排列。
●在上述定义的函数中,不允许再增加新的数组
●从主函数中分别调用上述含税,打印输出结果
二、实验内容
1.实验练习:8.3.1
问题描述:
(1)定义一个整型指针变量p,使它指向一个整形变量a,定义一个浮点型指针q,使它指向一个浮点型变量b,同时定义另外一个整型变量c并赋初值3
(2)使用指针变量,调用scanf函数分别输入a和b的值。
(3)通过指针间接访问并输出a、b的值。
(4)按十六进制方式输出p、q的值以及a、b的地址
(5)将p指向c,通过p间接访问c的值并输出
(6)输出p的值及c的地址,并与上面的结果进行比较
流程图
实验代码
#include<stdio.h>
int main()
{
int *p,a,c=3;
float *q,b;
p=&a;
q=&b;
printf("Please input the value of a,b:");
scanf("%d,%f",p,q);
printf("Result:
");
printf("%d,%f
",a,b);
printf("%d,%f
",*p,*q);
printf("The Addreses of a,b:%p,%p
",&a,&b);
printf("The Addreses of a,b:%p,%p
",p,q);
p=&c;
printf("c=%d
",*p);
printf("The adress of c:%x,%x
",&c,p);
return 0;
}
运行结果
问题:
无
2.实验练习8.3.2
流程图
实验代码:
#include<stdio.h>
void swap1(int x,int y);
void swap2(int *x,int *y);
int main()
{
int a,b;
printf("Please input a:");
scanf("%d",&a);
printf("Please inpur b:");
scanf("%d",&b);
swap1(a,b);
printf("
After call swap1:a=%d b=%d
",a,b);
swap2(&a,&b);
printf("
After Call swap2:a=%d b=%d
",a,b);
return 0;
}
void swap1(int x,int y)
{
int temp;
temp=x;
x=y;
y=temp;
}
void swap2(int *x,int *y)
{
int temp;
temp=*x;
*x=*y;
*y=temp;
}
运行结果
问题:
无
3.实验练习:8.3.3
问题描述:
编写程序,从键盘输入行数,输出指定行数的杨辉三角形。
流程图
实验代码
#include<stdio.h>
char *reverse(char *str);
char *link(char *str1,char *str2);
int main()
{
char str[30],str1[30],*str2;
printf("Input Reversing Character String:");
gets(str);
str2=reverse(str);
printf("Output Reversed Character String:");
puts(str2);
printf("Inpur String1:");
gets(str);
printf("Inpur String2:");
gets(str1);
str2=link(str,str1);
printf("Link String1 and String2:");
puts(str2);
return 0;
}
char *reverse(char *str)
{
char *p,*q,temp;
p=str,q=str;
while(*p!=' ')
p++;
p--;
while(q<p)
{
temp=*q;
*q=*p;
*p=temp;
q++;
p--;
}
return str;
}
char *link (char *str1,char *str2)
{
char *p=str1,*q=str2;
while (*p!=' ')
p++;
while (*q!=' ')
{
*p=*q;
p++;
q++;
}
*p=*q;
return str1;
}
运行结果
问题:这个题目主要的问题在于使结束字符为空字符,在第一次完成时出现了错误,在指针同时移动的时候我算错了指针位置,使后一位为空字符,导致输出结果中会含有一个未知字符
4.实验练习:8.3.4
流程图
实验代码
#include<stdio.h>
#define N 10
void arrsort(int a[],int n);
int main()
{
int a[N],i;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
arrsort(a,N);
for(i=0;i<N;i++)
printf("%d ",a[i]);
}
void arrsort (int a[],int n)
{
int *p,*q,temp;
p=a;
q=a+n-1;
while (p<q)
{
while (*p%2!=0)
p++;
while(*q%2==0)
q--;
if(p>q) break;
temp=*p;
*p=*q;
*q=temp;
p++;
q--;
}
}
运行结果
问题:无
三、实验小结
实验中存在的问题:
1、指针的通向移动与相向移动时会搞错指针位置
2、通过指针进行值传递或是址传递会混淆