ページ 11

C言語 ソートについて

Posted: 2022年12月14日(水) 18:39
by アリ
#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@@@@@@@@@@@

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

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

Posted: 2022年12月14日(水) 18:56
by みけCAT
ソースコードを提示する際は、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;
 }
とすると、「実行結果」に書かれている出力が得られますね。

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

Posted: 2022年12月14日(水) 19:30
by 幸尚

コード:

#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;
}
とりあえず、こんな感じでどうでしょうか?
無駄な動きが多いような気もしますのでご自分で改良お願い致します。

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

Posted: 2022年12月14日(水) 23:01
by box

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

Posted: 2022年12月14日(水) 23:02
by 幸尚
なんと!!
マルチでしたか・・・

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

Posted: 2022年12月16日(金) 15:39
by usao
「'@' ではない文字群を先頭側に集めて,残りを '@' で埋める」と見えるので
それを素直にやればいいんじゃないかと思う.

・上記の作業に 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() は提示されたままなので省略)