作业求助。。。
usrbin吧
全部回复
仅看楼主
level 8
cgcgbcbc 楼主
作业要求“使用模板函数,适应关键字为整数、实数和字符串的各种类型下的排序功能。”
问题是由用户选择输入数据的类型的话怎样对应的创建该类型的数组对象并调用对应该类型的排序函数呢?
我的一个想法是主函数分别创建三种类型的对象:
int n;
cin>>n;//数据规模
array<int> a1(n);
array<double> a2(n);
array<string> a3(n);
然后用switch:
int SelectID;
cin>>SelectID;
switch(SelectID)
{
case 1:
a1.InputElement;
a1.sort;
break;
case 2:
a2.InputElement;
a2.sort;
break;
case 3:
a2.InputElement;
a3.sort;
break;
default:
break;
}
这样做的话....好罗嗦啊....
2010年12月26日 12点12分 1
level 14
作业自己做,才能有进步…
2010年12月26日 12点12分 2
level 13
这是什么语言? 没学过[瞌睡]
2010年12月26日 12点12分 3
level 8
cgcgbcbc 楼主
回复:2楼
额...其实做貌似是能做出来(只是貌似...)
最近助教出差了,作业米人改业米有参考答案公布...所以就上贴吧问问喽
(虽然现在作业还没交...)
回复:3楼
[啊!]K姐姐没学过C++?
2010年12月26日 12点12分 4
level 11
你这么写的话不能说用到了类型模板。我写个给你作参考吧*_^:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1 << 16
using namespace std;
template <class T>
class cgcgbcbc{
     int size;
     T array[MAXSIZE];
    
     public:
         void input(){
             cin >> size;
             for(int i = 0;i < size;++i) cin >> array[i];
         }
        
         void sort(){
             T temp;
             for(int i = 0;i < size;++i)
                 for(int j = i + 1;j < size;++j)
                     if(array[i] > array[j]) temp = array[i],array[i] = array[j],array[j] = temp;
         }
        
         void output(){
             for(int i = 0;i < size;++i) cout << array[i] << " ";
             cout << endl;
         }
};
        
int main(){
     int id;
     cin >> id;
     switch(id){
         case 1:{
             cgcgbcbc<int> cgcg;
             cgcg.input(),cgcg.sort(),cgcg.output();
             break;
         }
         case 2:{
             cgcgbcbc<double> cgcg;
             cgcg.input(),cgcg.sort(),cgcg.output();
             break;
         }
         case 3:{
             cgcgbcbc<string> cgcg;
             cgcg.input(),cgcg.sort(),cgcg.output();
             break;
         }
     }
     system("PAUSE");
     return 0;
}
    

2010年12月26日 13点12分 5
level 11
运行结果:
2010年12月26日 13点12分 6
level 14
好吧…晚点时间写一下吧…
2010年12月26日 13点12分 7
level 8
cgcgbcbc 楼主
回复:5楼
额...我一运行就栈溢出了...诡异...
最诡异的是...我自己在switch里创建实例编译不能通过...但是你这个编译就能过...这是什么原理呢?
2010年12月27日 10点12分 8
level 11
回复:8楼
你是用的G++编译器吗?我MAXSIZE开得太大导致main函数堆栈溢出了。你把MAXSIZE调小些(比如:1024)再编译就没有问题了。这也回答了猫猫昨天问我的问题。
至于你带吗不能通过编译的问题,你能把代码贴出来我看看嘛?
2010年12月27日 11点12分 9
level 14
回复:9楼
[汗]怎么调整求解,没找到地方。。。
2010年12月27日 12点12分 10
level 11
回复:10楼
#define MAXSIZE 1024
2010年12月27日 12点12分 11
level 14
回复:11楼
[揉脸]OK。。。
2010年12月27日 13点12分 12
level 11
回复:12楼
[傻笑]
2010年12月27日 16点12分 13
level 8
cgcgbcbc 楼主
#include<iostream>
#include<string>
using namespace std;
template<class T>
class array{
public:
     array(int n){
         size=n;
         pta=new T[n]();
     }
     void GetElement();
     void Output();
private:
     int size;
     T *pta;
     int BinSearch(int low,int high,T key);
     void InsertKey(int current,int bin);
};
int main()
{
     int n;
     int Select_ID;
     cout<<"Input the scale of data:";
     cin>>n;
     array<int> a1(n);
     array<double> a2(n);
     array<string> a3(n);
     cout<<"Select type of your data:"<<endl;
     cout<<"1.integer 2.real 3.string "<<endl;
     cin>>Select_ID;
     switch(Select_ID)
     {
     case 1:
         a1.GetElement();
         a1.Output();
         break;
     case 2:
         a2.GetElement();
         a2.Output();
         break;
     case 3:
         a3.GetElement();
         a3.Output();
         break;
     default:
         break;
     }
     return 0;
}
template<class T>
void array<T>::GetElement()
{
     int i=0;
     while(i<size)
     {
         cout<<"Input element "<<i+1<<" :";
         cin>>pta[i];
         InsertKey(i,BinSearch(0,i,pta[i]));
         i++;
     }
}
template<class T>
void array<T>::Output()
{
     int i=0;
     while(i<size)
     {
         cout<<pta[i]<<" ";
         i++;
     }
     cout<<endl;

2010年12月28日 03点12分 14
level 8
cgcgbcbc 楼主
}
template<class T>
int array<T>::BinSearch(int low,int high,T key)
{
     int mid;
     mid=(low+high)/2;
     if(mid==size)return mid+1;
     if(high==low)return mid;
     if(key==pta[mid])return mid;
     else if(key<pta[mid])return BinSearch(low,mid,key);
     else return BinSearch(mid+1,high,key);
}
template<class T>
void array<T>::InsertKey(int current,int bin)
{
     if(current!=bin)
     {
         T temp=pta[current];
         int i=current;
         while(i>bin)
         {
             pta[i]=pta[i-1];
             i--;
         }
         pta[bin]=temp;
     }
}
/*----------------------------------------------------------
这个是编译过了的
我开始试图在switch里声明对象,就是把主函数改成
int main()
{
     int n;
     int Select_ID;
     cout<<"Input the scale of data:";
     cin>>n;
//把这三行移到switch里去
     //array<int> a1(n);
     //array<double> a2(n);
     //array<string> a3(n);
     cout<<"Select type of your data:"<<endl;
     cout<<"1.integer 2.real 3.string "<<endl;
     cin>>Select_ID;
     switch(Select_ID)
     {
     case 1:
         array<int> a(n);
         a.GetElement();a.Output();
         break;
     case 2:
         array<double> a(n);
         a.GetElement();a.Output();
         break;
     case 3:
         array<string> a(n);
         a.GetElement();a.Output();
         break;
     default:
         break;
     }
     return 0;
}
然后编译器就会说可能跳过声明的对象(貌似是这样说的...在图书馆米有调试的工具...之前用的VC++6.0)
但是你的代码就神奇的编译通过了啊[拜]
2010年12月28日 03点12分 15
level 11
回复:15楼
你的array类在switch分支里创建并初始化之后的作用域不明确
你在每一个case块上加{}:
switch(xx){
   case 1:{....,break;}
   case 2:{....,break;}
   ...
}
就能编译成功了[睡觉]
2010年12月28日 09点12分 16
1