C言語関係掲示板

過去ログ

No.204.氏名をローマ字で入力し、アルファベット順に出力


No.1277

プログラムが分かりません
投稿者---zeros(2002/03/18 20:50:14)


1月ぐらいからC言語の勉強をはじめたのですがちょっと分からない問題があるのでぜひ教えてもらえませんか?その問題とは、
[問]氏名をローマ字で入力し、アルファベット順に出力する。入力中に入力件数を表示し20件目の入力または!が入力されたら終了とする。


No.1279

Re:プログラムが分かりません
投稿者---C職人(2002/03/18 22:35:01)


>1月ぐらいからC言語の勉強をはじめたのですがちょっと分からない問題があるのでぜひ教えてもらえませんか?その問題とは、
>[問]氏名をローマ字で入力し、アルファベット順に出力する。入力中に入力件数を表示し20件目の入力または!が入力されたら終了とする。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define MAX_KAISU 20

char *sort(char *p);

int main(void)
{
char name[256];
char *retName;
int cnt=0;

do{
cnt++; /*件数カウンタ*/
printf("%d件目:氏名をローマ字で入力してください。\n",cnt);
gets(name);

/*ソート関数コール*/
retName=sort(name);
/*'!'が入力されたら、終了する*/
if(retName==NULL){
return 1;
}

/*デバッグ用*/
printf("%s\n",retName);
}while(cnt < MAX_KAISU);

return 0;

}

char *sort(char *p)
{
int i=0,j=0;
int len=0;
int wk; /*ワークエリア*/

/*先頭が'!'か判断*/
if((*p) == '!'){
return NULL;
}

/*入力した文字列の長さを取得*/
len=strlen(p);

for(i=0;i<len;i++){
/*アルファベットでないなら、0を返す*/
if(isalpha(p[i])==0){
fprintf(stderr,"アルファベット以外の文字が入力されています。\n");
exit(1);
}
}

/*ソート処理*/
for(i=0;i < len-1;i++){
for(j=0;j < len-1;j++){
if(p[j] > p[j+1]){
wk=p[j];
p[j]=p[j+1];
p[j+1]=wk;
}
}
}

/*ソートした結果を返す*/
return p;
}

上記のような感じでしょうか。
ソートの処理が原始的でもっと効率のいいやり方があるはずです。



No.1280

Re:プログラムが分かりません
投稿者---かずま(2002/03/18 23:26:48)


> [問]氏名をローマ字で入力し、アルファベット順に出力する。入力中に
> 入力件数を表示し20件目の入力または!が入力されたら終了とする。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int compare(const void *a, const void *b)
{
    return strcmp(*(char **)a, *(char **)b);
}

int main()
{
    char name[256], *table[20], *p;
    int i, n;

    for (n = 0; n < 20; n++) {
        if (fgets(name, sizeof name, stdin) == NULL || name[0] == '!')
            break;
        if (p = strchr(name, '\n'))
            *p = '\0';
        table[n] = strdup(name);
    }
    qsort(table, n, sizeof(char *), compare);
    for (i = 0; i < n; i++)
        puts(table[i]);
    return 0;
}



戻る


「初心者のためのポイント学習C言語」 Last modified:2002.05.26
Copyright(c) 2000-2002 TOMOJI All Rights Reserved