
いつもお世話になっています。
皆様には、本当にお世話になっています。
先日、皆様にアドバイスをいただいたのですが、私の勉強不足で結局・・・並び替えて表示できなかったです。
大変申し訳ないのですが、どこがダメなのか教えてください。
/********************/
/*--- 英単語辞書 ---*/
/********************/
#include<stdio.h>
#include<string.h>
#defineNUMBER50/*登録数*/
#defineMAX_NAME20/*単語の最大文字数*/
#defineMAX_WAYAKU30/*和訳の最大文字数*/
/************************/
/*--- 単語帳の構造体 ---*/
/************************/
typedef struct {
charname[MAX_NAME];/*単語*/
charwayaku[MAX_WAYAKU];/*和訳*/
}words;
/***********************************************/
/*----- 単語の交換 -----*/
/***********************************************/
void swaps(words x, words y)
{
words temp = x;
temp = x;
x = y;
y = temp;
}
/************************************************/
/*------ 単語と和訳の登録 ------*/
/* 関数tourokuword()は引数words tango[]の、イン*/
/*クリメントしたtango_counの順番に格納する。 */
/************************************************/
void tourokuword(words tango[], int tango_count)
{
char word[MAX_NAME];/*単語の名前*/
charwa[MAX_WAYAKU];/*単語の和訳*/
int i = 0;
intj;
printf("[単語]:");
scanf("%s", word);
/*単語を単語帳に登録*/
strcpy(tango[tango_count].name, word);
printf("[和訳]:");
scanf("%s", wa);
/*和訳を単語帳に登録*/
strcpy(tango[tango_count].wayaku, wa);
for( i = 0; i < tango_count; i++){
if(strcmp(tango[tango_count].name, tango[i].name) > 0){
swaps(tango[tango_count], tango[i]);
}
}
}
/***********************************************/
/*----- 登録された単語を表示する -----*/
/* 関数printword()は引数words tango[]の、イン */
/*クリメントしたtango_counの並び替えて表示する */
/***********************************************/
void printword(words tango[], int tango_count)
{
int i = 0;
puts("登録されている単語を表示します。\n");
for (i = 0 ; i < tango_count; i++) {
printf("[単語]:%s\n", tango[i].name);/*単語の表示*/
printf("[和訳]:%s\n", tango[i].wayaku);/*和訳の表示*/
}
}
/****************/
/*--- メイン ---*/
/****************/
int main(void)
{
words tangochou[NUMBER];/*単語帳に50件登録*/
int menu_num;/*メニュー番号*/
int slct_num;/*選択番号*/
int tango_count = 0;/*登録数のカウント*/
while(1){
/****************************/
/*--- メニュー番号の入力 ---*/
/****************************/
do {
printf("1・・・登録. 2・・・表示. 3・・・終了.\n");
printf("メニュー番号を入力してください。:");
scanf("%d", &menu_num);/*メニュ番号の入力*/
if (menu_num > 0){
break;
}
}while(menu_num != 0);/*メニュ番号が該当しない時は再入力*/
switch (menu_num){
case 1:/*--- メニュー 1:単語と和訳の登録 ---*/
while(1) {
if (tango_count < NUMBER){
printf("英単語と和訳を入力してください。:\n");
/*単語と和訳の登録*/
tourokuword(tangochou, tango_count);
tango_count++;
}else {
puts("50件以上です。\n");
return0;/*50件以上は終了する*/
}
/*登録を続けるか?*/
printf("続けますか【Yes・・・1/No…0】:");
scanf("%d", &slct_num);
if(slct_num != 1){/*0なら終了。1なら継続。*/
break;
}
}break;
case 2:/*--- メニュー 2:登録された単語と和訳の表示 ---*/
printword(tangochou, tango_count);/*単語と和訳の表示*/
break;
case 3:/*--- メニュー 3:終了 ---*/
puts("終了します。\n");
return (0);
default:/*--- メニュー 4:非メニュー番号の処理 ---*/
puts("メニュー番号が間違っています。");
break;
}
}
return (0);
}
No.15ベストアンサー
- 回答日時:
>回答についてですが、質問があります。
>void swaps(words *x, words *y)
>と、
>swaps(&tango[tango_count], &tango[i]);
>は、もしかして、ポインタのポインタではないですよね?
違いますよ。ポインタのポインタはwords **xと書きます。
今回は必要ないので使っていません。今回のは、だたの構造体のポインタです。
>void swaps(words *x, words *y)
>と、
>swaps(&tango[tango_count], &tango[i]);
>修正し、実行してみましたが、並び替えられていません??
>どこがおかしいのでしょうか?
これを↓表示の直前に移しましょう。その方が入力直後にソートするよりもプログラム的に簡単で分かりやすいと思います。それがうまく動いたら入力直後のソートに挑戦してみたらどうでしょう?
for( i = 0; i<(tango_count-1); i++){
for( j = (i+1); j<tango_count ; j++ ) {
if(strcmp(tango[i].name, tango[j].name) > 0){
swaps(&tango[i], &tango[j]);
}
}
元々書いていたのに近いものにしてみました。
このソートは、一番シンプルなソートの方法のうちの1つです。
まず、このソートを使いこなしましょう。
最後にソートの種類とアルゴリズムを紹介。
http://www.u-gakugei.ac.jp/~miyadera/LECTURE/Sor …
http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC% …
http://www1.cts.ne.jp/~clab/Contents/Sortindex.h …
zwiさん、このたびは本当にありがとうございます。今日からは入門書を最初からしていきます。
次は社員名簿をリスト構造を使って作る予定なので、また宜しくお願いします。
これまでにみなさんが回答してくれたものを、確実に身に付けていきます。

No.13
- 回答日時:
hatenan114は、既登録の単語はソートされてることを前提に、登録のところで、新しく登録する単語を一つだけ一重ループで挿入ソー
トっぽく挿入したいんだよね?^^No.12
- 回答日時:
/********************/
/*--- 英単語辞書 ---*/
/********************/
#include <stdio.h>
#include <string.h>
#define NUMBER 50 /*登録数*/
#define MAX_NAME 20 /*単語の最大文字数*/
#define MAX_WAYAKU 30 /*和訳の最大文字数*/
/************************/
/*--- 単語帳の構造体 ---*/
/************************/
typedef struct {
char name[MAX_NAME]; /*単語*/
char wayaku[MAX_WAYAKU]; /*和訳*/
} words;
/************************/
/*----- 単語の交換 -----*/
/************************/
void swaps( words *x, words *y )
{
words temp;
temp = *x;
*x = *y;
*y = temp;
}
/**************************/
/*----- 単語のソート -----*/
/**************************/
void sortword( words tango[], int tango_count )
{
int i, j;
for ( i = (tango_count - 1) ; i > 0 ; i-- ){
for ( j = 0 ; j < i ; j++ ){
if ( strcmp(tango[j].name,tango[j + 1].name) > 0 ){
swaps( &tango[j], &tango[j + 1] );
}
}
}
}
/************************************************/
/*------ 単語と和訳の登録 ------*/
/* 関数tourokuword()は引数words tango[]の、イン*/
/*クリメントしたtango_counの順番に格納する。 */
/************************************************/
void tourokuword( words tango[], int tango_count )
{
char buff[ 256 ];
/*単語を単語帳に登録*/
printf( "[単語]:" );
scanf( "%s", buff );
buff[ MAX_NAME - 1 ] = '\0';
strcpy( tango[tango_count].name, buff );
/*和訳を単語帳に登録*/
printf( "[和訳]:" );
scanf( "%s", buff );
buff[ MAX_WAYAKU - 1 ] = '\0';
strcpy( tango[tango_count].wayaku, buff );
}
/***********************************************/
/*----- 登録された単語を表示する -----*/
/* 関数printword()は引数words tango[]の、イン */
/*クリメントしたtango_counの並び替えて表示する */
/***********************************************/
void printword( words tango[], int tango_count )
{
int i;
puts( "登録されている単語を表示します。\n" );
for ( i = 0 ; i < tango_count; i++ ){
printf( "[単語]:%s\n", tango[i].name ); /*単語の表示*/
printf( "[和訳]:%s\n", tango[i].wayaku ); /*和訳の表示*/
printf( "\n" );
}
}
/****************/
/*--- メイン ---*/
/****************/
int main( void )
{
words tangochou[ NUMBER ]; /*単語帳に50件登録*/
int menu_num; /*メニュー番号*/
int tango_count = 0; /*登録数のカウント*/
do {
/****************************/
/*--- メニュー番号の入力 ---*/
/****************************/
do {
printf( "\n" );
printf( "1・・・登録. 2・・・表示. 3・・・終了.\n" );
printf( "メニュー番号を入力してください。:" );
scanf( "%d", &menu_num ); /*メニュ番号の入力*/
} while ( menu_num <= 0 ); /*メニュ番号が該当しない時は再入力*/
switch ( menu_num ){
case 1:/*--- メニュー 1:単語と和訳の登録 ---*/
if ( tango_count >= NUMBER ){
puts( "50件以上です。\n" );
return 1; /*50件以上は終了する*/
}
printf( "\n英単語と和訳を入力してください。:\n" );
/*単語と和訳の登録*/
tourokuword( tangochou, tango_count );
tango_count++;
break;
case 2 :/*--- メニュー 2:登録された単語と和訳の表示 ---*/
sortword( tangochou, tango_count ); /*単語と和訳のソート*/
printword( tangochou, tango_count ); /*単語と和訳の表示*/
break;
case 3 :/*--- メニュー 3:終了 ---*/
puts("終了します。\n");
break;
default:/*--- メニュー 4:非メニュー番号の処理 ---*/
puts( "メニュー番号が間違っています。" );
break;
}
} while ( menu_num != 3 );
return 0;
}
※インデント部は全角空白文字です。注意。
以上。
Oh-Orangeさん、このたびは本当にありがとうございます。
これまでにみなさんが回答してくれたものを、確実に身に付けていきます。
これからも宜しくお願いします。
No.11
- 回答日時:
★すべてのソースを手直しして動くようにしました。
・何も修正しないでコンパイルするとワーニング(警告)が3つ表示されました。
>単語帳.cpp(40) : warning C4101: 'j' : ローカル変数は 1 度も使われていません。
>単語帳.cpp(87) : warning C4127: 条件式が定数です。
>単語帳.cpp(101) : warning C4127: 条件式が定数です。
↑
tourokuword() 関数の j 変数は使っていないので削除すべき。
87、101行のはいずれも while(1) としているので for ( ; ; ) として無限ループを組むべし。
・次に修正した関数と内容を解説。
(1)swaps() 関数に関しては他の回答者さんのアドバイス通りです。そちらを参考に。
(2)sort() 関数を追加しました。これがソート処理です。
(3)sort() 関数より tourokuword() 関数は登録するたびにソートしないようにしています。
scanf() 関数で直接構造体に文字列を入れている点に注目して下さい。
(4)printword 関数は int i = 0 の部分を int i; に修正しました。あと改行を入れました。
(5)main() 関数の while(1) を do-while に修正しました。
(6)main() 関数の do{ … } while ( menu_num != 0 ); を修正しました。break 部も削除。
(7)main() 関数の『単語と和訳の登録』部分を修正しました。続けますかとは表示し内容にした。
(8)main() 関数の『単語と和訳の表示』部分の前でソートをしています。その後表示。
(9)main() 関数の『メニュー終了』部分はメッセージのみで break します。その後do-while で抜ける。
以上の9箇所を修正しました。
次の回答でソースを載せますのでチェックしてみて下さい。
特にソート部分(swaps,sortword)と main() 関数全体を見て下さい。
・以上。

No.10
- 回答日時:
じゃあ、登録のところで、こうしますか?
for( i = tango_count; i > 0; --i){
if(strcmp(tango[i-1].name, tango[i].name) > 0){
swaps(&tango[i-1], &tango[i]);
}
}

No.9
- 回答日時:
ん?登録のところで並び替えるのも、表示のところで並び替えるのも同じじゃないの?登録時は一個ずつ入れるので「挿入ソート」をつかって、表示の際は「シェルソート」使うとか?
まぁそのうち、こなれてきてわかるようになると思いますよ。K&Rなどのよい言語の本と「アルゴリズムとデータ構造」などの本をじっくり理解していくのが、結局、早道かもしれませんが。。がんばってください^^

No.8
- 回答日時:
この回答への補足
ありがとうございます!!!
でも・・・今回のソースは表示のところで並び替えず、登録時に並び替えたものなんです。
はぁ、7月からC言語をはじめたのですが、毎日が格闘です。
No.6
- 回答日時:
swaps(tango[tango_count], tango[i]);
と呼び出すと、
void swaps(words x, words y)
に来る前に、
・メモリ上にxが作られ、xにtango[tango_count]がコピーされる
・メモリ上にyが作られ、xにtango[i]がコピーされる
と言う事が起きます。
で、xとyを入れ替えても、コピーが入れ替わるだけです。
・その1
呼び出す部分を
swaps(&tango[tango_count],&tango[i]);
にして、関数を
void swaps(words *x, words *y)
{
words temp = *x;
*x = *y;
*y = temp;
}
にする。
・その2
呼び出す部分を
swaps(tango,tango_count,i);
にして、関数を
void swaps(words tango[],int x, int y)
{
words temp = tango[x];
tango[x] = tango[y];
tango[y] = temp;
}
にする。
・その3
インデックス配列を作成し、実体は入れ替えせず、インデックス配列のみを入れ替える。表示する時は、実体の順で表示せず、インデックス配列の順で表示する。
(このプログラムは回答に書きません。自作してみましょう)
インデックス配列を用いる理由は以下の通り。
一番先頭に来る単語を最後に登録したらどうなるでしょう。50バイトもある配列が、49回も入れ替えされます。
単語数が50個なら問題無いですが、単語数が5000とかになったら?
構造体サイズが50バイトなら問題無いですが、文字数を増やして構造体が500バイトになったら?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語 3 2022/11/09 13:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列の問題
-
System.IO.Directory.GetFiles...
-
Fortran77で多次元配列を並び替...
-
C# DataTableの行をソートしてD...
-
excel VBA の条件をつけての列...
-
VB.NETでファイル名順にファイ...
-
【VBAマクロ:繰り返し処理に関...
-
昇順と降順
-
あるディレクトリ内のファイル...
-
C# ArrayListを二次元配列のよ...
-
10個の整数を入力して小さい順...
-
サイトで価格順で表示するなど...
-
EXCEL VBAのソートについて
-
構造体配列の並べ替え
-
C言語について
-
C# DataGridView のヘッダーセ...
-
C++ 入力した3つのint型の整数...
-
Excelですべての組合せ(重複組...
-
C言語・要素除去
-
プログラミングについて 配列を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VBA基本構文の作り方 2列の...
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
VB.NETでファイル名順にファイ...
-
構造体配列の並べ替え
-
あるディレクトリ内のファイル...
-
配列の問題
-
10個の整数を入力して小さい順...
-
2次元配列を複数項目でソートし...
-
構造体のリストをソートしたい。
-
DataGridViewソート時に先頭行...
-
DataGridViewのソートを止めたい
-
datagridviewの並べ替え
-
C++ 入力した3つのint型の整数...
-
DataGridViewの複数列を連動し...
-
Excelですべての組合せ(重複組...
-
C#のリストボックスで、クリッ...
-
VBScriptで重複レコードを削除...
おすすめ情報