こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

プログラミングのポインタの所の課題で、途中までやったのですが・・・

プログラミングのポインタの所の課題で、途中までやったのですが・・・
どうしてもとけません。どなたか解けるかた、ご指導お願いします。。。
課題は以下の通りです。

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とする。

投稿日時 - 2010-05-26 08:36:37

QNo.5922507

困ってます

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

ポインタ型の値を %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);
}

投稿日時 - 2010-05-27 12:58:28

ANo.3

どこまでできてどこが分からないのかをきちんと書いてください. これだけでは「ただの丸投げ」と思われても仕方ないですよ.
ここに挙がっているプログラム片は与えられたものなのですか? それともあなたが「途中までやった」ものなのですか? 後者なら, あなたはどこを加えたのですか?

投稿日時 - 2010-05-26 11:18:08

ANo.2

まず、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については関数の仕様がないのでわかりません。

投稿日時 - 2010-05-26 09:24:23

ANo.1

strcmp( )関数は使って良いのでしょうか。またstrcmpの結果でソートして良いのでしょうか
strcmpがだめなら使う文字はASCII英文字限定と言うことで良いのでしょうか

投稿日時 - 2010-05-26 08:46:42

補足

すいません。
よくみるとstrcmp( )関数を使いなさいと書いてありました。。

はい。その結果でソートして間違いないと思います。

投稿日時 - 2010-05-26 11:17:54

あなたにオススメの質問