- 締切済み
プログラミングのポインタの所の課題で、途中までやったのですが・・・
プログラミングのポインタの所の課題で、途中までやったのですが・・・ どうしてもとけません。どなたか解けるかた、ご指導お願いします。。。 課題は以下の通りです。 1.文字配列の先頭文字でソートを行って出力するプログラムを完成させよ。ただし、my_sort_stringsはポインタ配列とその要素数を引数として、登録されている文字配列を昇順に並べ替える関数である。 #include<stdio.h> #include<string.h> void print_strings(char **p, int n); void swap_strings(char **p, int i, int j); int min_index(); void my_sort_strings(); int main() { char*p[100]; char Orange[] = "orange"; char Apple[] = "apple"; char Peach[] = "peach"; char Grape[] = "grape"; char Melon[] = "melon"; int i; p[0] = Orange; p[1] = Apple; p[2] = Peach; p[3] = Grape; p[4] = Melon; print_strings(p, 5); my_sort_strings(); print_strings(p, 5); return 0; } void print_strings(char **s, int n) { int i; printf("-----------begin: print_string ----------\n"); printf("print_string: s's value: %08x\n", s); for(i = 0; i < n; i++) { printf("(s[%d])'s value: %08x\n", i, s[i]); printf("(s[%d])'s address: %08x\n", i, &s[i]); } for(i = 0; i < n; i++) printf("%d: %s\n, i, s[i]"); printf("-----------end: print_strings-----------\n"); } void swap_strings(char **p, int i, int j) { char *tmp; tmp = p[i]; p[i] = p[j]; p[j] = tmp; } int min_index(char **a, int n) { } void my_sort_strings( ) { } 2.課題1を元に文字配列の2文字目以降の順序まで考慮した辞書式順序でソートを行うプログラムを作成せよ。関数名はlexicographic_sortとする。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
ポインタ型の値を %x で出力しちゃいかんだろと思いつつ 1: #include <stdlib.h> int compare_first_char_of_string(const void *a, const void *b) { return strcmp(**(const char **)a, **(const char **)b); } void my_sort_strings(char **a, int n) { qsort(a, n, sizeof *a, compare_first_char_of_string); } 2: #include <stdlib.h> int lexicographically_compare_string(const void *a, const void *b) { return strcmp(*(const char **)a, *(const char **)b); } void lexicographic_sort(char **a, int n) { qsort(a, n, sizeof *a, lexicographically_compare_string); }
- Tacosan
- ベストアンサー率23% (3656/15482)
どこまでできてどこが分からないのかをきちんと書いてください. これだけでは「ただの丸投げ」と思われても仕方ないですよ. ここに挙がっているプログラム片は与えられたものなのですか? それともあなたが「途中までやった」ものなのですか? 後者なら, あなたはどこを加えたのですか?
- kmee
- ベストアンサー率55% (1857/3366)
まず、intの配列をソートするのはできますか? 例えば、昇順バブルソートならこんな感じです for (i = 0 ; i < n-1; ++ i) { for( j = 1; j < n - i ; ++ j ) { if ( a[j-1] が a[j] より「大きかったら」) { a[j-1]とa[j]を交換; } } } さて、サンプルプログラム等では 「a[j-1] > a[j]」とあるところを、なぜif日本語で書いたか。 それは「大きい」という判定を矛盾が無いように定義すれば、いろんな順番に並び換えができるのです。 例えば、 「絶対値で比較して大きい方を『大きい』とする」 「奇数と偶数なら、奇数の方が『大きい』/奇数同士、偶数同士なら値の大きい方が『大きい』」 といったように。 極端な例では、「降順」とは「値の小さい方が『大きい』とした『昇順』」となります。 他のソートアルゴリズムでも同様に、「大小」を定義できます。 そこで今回の課題となります。 交換はすでにswap_stringsという関数が用意されているので、それを使えばよいでしょう。 あとは「大きい」をどう書いたらいいかを考えてみてください。 min_indexについては関数の仕様がないのでわかりません。
- php504
- ベストアンサー率42% (926/2160)
strcmp( )関数は使って良いのでしょうか。またstrcmpの結果でソートして良いのでしょうか strcmpがだめなら使う文字はASCII英文字限定と言うことで良いのでしょうか
補足
すいません。 よくみるとstrcmp( )関数を使いなさいと書いてありました。。 はい。その結果でソートして間違いないと思います。