原題如下:
本題要求編寫(xiě)程序港柜,將給定字符串去掉重復(fù)的字符后,按照字符ASCII碼順序從小到大排序后輸出咳榜。
輸入格式:
輸入是一個(gè)以回車(chē)結(jié)束的非空字符串(少于80個(gè)字符)夏醉。
輸出格式:
輸出去重排序后的結(jié)果字符串。
算法思路
1.關(guān)于讀入字符串讀入有兩種方法:一種一次直接讀入贿衍,第二種逐個(gè)字符讀入授舟。
使用scanf函數(shù)時(shí)注意字符串中的空格。這里我使用的字符串函數(shù)gets贸辈。
2.關(guān)于去重和排序的兩種方法:先去重后排序第二種邊去重邊排序释树。
3.關(guān)于輸出注意用puts和printf輸出時(shí)兩者的的差別肠槽。
我的算法:
- 利用兩個(gè)字符數(shù)組一個(gè)讀入字符串,另一個(gè)存儲(chǔ)去重排序后的字符串奢啥。
- 邊去重邊排序的方法秸仙。如果一個(gè)字符不在數(shù)組中執(zhí)行插入。
- 輸出去重排序后的字符串桩盲。
- 我這里的第二個(gè)數(shù)組一直是排好序的可以直接插入和輸出寂纪。否則需要先對(duì)第二數(shù)組進(jìn)行排序再輸出。
代碼參考:
主要的地方我已經(jīng)在算法思路和程序中利用注釋進(jìn)行了說(shuō)明赌结。就不在這里贅述了捞蛋。
#include <stdio.h>
#include <string.h>
main()
{
char a[80],b[80];
int lenb = -1;//第二個(gè)數(shù)組中字符的個(gè)數(shù)
// scanf("%s",a);
gets(a);
// printf("%s\n",a);
for(int i = 0; i < strlen(a);i++)
{
int r = 1;//先假設(shè)不在數(shù)組中
//如果字符小于數(shù)組中的某個(gè)字符直接插入。
for (int j = 0;j <= lenb;j++)
{
if ((int)a[i] < (int)b[j])
{
lenb++;
for(int l = lenb; l > j;l--)
{
b[l] = b[l-1];
}
b[j] = a[i];
r = 0;//這里已經(jīng)將字符插入所以r=0表示字符已經(jīng)在數(shù)組中了柬姚。
break;
}
else if ( a[i] == b[j])
{
r = 0;
break;
}
}
if (r = 1)
{
lenb++;
b[lenb] = a[i];
}
}
b[lenb+1] = '\0';
puts(b);//puts函數(shù)只能輸出‘\0’結(jié)尾的字符串拟杉。
}