Pascal 字符串排序
是的 已经很接近了, 只差一点,在输出上。
直接%s输出shmily就好了。。。
#include#include#define Max 100int main(){ char shmily[Max]; int count; int i,j,k,empty; printf("请输入字符串:
"); scanf("%s",shmily); count=strlen(shmily); for(i=0;i<count-1;i++) { k=i; for(j=i+1;j<count;j++) { if(shmily[j]<shmily[k]) { k=j; } } if(k!=i) { empty=shmily[k]; shmily[k]=shmily[i]; shmily[i]=empty; } } printf("按照ASCII表重新排列为:%s
",shmily); return 0;}
自己做strcmp和strcpy子函数,或者把能实现相同功能的子函数模块用for循环来处理
strcmp子函数的功能是比较str1和str1字符串的每个字符
用一个for循环来实现这个功能的
功能实现,模拟着函数
void mystrcmp(char *str1,char *str2)
{
int i;
for(i=0;str1[i]||str2[i];i++)
if(str1[i]<str2[i])
retrun -1;
else if(str1[i]>str2[i])
return 1;
return 0;
}
strcpy拷贝子函数也是用一个for循环来实现的
void mystrcpy(char *str1,char *str2)
{
int i=0;
while(str1[i]=str2[i])
i++;
}
你完全可以把这个功能模块用着相应的位置
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
排序大循环没问题
for(;k<l;k++)
{
if(*(str[i]+k)!=*(str[j]+k)) //你这里只是判断了不相等的情况,大小没有判断
这一块应该是比较部分吧,感觉应该不对
应该是
for(k=0;str[i][k]||str[j][k];k++)
{
if(str[i][k]>str[j][k]) //也可以用指针,大了就交换,小了或等于不交换
交换代码
}
l=min(strlen(str[i]),strlen(str[j]));
这一句完全可以用l=strlen(str[i])>strlen(str[j])?strlen(str[i]):strlen(str[j]);
不用子函数,或者一个if--else来解决
temp=str[j];
str[j]=str[i];
str[i]=temp;
这是交换的代码,字符串不能这么交换,可以用strcpy拷贝函数,或者字符一个一个的交换
不能整个字符串用=来赋值
s1:='abc'; s2:='bax';
if (s1>s2) then .......
在计算机内部执行时是这样的:
从第一位开始按位比较两个字符串的第一位,第二位,第三位……的Ascal码
若在比较过程中有其中一个字符串的某个字符大于另一个,则判断该字符串大,
如果一直比较到较短串的末尾一直一样,那么判断长串大于短串
例如在比较abc 和 abd 时是这样执行的
先比较两个字符串的第一位 即 a 和 a 发现相同 再比较第二位b 和b 发现又相同,
再比较第三位 c 和 d 此时c的Ascal码小于d的,故判断第一个串小
这里给一个快排的代码:
var
s:array[1..1000] of string;
n,i:longint;
procedure sort(l,r:longint);
var
i,j:longint;
x,y:string;
begin
i:=l; j:=r; x:=s[(l+r) div 2];
repeat
while s[i]<x do inc(i);
while x<s[j] do dec(j);
if not(i>j) then
begin
y:=s[i];
s[i]:=s[j];
s[j]:=y;
inc(i); dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
writeln;
writeln('Please input the number of the names:');
readln(n);
writeln('Please input the names:');
for i:=1 to n do readln(s[i]);
sort(1,n);
writeln;
for i:=1 to n do writeln(s[i]);
readln;
end.
var
i,j,k,n:longint;
a:array[1..1000]of string;
procedure qsort(s,t:longint);
var i,j:longint; q,m:string;
begin
i:=l; j:=r; m:=a[random(t-s+1)+s];
repeat
while a[i]<m do inc(i);
while a[j]>m do dec(j);
if i<=j then begin
q:=a[i]; a[i]:=a[j]; a[j]:=q; inc(i); dec(j); end;
until i>j;
if s<j then qsort(s,j);
if i<t then qsort(i,t);
end;
begin
randomize;
readln(n);
for i:=1 to n do readln(a[i]);
qsort(1,n);
for i:=1 to n do writeln(a[i]);
end.
随机化快排版
快速排序:var
a:array[1..10000] of ansistring;
n:longint;
procedure init;
var
i:longint;
begin
readln(n);
for i:=1 to n do readln(a[i]);
end;
procedure swap(var s1,s2:ansistring);
var
s3:ansistring;
begin
s3:=s1;
s1:=s2;
s2:=s3;
end;
procedure sort(r,l:longint);
var
i,j:longint;
c:ansistring;
begin
i:=r;
j:=l;
c:=a[random(j-i+1)+i];
repeat
while a[i]<c do inc(i);
while a[j]>c do dec(j);
if not(i>j) then
begin
swap(a[i],a[j]);
inc(i); dec(j);
end;
until i>j;
if i<l then sort(i,l);
if j>r then sort(r,j);
end;
procedure ou;
var
i:longint;
begin
for i:=1 to n do writeln(a[i]);
end;
begin
init;
randomize;
sort(1,n);
ou;
end.冒泡排序:var
a:array[1..10000] of ansistring;
n,i,j:longint;
c:ansistring;
begin
readln(n);
for i:=1 to n do readln(a[i]);
for i:=1 to n do
for j:=i to n do
if a[i]>a[j] then
begin
c:=a[i];
a[i]:=a[j];
a[j]:=c;
end;
for i:=1 to n do writeln(a[i]);
end.
= =这答案我试过了 是错误的
从键盘上输入一个字符串,将该字符串重新按ASCII码从大到小顺序输出...
{ int i,r,j;char str[1024];printf("输入字符串\\n");for (i = 0; i < 256; i ++)ascii[i] = 0; \/\/ 清零 scanf("%s",str);r = strlen(str);for (i = 0; i < r; i ++){ ascii[str[i]] ++; \/\/ char 自动转换成int 类型 } printf("字符串从大到小排序\\n");f...
C语言输入一个字符串按其ASCII码由大到小排
include <stdio.h>#include <stdlib.h> int main(){ char string[100]; printf("Enter string:\\n"); gets(string); int length=strlen(string); int num[100]; int i; for(i=0;i<length;i++) { num[i]=toascii(string[i]); } int j; int k; int temp...
为什么“广的ASCII码小于“5”?
因为字符串排序是根据字符串中最靠前字符的ASCII码值的大小进行的,“广的ASCII码小于“5”的ASCII码,所以“12”排在“5”前面。字符串由数字、字母、下划线组成,一般记为s=“a1a2···an”(n>=0)。在程序设计中,字符串为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(...
C语言输入一个字符串,将字符串中所有字符按ASCII码升序排列后输出。若...
对字符串中所有字符按ASCII码升序排列,本质上就是对字符数组排序,你给的答案用的是冒泡排序,它的基本原理是每次检查相邻的两个数,如果不满足升序,交换相邻的两个数。如果按照你说的把第五行改成i=strlen(t)-1,那么第6行的循环只会循环1次(j从0~i-1)然而这样循环完成一次之后,只能保证最后...
使用选择法将字符串按ASCII值从小到大排列
\/\/你要的是这样的吗???#define N 26#include <stdio.h>void fun(char str[]);int main(){ int i,j; char str[N]; for (i=0;i<N;i++) scanf("%c",&str[i]); fun(str); for (i=0;i<N;i++)\/\/输出也要加循环 printf("%c ",str[i]);}...
将字符串中的字母的ASCII码升序排序C++
include<stdio.h>#include<string.h>int main(){ char s[150],c; int i,j; gets(s); for(i=0; i<strlen(s)-2; i++) for(j=0; j<strlen(s)-2-i; j++) if(s[j]>s[j+1]) { c=s[j]; s[j]=s[j+1]; s[j+1]=c; } puts(s); ret...
c语言 任意输入一个字符串,按ASCII码值从小到大从新排列
include <stdio.h> include <stdlib.h> void fun(char* ch){ int min;char tmp;for( int i=0; ch[i+1]; ++i ){ min=i;for( int j=i; ch[j]; ++j)if( ch[min] > ch[j] )min = j;if( min!=i ){ tmp = ch[min];ch[min] = ch[i];ch[i] = tmp;} } } int...
ascii码已知坐标怎么分最低位
查找字符串。1、按照ASCII码值从小到大进行排序。2、查找字符串中第K个最小ASCII码值的字母。3、输出该字母所在字符串中的位置索引字符串的第一个位置索引为0。
用C语言编程,将字符串s中的所有字符按ASCII值从小到大重新排序后,将排...
代码如下:include <stdio.h>#include <string.h>int main(){char str[] = "Hello World!", ch;int i, j, len;len = strlen(str);for (i = 0; i < len - 1; i++) {for (j = i + 1; j < len; j++) {if (str[i] > str[j]) {ch = str[i];str[i] = str[j...
用Java编写程序对字符串 按字符的ASCII值排序,并统计各种字符的个数...
\/ public static void main(String[] args) { \/\/ TODO Auto-generated method stub \/\/ 测试结果 String str = "68765Shfsa*3219(6faylahjyAbo81av)tiA52N<6#6&0_84";str = sort(str);\/\/ 字符串排序 System.err.println(str);\/\/ 打印结果 statistic(str);\/\/ 统计各类字符数目 } } ...