c語言單詞排序
Ⅰ 用c語言編寫一個將若干單詞按字母排序的程序 請各位高手幫忙
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define FILENAME "c:\\a.txt" /*存放單詞的文本文件,可以在此修改路徑*/
char *readln(FILE *fp) /*從文件fp中讀取一行(一個)單詞,保存到字元數組中,返回字元數組的地址,返回NULL說明文件讀取已經結束*/
{
char *wd=NULL,c;
int n=0;
if ((c=fgetc(fp))!=EOF) {
wd=(char*)malloc(sizeof(char));
if (!wd) return NULL;
*wd=c;
++n;
while ((c=fgetc(fp))!='\n'&&c!=EOF)
{
wd=(char*)realloc(wd,sizeof(char)*++n);
wd[n-1]=c;
}
wd=(char*)realloc(wd,sizeof(char)*++n);
wd[n-1]='\0';
}
return wd;
}
int cmp(const void *a,const void *b) /*根據字母順序比較兩個單詞字元串的大小*/
{
int i=0,j=0;
const char *as=*(const char **)a;
const char *bs=*(const char **)b;
while (as[i]&&bs[j])
if (tolower(as[i])==tolower(bs[j])) {
++i;
++j;
}
else break;
return tolower(as[i])-tolower(bs[j]);
}
void freewds(char **a,const int n) /*釋放佔用的空間*/
{
int i;
for (i = 0; i<n; i++) {
free(a[i]);
}
free(a);
}
int main(void)
{
char **wds=NULL,*line=NULL;
int i,n=0;
FILE *fp=fopen(FILENAME,"r");
if (!fp) {
fprintf(stderr,"FILE NOT FOUND\n");
return -1;
}
while (line=readln(fp),line) /*將文件中的單詞讀取到wds數組中*/
{
if (!wds) {
wds=(char **)malloc(sizeof(char*));
n=1;
}
else wds=(char **)realloc(wds,sizeof(char*)*(++n));
wds[n-1]=line;
}
fclose(fp); /*關閉文件*/
qsort(wds,n,sizeof(char*),cmp); /*對單詞進行排序,不區分大小寫*/
for (i = 0; i<n; i++) { /*輸出排序後的結果*/
puts(wds[i]);
}
freewds(wds,n);
return 0;
}
//---------------------------------------------------------------------------
Ⅱ c語言單詞排序
程序第一次運行時,會創建一個「word.txt」(不包括引號)的文本文件,然後要求輸入單詞。若要退出,請不要點DOS窗口的小叉叉,輸入d即可。因為程序在結束之前,對數組中的單詞重新排序,並存儲到文件中。 #include "stdio.h"---
#include "stdlib.h" ---為exit()函數提供原型; #include "string.h"---字元串處理函數原型; #include "ctype.h"---字元處理函數原型; #define ROWS 256
#define COLS 32---定義「字典」的大小:可存放256個單詞,每個單詞的長度不超過31
static FILE *fp;---定義文件指針:內部鏈接,文件作用域;
static char a[ROWS][COLS];---定義數組:內部鏈接,文件作用域;該數組的作用是將文件的內容復制進來,並加以處理。因為處理數組比處理文件方便。
char get_option(void);---接收用戶的選項,防止誤操作。若輸入「a;」(不包括引號),那麼將視為選項a
int b(int count);---完成選項b的作用--接收新單詞;
void c(char *pt[], int count);---完成選項c的作用--通過指針對數組排序,實際數組元素位置未改變;
int check(char arr[], int count);---對輸入的單詞進行分辨,若輸入 ni hao ,將視為單詞 ni ,並且提示並剔除重復的單詞;
void storage(char *pt[], int count);---在程序結束之前重新排序存儲數組中的單詞到文件中。
#include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #define ROWS 256 #define COLS 32 static FILE *fp;
static char a[ROWS][COLS]; char get_option(void); int b(int count);
void c(char *pt[], int count); int check(char arr[], int count); void storage(char *pt[], int count); int main(void) {
int i,count; int start;
char *pt[ROWS]; char ch, len; char input;
if((fp=fopen("words.txt","a+"))==NULL) {
fputs("不能打開或建立文件!\n",stderr); exit(1); }
fseek(fp,0L,SEEK_END); start=(int)ftell(fp)/32; count=start; rewind(fp);
if(fread(a,32*sizeof(char),start,fp)==0) { i=0;
puts("開始創建詞庫");
puts("請輸入單詞(每行一個)");
puts("在新行輸入END結束輸入:"); while(i<ROWS&&scanf("%s", a[i])==1) {
fflush(stdin);
if(strncmp(a[i],"END",3)==0) {
count+=i; break;
}
if(check(a[i], i)) continue; i++; } }
puts("\t\t*********************歡迎使用字典排版系統*******************\n\n");
puts(" MENU "); puts("您要做些什麼?");
puts("a. 顯示已有的單詞 b. 添加新單詞"); puts("c. 對已有的單詞進行排序 d. 退出");
puts("\n\n\t\t**********************************************************\n"); while((input=get_option())!='d')
{
if(input=='a') { puts("已有的單詞:"); for(i=0;i<count;i++)
{
printf(" "); puts(a[i]); } }
if(input=='b')
{
puts("開始創建詞庫");
puts("請輸入新的單詞(每行一個)"); puts("在新行輸入END結束輸入: "); count=b(count); }
if(input=='c') {
puts("對單詞進行排序:"); c(pt, count);
for(i=0;i<count;i++) {
printf(" "); puts(pt[i]); } }
puts("還要做些什麼?"); }
storage(pt,count); fclose(fp);
puts("謝謝使用,再見!");
return 0; }
char get_option(void) {
char ch;
while((ch=getchar())<'a'||ch>'d') {
while((ch=getchar())!='\n') ;
puts("請輸入a,b,c或者d."); }
fflush(stdin);
return ch; }
int b(int count) { int i;
i=count;
while(i<ROWS&&scanf("%s", a[i])==1) {
fflush(stdin); if(check(a[i], i)) continue;
if(strncmp(a[i],"END",3)==0) {
count=i; break; } i++; }
return count; }
void c(char *pt[], int count) { int i,j;
char *temp;
for(i=0;i<ROWS;i++) pt[i]=a[i];
for(i=0;i<count;i++) for(j=i+1;j<count;j++) {
if(strcmp(pt[i],pt[j])>0) {
temp=pt[i]; pt[i]=pt[j]; pt[j]=temp; } } }
int check(char arr[], int count) { int i;
int flag=0;
for(i=0;i<strlen(arr);i++) if(isalpha(arr[i])==0) {
printf("%s不是一個單詞.\n",arr); flag=1; break; }
for(i=0;i<count;i++)
if(strncmp(a[i],a[count],strlen(a[count])+1)==0) {
puts("重復的單詞!"); flag=1; }
return flag; }
void storage(char *pt[], int count) { int i,j;
char ptr[ROWS][COLS];
c(pt, count);
for(i=0;i<count;i++)
for(j=0;pt[i][j]!='\0';j++) ptr[i][j]=pt[i][j];
fp=fopen("words.txt","w+"); rewind(fp);
fwrite(ptr,32*sizeof(char),count,fp); }
Ⅲ C語言計算單詞的長度並排序
雖然有很多問題,但是根據上面的邏輯下面的應該改成這樣的了.
while(*n[i]!=' ')
{
d++;
//n++
}
while(*n[top]!=' ')
{
c++;/////////
//n++
}
然後還有問版題的話,把整個權程序放來,我並不清楚你的單詞是怎樣存儲的.
Ⅳ c語言 單詞先按長度排序再按字母表排序
不知道你意思表達清抄楚了沒,「首字母相同時按字母表順序排列」,這句話是不是表達錯了,是不是應該是若字元串長度相等時按首字母大小排序,,,,我這按升序排的,輸入多少個字元串有define決定,可自己定義,
Ⅳ c語言 英文單詞排序(函數版)
說明:原題目中復的制const要刪除,否則過不了編譯。因為const了就不能排序了…… #include #include "string.h"int GetWords(char *sentence, char *words[]);void SortStrings(char *strs[], int count);//const int main(int argc,char *argv[]){ char str[200]; int nWords = 0; char *words[20]; int i; printf("input a string: "); gets(str); nWords = GetWords(str,words); SortStrings(words, nWords); puts("output:"); for(i=0;i0) k=j; if(k-i) p=strs[i],strs[i]=strs[k],strs[k]=p; } /******end******/} 執行結果如下:
Ⅵ 提取英文句子中的單詞並排序輸出 c語言
#include<stdio.h>
#include<string.h>
intGetWords(char*sentence,char*words[]);
voidSortStrings(char*strs[],intcount);
intmain()
{
charstr[200];
intnWords=0;
char*words[20];
inti;
printf("inputastring:");
gets(str);
nWords=GetWords(str,words);
SortStrings(words,nWords);
puts("output:");
for(i=0;i<nWords;i++)
{
puts(words[i]);
}
return0;
}
intGetWords(char*sentence,char*words[])
{
/******start******/
inti=0;
char*p;
p=strtok(sentence,",.");
while(p!=NULL)
{
[i]=p;
i++;
p=strtok(NULL,",.");
}
returni;
/******end******/
}
voidSortStrings(char*strs[],intcount)
{
/******start******/
char*p;
inti,j,k;
for(i=0;i<count;i++){
for(j=i+1;j<count;j++)
{
if(strcmp(strs[i],strs[j])>0)
{
p=strs[i];
strs[i]=strs[j];
strs[j]=p;
}
}
}
/******end******/
}
Ⅶ C語言編程:英文單詞怎麼按A~~z的方法排序
/*字元串冒泡排序,以輸入的字元串為空格為結束*/
#include <stdio.h>
#include <string.h>
#define MAXNUM 5
#define MAXLEN 20
main()
{
char s1[MAXNUM][MAXLEN],max[MAXLEN];
int num=MAXNUM,i,j,exchange;
for (i=0;i<num;i++)
{
printf("請輸入第%d個單詞:\n",i+1);
gets(s1[i]);
}
for (i=0;i<num;i++) //按冒泡排序法排序
{
exchange=0;
for(j=0;j<num;j++)
if (strcmp(s1[j],s1[j+1])>0)
{
strcpy(max,s1[j]);
strcpy(s1[j],s1[j+1]);
strcpy(s1[j+1],max);
exchange=1;
}
if(!exchange)
break;
}
printf("按大小輸出單詞:\n");
for (i=0;i<num;i++)
printf("%s\n",s1[i]);
}
Ⅷ c語言 怎樣將一個英語單詞的字母按字典順序排序
其實和一組數字排序是一樣的道理
用冒泡法給你寫個例子,你可版以參權考參考。
#include <stdio.h>
#include <string.h>
main()
{
char a[20];
int i,j,str;
char ch;
printf("input a word:\n");
scanf("%s",a);
str=strlen(a);
for(i=0;i<str;i++)
{
for(j=0;j<str-1-i;j++)
{
if(a[j]>a[j+1])
{
ch=a[j];
a[j]=a[j+1];
a[j+1]=ch;
}
}
}
printf("%s\n",a);
}
Ⅸ c語言 輸出單詞的順序
#include<stdio.h>
#include<string.h>
intmain(intargc,char**argv)
{
intgroup_number=0;
scanf("%d",&group_number);
char***input;
input=newchar**[group_number];
int**order;
order=newint*[group_number];
int*sample_number;
sample_number=newint[group_number];
for(inti=0;i<group_number;i++)
{
scanf("%d",&sample_number[i]);
input[i]=newchar*[sample_number[i]];
for(intj=0;j<sample_number[i];j++)
{
input[i][j]=newchar[100];
}
for(intj=0;j<sample_number[i];j++)
{
scanf("%s",input[i][j]);
}
order[i]=newint[sample_number[i]];
for(intj=0;j<sample_number[i];j++)
{
order[i][j]=j;
}
//按照預定的規則進行排序
for(intj=0;j<sample_number[i]-1;j++)
{
boolchange=false;
for(intk=sample_number[i]-1;k>=1+j;k--)
{
if(strlen(input[i][k])>strlen(input[i][k-1]))
{
inttemp;
temp=order[i][k];
order[i][k]=order[i][k-1];
order[i][k-1]=temp;
}
elseif(strlen(input[i][k])==strlen(input[i][k-1]))
{
intlen=strlen(input[i][k]);
boolequal_change=false;
for(intq=0;q<len;q++)
{
if(input[i][k][q]<input[i][k-1][q])
{
equal_change=true;
break;
}
}
if(equal_change)
{
inttemp;
temp=order[i][k];
order[i][k]=order[i][k-1];
order[i][k-1]=temp;
}
}
}
if(!change)
{
break;
}
}
}
//輸出結果
for(inti=0;i<group_number;i++)
{
printf("Case%d: ",i+1);
for(intj=0;j<sample_number[i];j++)
{
printf("%s ",input[i][order[i][j]]);
}
delete[]order[i];
for(intj=0;j<sample_number[i];j++)
{
delete[]input[i][j];
}
delete[]input[i];
}
delete[]input;
delete[]order;
delete[]sample_number;
}