C言語 ソートについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アリ

C言語 ソートについて

#1

投稿記事 by アリ » 5ヶ月前

#include <stdbool.h>
#include <stdio.h>
void swap(char *a, char *b) {
}
bool is_at(char c) {
}
void justify(char line[], int n) {
}
int main(void) {
char line[] = "t@a@@@n@@q@@@ku@@n"; // 文字列 size_t n = sizeof(line) - 1; // 文字数
justify(line, n); // 前詰め
printf("%s\n", line); // 入れ替えた結果の表示
return 0;
}
実行結果
tanqkun@@@@@@@@@@@

上の雛形を使って実行結果の通りにしたいのですがよくわかりません。
良ければ解答をお願いします

アバター
みけCAT
記事: 6730
登録日時: 12年前
住所: 千葉県
連絡を取る:

Re: C言語 ソートについて

#2

投稿記事 by みけCAT » 5ヶ月前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。

例えば、

コード:

#include <stdbool.h>
#include <stdio.h>
void swap(char *a, char *b) {
}
bool is_at(char c) {
}
void justify(char line[], int n) {
	puts(" tanqkun@@@@@@@@@@@");
	line[0] = '\0';
#define n 0
}
int main(void) {
char line[] = "t@a@@@n@@q@@@ku@@n"; // 文字列 size_t n = sizeof(line) - 1; // 文字数
justify(line, n); // 前詰め
printf("%s\n", line); // 入れ替えた結果の表示
return 0;
 }
とすると、「実行結果」に書かれている出力が得られますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
幸尚
記事: 47
登録日時: 1年前
連絡を取る:

Re: C言語 ソートについて

#3

投稿記事 by 幸尚 » 5ヶ月前

コード:

#include <stdbool.h>
#include <stdio.h>
void swap(char* a, char* b) {
	char temp = *a;
	*a = *b;
	*b = temp;
}
bool is_at(char c) {
	if (c == '@') {
		return true;
	}
	else {
		return false;
	}
}
void justify(char line[], int n) {
	for (int i = 0; i < n - 1; i++) {
		for (int j = i; j < n; j++) {
			if (is_at(line[i]))
				swap(&line[i], &line[j]);
		}
	}
}
int main(void) {
	char line[] = "t@a@@@n@@q@@@ku@@n";
	size_t n = sizeof(line) - 1;
	justify(line, n);
	printf("%s\n", line);
	return 0;
}
とりあえず、こんな感じでどうでしょうか?
無駄な動きが多いような気もしますのでご自分で改良お願い致します。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

box
記事: 2002
登録日時: 12年前

Re: C言語 ソートについて

#4

投稿記事 by box » 5ヶ月前

バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
幸尚
記事: 47
登録日時: 1年前
連絡を取る:

Re: C言語 ソートについて

#5

投稿記事 by 幸尚 » 5ヶ月前

なんと!!
マルチでしたか・・・
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
usao
記事: 1887
登録日時: 10年前

Re: C言語 ソートについて

#6

投稿記事 by usao » 5ヶ月前

「'@' ではない文字群を先頭側に集めて,残りを '@' で埋める」と見えるので
それを素直にやればいいんじゃないかと思う.

・上記の作業に swap なんていう処理をどこで使うのか不明なので,未使用とする.
・main() 関数内にさりげなく仕掛けられているトラップ n の解決が馬鹿馬鹿しい.

コード:

//この関数は必要性不明につき,使わぬ.
void swap(char *a, char *b) {}

//せっかくだからこれは使っておくが,コレ関数にする意味あるか?
bool is_at(char c){	return c=='@';	}  //「C言語での」boolについて知らんから,これでいいのか謎だが.

//引数nは使わぬ.
void justify(char line[], int n)
{
	const char *s = line;
	char *d = line;
	while( *s )
	{
		if( !is_at(*s) ){	*d++=*s;	}
		++s;
	}
	while( d != s ){	*d++ = '@';	}
}

//main() 内に唐突に出てくる n がコンパイルエラーを起こすことへの対策.
const int n = 0;	//値は使わぬ.
//(main() は提示されたままなので省略)

返信

“C言語何でも質問掲示板” へ戻る