数学与计算机学院程序设计实验报告实验题目用函数实现字符串排序

数学与计算机学院程序设计实验报告

年级 11级数电二班学号2011435058  姓名魏珊珊成绩______

专业电气信息类计算机类实验地点主楼402  指导教师石强实验题目用函数实现字符串排序日期 2012523

一、实验目的:学会用指针数组

二、实验问题描述

说明一个可存放10个字符串的字符数组,个字符串有用户输入(假设用户输入的字符串长度上限为32
数组中每个元素的大小根据用户输入串的实际大小动态确定。编一个函数对数组进行排序。实现从大到小的排序。
(排序时无需交换两个串,只交换他们的指针即可)

三、实验问题分析

算法:

1)定义一个二维数组保存字符串,然后用指针数组保存二维数组每一行的地址。然后在函数中用选择排序法,通过改变指针数组的各元素的指向,实现字符串的排序

2)直接在主函数中定义指针数组,然后在函数中用选择排序法,通过改变指针数组的各元素的指向,实现字符串的排序。只是这种方法不能在黑屏上输入任意字符串,只能事先在主函数中初始化指针数组时键入字符串。

 

出现的问题:我知道定义了指针数组后不用再取地址了,但是我不知道怎样在只能用指针数组的情况下,实现在黑屏上键入任意字符串。

 

知识点:开始我在指针数组和二维数组之间有点迷惑,下面是二者的比较:

1@char *str[M]

这是定义了一个字符指针数组str,即str数组的每个元素都是一个指针,可以指向一个char地址。系统为它分配Msizeof(int)长度的空间。

 

2@char  str[M][N]

这是定义了一个二维字符数组,可以存储M*N个字符,系统为它分配M*Nsizeof(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;        

}

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值