关于指针的排序 .. 救命 T T

qq530561552 2013-05-26 10:51:24
void student::Sort()
{
int m,n;
char na[20];
char nu[20];
char se[20];
double c;
double ma;
double eg;
double av;
double su;
for (m=0;m<i;m++)
{
for (n=m+1;n<i;n++)
{
if ((s[m]->average) < (s[n]->average))
{
av=s[m]->average;
s[n]->average=s[m]->average;
s[n]->average=av;

ma=s[m]->mathmark;
s[n]->mathmark=s[m]->mathmark;
s[n]->mathmark=ma;

eg=s[m]->egmark;
s[n]->egmark=s[m]->egmark;
s[n]->egmark=eg;

c=s[m]->cmark;
s[n]->cmark=s[m]->cmark;
s[n]->cmark=c;

su=s[m]->sum;
s[n]->sum=s[m]->sum;
s[n]->sum=su;

strcpy(na,s[m]->name);
strcpy(s[m]->name,s[n]->name);
strcpy(s[n]->name,na);

strcpy(nu,s[m]->num);
strcpy(s[m]->num,s[n]->num);
strcpy(s[n]->num,nu);

strcpy(se,s[m]->sex);
strcpy(s[m]->sex,s[n]->sex);
strcpy(s[n]->sex,se);
}
}
}

}

如上代码所示 .. 我想用冒泡排序法 将学生的平均分由高到低排好 但这个方法貌似不行
我知道原因 ... 谁有更好的解决办法 求解决 这个问题想了两天了 ...
...全文
341 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-05-27
  • 打赏
  • 举报
回复
引用 22 楼 qq530561552 的回复:
vc6 吧,都老掉牙了,对学 c++ 有害无益。貌似这家伙不喜欢局部匿名类对象做模板参数。再试一下这个吧。

struct average_descending_comp_t
{
 bool operator () (student const* x, student const* y) const
 {
  return x->average > y->average;
 }
};
#include <algorithm>
void student::Sort ()
{
 average_descending_comp_t average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
另外你得把 class student 的 average 数据成员改成公有的,或者提供相应的访问接口。否则那个比较函数还是会出编译错误的。
把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] >> 把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 所以我说“或者提供相应的访问接口”。 >> 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] 那你肯定没有输入 50 个学生的信息,排序排到 i 就行了,std::sort(&s[0],&s[0]+i,average_descending_comp);
疯狂的红豆 2013-05-27
  • 打赏
  • 举报
回复
引用 9 楼 qq530561552 的回复:
[quote=引用 6 楼 ZLhy_ 的回复:] 学完C++没听说过STL是莫大的悲哀,当然这也是国内C++教育的最大的弊端,说实话我们当初学C++的时候只是接触了一些常用的容器而已,但是大多数人还都是停留在听说过的基础上。 这是头文件

//基于STL的学生信息管理
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>


class student
{
public:
	student(string name, string id, float ag):m_sName(name), m_sID(id), m_fAverage(ag)
	{

	}
	student(const student &stu)
	{
		m_sName = stu.m_sName;
		m_sID = stu.m_sID;
		m_fAverage = stu.m_fAverage;
	}
	student& operator= (const student &stu)
	{
		m_sName = stu.m_sName;
		m_sID = stu.m_sID;
		m_fAverage = stu.m_fAverage;

		return *this;
	}

	bool operator< (const student &stu)
	{
		return m_fAverage < stu.m_fAverage;
	}

	 friend ostream& operator<< (ostream &out, const student &stu)
	{
		out<<stu.m_sName<<" "<<stu.m_sID<<" "<<stu.m_fAverage;
		return out;
	}

private:
	string m_sName;
	string m_sID;

	//只是为了展示 利用averger字段进行排序,其余的不写了
	float m_fAverage;
};

class StudentInforManager
{
public:
	StudentInforManager(){}
	void SortByAverger()
	{
		//在这里调用STL 算法库中的函数 sort 默认的排序准则是< 在student类中我们已经重载了
		sort(stuVec.begin(), stuVec.end());
	}
	void PrintStudentInfor()
	{
		copy( stuVec.begin(), stuVec.end(),
			 ostream_iterator<student>(cout, "\n") );
	}

    void AddStudent(student &stu)
	{
		stuVec.push_back(stu);
	}
private:
	vector<student> stuVec;
};
这是主函数中的

	StudentInforManager sm;
	sm.AddStudent(student("zhangsan", "12301", 70));
	sm.AddStudent(student("lisi", "12302", 80));
	sm.AddStudent(student("wangwu", "12303", 90));
	sm.AddStudent(student("mazi", "12304", 60));

	sm.SortByAverger();
	sm.PrintStudentInfor();
只是为了说教,很多东西都没有写具体
我没学完c++ STL也用过 就是那个sort函数 .. 我现在就学完了类里面的多态 连容器和文件输入输出流都没有学呃 ..... 所以 我看不懂你的代码... 不知道大神有什么好书推荐下 感觉学校发的那本c++太烂的 [/quote] ,,,至于书籍,你这学期学完C++就 看看<C++标准程序库>吧,全面介绍STL的,也可以看看Effective C++
qq530561552 2013-05-27
  • 打赏
  • 举报
回复
引用 21 楼 zhao4zhong1 的回复:
//假设带表头结点的单向链表头指针为head,试编写一个算法将值为5的结点插入到连接表的第k个结点前,并对该链表进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
    int          data;
    struct NODE *next;
} H,*head,*p,*q;
int i,j,k,n,t;
int main() {
    srand(time(NULL));

    //填写头节点数据
    H.data=-1;
    H.next=NULL;
    head=&H;

    //创建10个节点的单链表
    p=head;
    for (i=0;i<10;i++) {
        q=(struct NODE *)malloc(sizeof(struct NODE));
        if (NULL==q) return 1;
        q->data=10+rand()%90;//填写10..99的随机值
        q->next=NULL;
        p->next=q;
        p=q;
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //将值为5的结点插入到单链表的第k个结点前
    k=3;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        n++;
        if (k==n) {
            q=(struct NODE *)malloc(sizeof(struct NODE));
            if (NULL==q) return 1;
            q->data=5;
            q->next=p->next;
            p->next=q;
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //从小到大排序
    for (p=head->next;p!=NULL && p->next!=NULL;p=p->next) {
        for (q=p->next;q!=NULL;q=q->next) {
            if (p->data > q->data) {
                t=p->data;p->data=q->data;q->data=t;
            }
        }
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //释放所有节点
    p=head->next;
    while (1) {
        if (NULL==p) {
            break;
        }
        q=p->next;
        free(p);
        p=q;
    }

    return 0;
}
//20->75->80->82->78->33->54->63->10->99->
//20->75->05->80->82->78->33->54->63->10->99->
//05->10->20->33->54->63->75->78->80->82->99->
这个我知道 但我这里没有用链表写这个程序.... 要是切入链表这个算法 程序就变得好复杂
qq530561552 2013-05-27
  • 打赏
  • 举报
回复
vc6 吧,都老掉牙了,对学 c++ 有害无益。貌似这家伙不喜欢局部匿名类对象做模板参数。再试一下这个吧。

struct average_descending_comp_t
{
 bool operator () (student const* x, student const* y) const
 {
  return x->average > y->average;
 }
};
#include <algorithm>
void student::Sort ()
{
 average_descending_comp_t average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
另外你得把 class student 的 average 数据成员改成公有的,或者提供相应的访问接口。否则那个比较函数还是会出编译错误的。[/quote] 把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了
ri_aje 2013-05-27
  • 打赏
  • 举报
回复
引用 15 楼 qq530561552 的回复:
[quote=引用 14 楼 ri_aje 的回复:] [quote=引用 13 楼 qq530561552 的回复:] [quote=引用 12 楼 ri_aje 的回复:] [quote=引用 11 楼 qq530561552 的回复:] [quote=引用 10 楼 ri_aje 的回复:] 试一下这个呢。我没编译,你的代码不齐,我也没法编译。

#include <algorithm>
void student::Sort ()
{
 struct
 {
  bool operator < (student const* x, student const* y) const
  {
   return x->average > y->average;
  }
 } average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
#ifndef _student_H_ #define _student_H_ #include <iostream.h> #include <string.h> class student { char name[20]; char num[20]; char sex[10]; double cmark; double egmark; double mathmark; double average; double sum; public: student(); student(char na[20],char nu[20],char se[20],double c,double ma,double eg,double av,double s); void delet(); void alter(); void input(); void search(); void Sort(); void show(); }; #endif 你加上这个编译的到了 不过 一大堆错误的... 我试了下 写成这样可以排序 void student::Sort () { sort(s,s+i); } 但我看不明白你的 std::sort[/quote] 这种排序用的是指针存储的内存地址值,没用的。 你有没有试试 #10 的代码,能不能按 average 降序排列 student* ?[/quote] #10的代码连编译都过不了 有错误呃[/quote] 嗯,是我写错了,不用编译器果然还是不行,容易忘事。这回这个编译过了。


#include <algorithm>
void student::Sort()
{
 struct
 {
  bool operator () (student const* x, student const* y) const
  {
   return x->average > y->average;
  }
 } average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
[/quote] 我有点懂你的意思了 但是编译还是错 error C2627: member function defined in unnamed class error C2919: illegal use of anonymous local type in template instantiation error C2780: 'void __cdecl std::sort(_RI,_RI)' : expects 2 arguments - 3 provided \vc98\vc98\include\algorithm(538) : see declaration of 'sort' 我是用vc的[/quote] vc6 吧,都老掉牙了,对学 c++ 有害无益。貌似这家伙不喜欢局部匿名类对象做模板参数。再试一下这个吧。

struct average_descending_comp_t
{
 bool operator () (student const* x, student const* y) const
 {
  return x->average > y->average;
 }
};
#include <algorithm>
void student::Sort ()
{
 average_descending_comp_t average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
另外你得把 class student 的 average 数据成员改成公有的,或者提供相应的访问接口。否则那个比较函数还是会出编译错误的。
赵4老师 2013-05-27
  • 打赏
  • 举报
回复
//假设带表头结点的单向链表头指针为head,试编写一个算法将值为5的结点插入到连接表的第k个结点前,并对该链表进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>
struct NODE {
    int          data;
    struct NODE *next;
} H,*head,*p,*q;
int i,j,k,n,t;
int main() {
    srand(time(NULL));

    //填写头节点数据
    H.data=-1;
    H.next=NULL;
    head=&H;

    //创建10个节点的单链表
    p=head;
    for (i=0;i<10;i++) {
        q=(struct NODE *)malloc(sizeof(struct NODE));
        if (NULL==q) return 1;
        q->data=10+rand()%90;//填写10..99的随机值
        q->next=NULL;
        p->next=q;
        p=q;
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //将值为5的结点插入到单链表的第k个结点前
    k=3;
    n=0;
    p=head;
    while (1) {
        if (NULL==p) {
            break;
        }
        n++;
        if (k==n) {
            q=(struct NODE *)malloc(sizeof(struct NODE));
            if (NULL==q) return 1;
            q->data=5;
            q->next=p->next;
            p->next=q;
            break;
        }
        p=p->next;
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //从小到大排序
    for (p=head->next;p!=NULL && p->next!=NULL;p=p->next) {
        for (q=p->next;q!=NULL;q=q->next) {
            if (p->data > q->data) {
                t=p->data;p->data=q->data;q->data=t;
            }
        }
    }

    //输出整个单链表
    p=head->next;
    while (1) {
        if (NULL==p) {
            printf("\n");
            break;
        }
        printf("%02d->",p->data);
        p=p->next;
    }

    //释放所有节点
    p=head->next;
    while (1) {
        if (NULL==p) {
            break;
        }
        q=p->next;
        free(p);
        p=q;
    }

    return 0;
}
//20->75->80->82->78->33->54->63->10->99->
//20->75->05->80->82->78->33->54->63->10->99->
//05->10->20->33->54->63->75->78->80->82->99->
qq530561552 2013-05-27
  • 打赏
  • 举报
回复
引用 28 楼 zhao4zhong1 的回复:
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到不同的位置。输入或输出数据流的位置即为句柄。 下表将列出可用的句柄。 句柄 句柄的数字代号 描述 STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。 数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定文件名或另一个现有的句柄。 要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(例如 &句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT): 2>&1 下表列出了可用于将输入和输出数据流进行重定向的操作符。 重定向操作符 描述 > 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。 默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。 重定向输入 (<) 要将键盘输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入: sort<file.txt File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。 < 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问打开的。 注意 0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。 要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入: dir>dirlist.txt 如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。 要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入: netsh routing dump>c:\route.cfg > 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为句柄 0 最初是以只读访问打开的。 注意 1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入: dir>c:\file.txt 2>&1 复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。 使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。 例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入: <file.txt 要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入: sort<file.txt 要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入: findfile file.txt>search.txt 2<&1 要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入: <&3 使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。 要将用户定义句柄 3 复制到句柄 1,请键入: >&3 要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入: ipconfig.exe>>output.log 2>&1 使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件: dir>>dirlist.txt 要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入: netstat>>tcpinfo.txt 使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类: dir | sort 在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。 合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名: dir /b | find "LOG" > loglist.txt dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。 要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中每次显示一屏: dir c:\ /s /b | find "LOG" | more 利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅使用筛选器。
感谢各位大神的帮助!!!
qq530561552 2013-05-27
  • 打赏
  • 举报
回复
引用 26 楼 ri_aje 的回复:
[quote=引用 25 楼 qq530561552 的回复:] [quote=引用 24 楼 ri_aje 的回复:] [quote=引用 22 楼 qq530561552 的回复:] vc6 吧,都老掉牙了,对学 c++ 有害无益。貌似这家伙不喜欢局部匿名类对象做模板参数。再试一下这个吧。

struct average_descending_comp_t
{
 bool operator () (student const* x, student const* y) const
 {
  return x->average > y->average;
 }
};
#include <algorithm>
void student::Sort ()
{
 average_descending_comp_t average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
另外你得把 class student 的 average 数据成员改成公有的,或者提供相应的访问接口。否则那个比较函数还是会出编译错误的。
把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] >> 把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 所以我说“或者提供相应的访问接口”。 >> 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] 那你肯定没有输入 50 个学生的信息,排序排到 i 就行了,std::sort(&s[0],&s[0]+i,average_descending_comp);[/quote] 但把average函数放到共有那里 感觉好怪啊[/quote] 听不懂你说什么了,感觉这都是基础问题了,先找本书老老实实看看吧,TC++PL or c++ primer 之类的。[/quote] 感谢各位大神
赵4老师 2013-05-27
  • 打赏
  • 举报
回复
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定向到不同的位置。输入或输出数据流的位置即为句柄。 下表将列出可用的句柄。 句柄 句柄的数字代号 描述 STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。 数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定文件名或另一个现有的句柄。 要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号(例如 &句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到句柄 1(即 STDOUT): 2>&1 下表列出了可用于将输入和输出数据流进行重定向的操作符。 重定向操作符 描述 > 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。 默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。 重定向输入 (<) 要将键盘输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入: sort<file.txt File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。 < 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句柄 2 最初是以只写访问打开的。 注意 0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的命令也会在命令提示符窗口显示消息和提示。 要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入: dir>dirlist.txt 如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。 要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入: netsh routing dump>c:\route.cfg > 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为句柄 0 最初是以只读访问打开的。 注意 1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入: dir>c:\file.txt 2>&1 复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄复制到另一个具有只写访问属性的句柄。 使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用,指定的文件必须已经存在。如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄复制到系统现有的句柄中。 例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入: <file.txt 要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入: sort<file.txt 要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入: findfile file.txt>search.txt 2<&1 要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入: <&3 使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。 要将用户定义句柄 3 复制到句柄 1,请键入: >&3 要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入: ipconfig.exe>>output.log 2>&1 使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续的大于号(即 >>)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件: dir>>dirlist.txt 要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入: netstat>>tcpinfo.txt 使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类: dir | sort 在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到句柄 1(即 STDOUT)。 合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名: dir /b | find "LOG" > loglist.txt dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。 要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中每次显示一屏: dir c:\ /s /b | find "LOG" | more 利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅使用筛选器。
赵4老师 2013-05-27
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
ri_aje 2013-05-27
  • 打赏
  • 举报
回复
引用 25 楼 qq530561552 的回复:
[quote=引用 24 楼 ri_aje 的回复:] [quote=引用 22 楼 qq530561552 的回复:] vc6 吧,都老掉牙了,对学 c++ 有害无益。貌似这家伙不喜欢局部匿名类对象做模板参数。再试一下这个吧。

struct average_descending_comp_t
{
 bool operator () (student const* x, student const* y) const
 {
  return x->average > y->average;
 }
};
#include <algorithm>
void student::Sort ()
{
 average_descending_comp_t average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
另外你得把 class student 的 average 数据成员改成公有的,或者提供相应的访问接口。否则那个比较函数还是会出编译错误的。
把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] >> 把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 所以我说“或者提供相应的访问接口”。 >> 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] 那你肯定没有输入 50 个学生的信息,排序排到 i 就行了,std::sort(&s[0],&s[0]+i,average_descending_comp);[/quote] 但把average函数放到共有那里 感觉好怪啊[/quote] 听不懂你说什么了,感觉这都是基础问题了,先找本书老老实实看看吧,TC++PL or c++ primer 之类的。
qw88609930 2013-05-27
  • 打赏
  • 举报
回复
额 - -看不懂
qq530561552 2013-05-27
  • 打赏
  • 举报
回复
引用 24 楼 ri_aje 的回复:
[quote=引用 22 楼 qq530561552 的回复:] vc6 吧,都老掉牙了,对学 c++ 有害无益。貌似这家伙不喜欢局部匿名类对象做模板参数。再试一下这个吧。

struct average_descending_comp_t
{
 bool operator () (student const* x, student const* y) const
 {
  return x->average > y->average;
 }
};
#include <algorithm>
void student::Sort ()
{
 average_descending_comp_t average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
另外你得把 class student 的 average 数据成员改成公有的,或者提供相应的访问接口。否则那个比较函数还是会出编译错误的。
把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] >> 把 class student 的 average 数据成员改成公有的这样不就违反了面向对象的规则了吗? 所以我说“或者提供相应的访问接口”。 >> 我试过了 编译是没错 但是一调用void student::Sort ()这个函数的时候 程序直接崩溃了[/quote] 那你肯定没有输入 50 个学生的信息,排序排到 i 就行了,std::sort(&s[0],&s[0]+i,average_descending_comp);[/quote] 但把average函数放到共有那里 感觉好怪啊
ri_aje 2013-05-26
  • 打赏
  • 举报
回复
引用 3 楼 qq530561552 的回复:
[quote=引用 1 楼 ri_aje 的回复:] 用 std::sort 不行吗,干吗非得自己闭门造车?
不懂怎么用 [/quote] 把要排序的数据结构代码发上来,还有排序标准用人类语言说出来。
qq530561552 2013-05-26
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
用 std::sort 不行吗,干吗非得自己闭门造车?
不懂怎么用
qq530561552 2013-05-26
  • 打赏
  • 举报
回复
不懂怎么用 ........
ri_aje 2013-05-26
  • 打赏
  • 举报
回复
用 std::sort 不行吗,干吗非得自己闭门造车?
大尾巴猫 2013-05-26
  • 打赏
  • 举报
回复
上面交换写错。 应该是student temp(s1);s1 = s2; s2 = temp;
大尾巴猫 2013-05-26
  • 打赏
  • 举报
回复
逻辑混乱。 student这个类是描述一个学生信息的类吧,不是一群学生。 delete和sort放在这个类当中明显是不合适的。 而且2个学生对象进行交换怎么都是strcpy的,直接像int一样赋值就行了。 2个student对象s1,s2交换的话,用studeng temp(s1);temp = s2; s2 = temp就行了呀。
qq530561552 2013-05-26
  • 打赏
  • 举报
回复
引用 14 楼 ri_aje 的回复:
[quote=引用 13 楼 qq530561552 的回复:] [quote=引用 12 楼 ri_aje 的回复:] [quote=引用 11 楼 qq530561552 的回复:] [quote=引用 10 楼 ri_aje 的回复:] 试一下这个呢。我没编译,你的代码不齐,我也没法编译。

#include <algorithm>
void student::Sort ()
{
 struct
 {
  bool operator < (student const* x, student const* y) const
  {
   return x->average > y->average;
  }
 } average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
#ifndef _student_H_ #define _student_H_ #include <iostream.h> #include <string.h> class student { char name[20]; char num[20]; char sex[10]; double cmark; double egmark; double mathmark; double average; double sum; public: student(); student(char na[20],char nu[20],char se[20],double c,double ma,double eg,double av,double s); void delet(); void alter(); void input(); void search(); void Sort(); void show(); }; #endif 你加上这个编译的到了 不过 一大堆错误的... 我试了下 写成这样可以排序 void student::Sort () { sort(s,s+i); } 但我看不明白你的 std::sort[/quote] 这种排序用的是指针存储的内存地址值,没用的。 你有没有试试 #10 的代码,能不能按 average 降序排列 student* ?[/quote] #10的代码连编译都过不了 有错误呃[/quote] 嗯,是我写错了,不用编译器果然还是不行,容易忘事。这回这个编译过了。


#include <algorithm>
void student::Sort()
{
 struct
 {
  bool operator () (student const* x, student const* y) const
  {
   return x->average > y->average;
  }
 } average_descending_comp;
 std::sort(&s[0],&s[0]+50,average_descending_comp);
}
[/quote] 我有点懂你的意思了 但是编译还是错 error C2627: member function defined in unnamed class error C2919: illegal use of anonymous local type in template instantiation error C2780: 'void __cdecl std::sort(_RI,_RI)' : expects 2 arguments - 3 provided \vc98\vc98\include\algorithm(538) : see declaration of 'sort' 我是用vc的
加载更多回复(9)

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧