数学与计算机学院程序设计实验报告
年级 11级数电二班学号2011435058 姓名魏珊珊成绩______
专业电气信息类计算机类实验地点主楼402 指导教师石强实验题目用函数实现字符串排序日期 2012年5月23日
一、实验目的:学会用指针数组
二、实验问题描述
说明一个可存放10个字符串的字符数组,个字符串有用户输入(假设用户输入的字符串长度上限为32)
数组中每个元素的大小根据用户输入串的实际大小动态确定。编一个函数对数组进行排序。实现从大到小的排序。
(排序时无需交换两个串,只交换他们的指针即可)
三、实验问题分析
算法:
(1)定义一个二维数组保存字符串,然后用指针数组保存二维数组每一行的地址。然后在函数中用选择排序法,通过改变指针数组的各元素的指向,实现字符串的排序
(2)直接在主函数中定义指针数组,然后在函数中用选择排序法,通过改变指针数组的各元素的指向,实现字符串的排序。只是这种方法不能在黑屏上输入任意字符串,只能事先在主函数中初始化指针数组时键入字符串。
出现的问题:我知道定义了指针数组后不用再取地址了,但是我不知道怎样在只能用指针数组的情况下,实现在黑屏上键入任意字符串。
知识点:开始我在指针数组和二维数组之间有点迷惑,下面是二者的比较:
1@char *str[M]
这是定义了一个字符指针数组str,即str数组的每个元素都是一个指针,可以指向一个char地址。系统为它分配M个sizeof(int)长度的空间。
2@char str[M][N]
这是定义了一个二维字符数组,可以存储M*N个字符,系统为它分配M*N个sizeof(char)长度的空间。
指针数组可以保存二维数组每行地址,他两个一起使用能解决本题。
四、实验结果(程序)及分析
以下是能运行的代码:
(1)#include<iostream.h>
#include<conio.h> //因为编译器的问题,所以用getch()显示运行结果
#include<string.h>
#define N 10
/*根据字符串的大小排序,由大到小*/
void sort(char *p[N]);
int main()
{
char str[N][32]; /*保存字符串的二维数组,每个字符串的最大长度是50*/
int i;
char *p[N];
/*声明指针数组,保存二维数组每一行的地址*/
cout<<"请输入"<<N<<"个字符串:\n";
for(i=0;i<N;i++)
cin>>str[i]; /*初始化二维数组*/
for(i=0;i<N;i++) /*初始化指针数组*/
p[i]=str[i];
sort(p);
getch();
return 0;
}
void sort(char *p[N])
{
int i,j;
char *t;
cout<<"由大到小排序:"<<endl;
for(i=0;i<N-1;i++) //选择排序发法
for(j=i+1;j<N;j++)
{
if(strcmp(p[j],p[i])>0)
{
t=p[i];
p[i]=p[j];
p[j]=t;
}
}
for(i=0;i<N;i++)
cout<<p[i]<<" "; /*输出排序后的结果*/
cout<<endl;
}
(2)
#include<stdio.h>
#include<string.h>
#include<conio.h> //显示运行结果
void sort(char *a[],int size);
int main()
{//定义指针数组并初始化
char *a[]={"follow","base","we","sa","asd","sdf","dfg","fgh","ghj","hjk",};
int size=10;
sort(a,size); //调用排序函数
getch();
return 0;
}
void sort(char *a[],int size) //定义函数对字符串排序并输出排序结果
{
int k,i,j;
char *t;
for(i=0;i<size-1;i++)
{
k=i;
for(j=i+1;j<size;j++)
if(strcmp(a[j],a[k])>0) //strcmp函数比较字符串大小
k=j;
if(k!=i)
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
for(i=0;i<size;i++) //输出数组
cout<<a[i]<<" ";
cout<<endl;
}