求助一道C 语言题!!对的给高分!!

任意给定一个字符串s,将s中的各字母按照字典顺序排序形成新的字符串t,依次输出t中字符在原字符串s中的前一位
如exam 排序后为aemx
a的前一位是x,e的前一位是m ,m的前一位是a, x的前一位是e
最后输出xmae

我觉得~~~应该先输出每个字符的前一位后再排序···
不然就是自己找麻烦事儿来做~···追问

呵呵~~可以认为是自己找麻烦~~不过输出每个字符的前一位后再排序还有什么意义呢

追答

帅哥~~尽管开始对你问题有点误会,但看在我手写代码,还帮你调试通过,并且实验几组数据输出都正确的份儿上,给是该选我勒?

这个代码是在 VS2010下通过编译并运行了的,函数 paixu返回的string数组,第一个是排序后的数组,第二个是排序后 每个字符在原数组中的前一个字符所组成的数组。

#include "stdafx.h"
#include
#include
using namespace std;

string* paixu(string str, string prefix);
void myswap(char &a,char &b);
string rightshift(string str);

int _tmain(int argc, _TCHAR* argv[])
{
string p;
cout > p;
cout 0 ; i--)
{
r[i] = r[i-1];
}
r[0] = tmp;
return r;
}

参考资料:要多谢 panweiy 兄台的提示~~同步排序~~呵呵

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-06
/*完全符合你的功能要求了,主要是在字典序冒泡排序时,对结果数组也进行排序。最终同步*/
/*至于楼上的说法,都是瞎扯的,不一对一的同步排序,怎么能保证正确性,比如“usbsa”,尼玛用搜索能行吗? s对应什么?不能保证唯一性,所以我这个同步排序移动的算法是最佳的!!不服的就说*/
#include<stdio.h>
#include<string.h>
void Swap( char & a, char &b )
{
char c = a;
a = b;
b = c;
}

void Sort(char b[] ,char c[])
{
int i,j,k=1,n;
char d;
n = strlen(b);
for( i = n-1 , d = c[n-1] ; i > 0 ; i-- )
{
c[i] = c[i-1];
}
c[i] = d;
for( i = n-1; i >0 ; i-- )
{
k=0;
for( j = 0 ; j <i ; j++ )
{
if( b[j] > b[j+1] )
{
k = 1;
Swap(b[j],b[j+1]);
Swap(c[j],c[j+1]);
}
}
if( !k )
{
break;
}
}
}

int main()
{
char s[1000],t[1000],r[1000];
puts("请输入字符串");
while( gets(s) )
{
puts("\n源字符串s:");
puts(s);
strcpy(t,s);
strcpy(r,s);
Sort(t,r);
puts("\n排序后字符串t:");
puts(t);
puts("\nt中字符在原字符串s中的前一位:");
puts(r);
}
return 0;
}

/*
请输入字符串
exam

源字符串s:
exam

排序后字符串t:
aemx

t中字符在原字符串s中的前一位:
xmae
*/
第2个回答  2011-06-06
呵呵,学c++吧
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
int main()
{
char ch[100];
cin>>ch;
int len=strlen(ch);
stable_sort(ch,ch+len,greater<int>());
cout<<ch<<endl;
system("pause");
return 0;
}
第3个回答  2011-06-06
//希望对楼主有小小的帮助
#include<stdio.h>
#include<string.h>
void main()
{
//定义字符串strings存放用户输入字符串,strings2存放前一个字符形成的新字符串。
char strings[200],strings2[200];
//接受用户输入,gets是个<stdio.h>定义函数,用于接受字符串。
gets(strings);
//根据原字符串string,赋值前一个字符的字符串string2
//strlen是<string.h>定义函数,返回字符串长度。
if(strlen(strings)!=0)
strings2[0]=strings[strlen(strings)-1];
//strncpy是个<string.h>定义的字符串拷贝函数,第一个参数是目标字符串地址,
//第二个参数是拷贝源字符串地址,第三参数是拷贝的字符串个数。
strncpy(strings2+1,strings,strlen(strings)-1);
strings2[strlen(strings)]='\0';
//根据原字符串string,排序(根据ASCII码,如'a'<'b'),strings2跟着联动。
//minvalue_index存放最小值的下标,
//temp,tmep2分别是strings,strings2排序赋值中用到的临时值。
//对于排序算法如果有不明白的,可以追问,我们可以再探讨。。。
int minvalue_index,temp,temp2;
for(int index1=0;index1<strlen(strings);++index1)
{
//minvalue_index赋初值
minvalue_index=index1;
for(int index2=index1+1;index2<strlen(strings);++index2)
{
// 如果当前值比最小值还小,则将当前值设置最小值
if(strings[index2]<strings[minvalue_index])
minvalue_index=index2;
}
//将最小值与本次查询的字符串首字符进行兑换。strings2跟着联动。
if(minvalue_index!=index1)
{
temp=strings[index1];
temp2=strings2[index1];
strings[index1]=strings[minvalue_index];
strings2[index1]=strings2[minvalue_index];
strings[minvalue_index]=temp;
strings2[minvalue_index]=temp2;
}
}
//输出排序后的原字符串string,和排序后的前一个字符的字符串string2
//puts是个<stdio.h>定义函数,用于输出字符串。
puts(strings);
puts(strings2);
}
第4个回答  2011-06-08

我也尝试了下,(C初学者,大一新生,请大家多多指教!)对于这个题我遇到的最大的问题是 除法,如果是除不清的,如0.33333333333
.....你怎么来验证它的正确与否,在这提出来,望各位大侠指教指教!
(还有对于一楼的,在C(printf语句中的)-中能显示出汉字吗?即使能显示 恐怕 也要加些什么东西吧! 如果有什么不对的地方请指正,谢谢)!
我也写了个代码,但是在运行除法时会出错,还望各位高手指教!!!!!!!谢谢

#include <stdio.h>
#include <math.h>
void main()
{
int i,n,j,o,f; /*i,j,是做循环的变量,f是记录正确的题数,o我用来对应随即产生的是除法还是加减等,N是你要多少题如30道等*/
char x[4]=;/*X[]我用随即产生的o来表达给用户是做的什么计算*/
int s;/*S是结果*/
int a[100],b[100];/*用a[]b[]来装产生的数*/
srand(time(100));/*随机数的一个条件*/
clrscr();
f=0;
o=0;
s=0;/*这是赋初值*/
printf("please input the subject number is ");
scanf("%d",&n);/*输入题数N*/
for(i=0;i<=n;i++)
{
b[i]=rand()/32767.0*29+1;
a[i]=rand()/32767.0*29+1;/*产生随机数*/
}

for(j=0;j<=n-1;j++)
{
o=rand()/32767.0*3+1;
printf("\n%d %c %d=",a[j],x[o],b[j]);/*表达给用户一个计算表达式*/
scanf("%d",&s);/*输入结果*/
if(o=0 && a[j]+b[j]==s)
{
printf("right");/*如果答案正确则显示出 right,错了则不显示,这里可以写的更细*/
f=f+1;
}
if(o=1 && a[j]-b[j]==s)
{
printf("right");
f=f+1;
}
if(o=2 && a[j]*b[j]==s)
{
printf("right");
f=f+1;
}
if(o=3 && a[j]/b[j]==s)
{
printf("right");
f=f+1;
}
}
printf("\nThe answer right is %d",f);/*对的题数*/
getch();
}
我也是初学,望各位大侠多多指教!特别是除法那的问题,谢谢
if(o=3 && (int)(a[j]/b[j])==(int)s) 我想过除法这样,但是这样没法真正判断它的正误!
第5个回答  2011-06-11
我也尝试了下,(C初学者,大一新生,请大家多多指教!)对于这个题我遇到的最大的问题是 除法,如果是除不清的,如0.33333333333
.....你怎么来验证它的正确与否,在这提出来,望各位大侠指教指教!
(还有对于一楼的,在C(printf语句中的)-中能显示出汉字吗?即使能显示 恐怕 也要加些什么东西吧! 如果有什么不对的地方请指正,谢谢)!
我也写了个代码,但是在运行除法时会出错,还望各位高手指教!!!!!!!谢谢

#include <stdio.h>
#include <math.h>
void main()
{
int i,n,j,o,f; /*i,j,是做循环的变量,f是记录正确的题数,o我用来对应随即产生的是除法还是加减等,N是你要多少题如30道等*/
char x[4]=;/*X[]我用随即产生的o来表达给用户是做的什么计算*/
int s;/*S是结果*/
int a[100],b[100];/*用a[]b[]来装产生的数*/
srand(time(100));/*随机数的一个条件*/
clrscr();
f=0;
o=0;
s=0;/*这是赋初值*/
printf("please input the subject number is ");
scanf("%d",&n);/*输入题数N*/
for(i=0;i<=n;i++)
{
b[i]=rand()/32767.0*29+1;
a[i]=rand()/32767.0*29+1;/*产生随机数*/
}

for(j=0;j<=n-1;j++)
{
o=rand()/32767.0*3+1;
printf("\n%d %c %d=",a[j],x[o],b[j]);/*表达给用户一个计算表达式*/
scanf("%d",&s);/*输入结果*/
if(o=0 && a[j]+b[j]==s)
{
printf("right");/*如果答案正确则显示出 right,错了则不显示,这里可以写的更细*/
f=f+1;
}
if(o=1 && a[j]-b[j]==s)
{
printf("right");
f=f+1;
}
if(o=2 && a[j]*b[j]==s)
{
printf("right");
f=f+1;
}
if(o=3 && a[j]/b[j]==s)
{
printf("right");
f=f+1;
}
}
printf("\nThe answer right is %d",f);/*对的题数*/
getch();
}
我也是初学,望各位大侠多多指教!特别是除法那的问题,谢谢
if(o=3 && (int)(a[j]/b[j])==(int)s) 我想过除法这样,但是这样没法真正判断它的正误!
相似回答