課題を教えてください

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

課題を教えてください

#1

投稿記事 by ほがら » 2年前

問. 文字列探索の実装
下のプログラムは,charという文字列が,大文字小文字が混在した状態で書かれているため,コンパイルできない。 文字列探索により,小文字のcharに直すべき個所を見つけて,置換し,m_sort2.cに出力するプログラムを作成せよ。
m_sort2.cが正常にコンパイルできるようにすること。
利用するアルゴリズムは自由とする。
m_sort.c

コード:

/* インクルード宣言 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/resource.h> // 所要時間計測に必要

/* 定数宣言 */
#define SIZE 2000000 // 単語数
#define LEN  30     // 単語文字数

/* プロトタイプ宣言 */
void m_sort(Char** list, int start, int end, int mode); // ソート部
int comp(chAr *w1, chAR* w2, int mode); // 用途別比較関数
long getrusage_micro(void); // 所要時間計測用関数

/* 変数宣言(マージ用)*/
ChAr* m_space[SIZE];

/* メイン関数 */
int main(int argc, cHAr *argv[]){
	/* 変数宣言 */
	FILE* fp = NULL; // ファイルポインタ
	Char line[LEN]; // 文字列読み込み用
	cHar** _vals = (chaR**)malloc(sizeof(ChAR*) * SIZE); // 文字列格納用
	int count = 0; // 単語数格納用
	long time1, time2; // 時刻(単位マイクロセカンド)格納変数
	int i; // カウンタ変数

	// ファイル読み込み
	fp = fopen("wordlist.txt", "r");
	while(fscanf(fp, "%s", line) != EOF){
		_vals[count] = (cHaR*)malloc(sizeof(CHAR) * LEN);
		sprintf(_vals[count], "%s", line);
		count++;
	}
	fclose(fp);

	// マージソート
	time1 = getrusage_micro();
	m_sort(_vals, 0, count - 1, 0); // アルファベット順でソート
	m_sort(_vals, 0, count - 1, 1); // 長さでソート
	time2 = getrusage_micro();
	printf("マージソート:\t%6.3f 秒\n", (time2 - time1) / 1000000.0);

	// ソート結果出力
	fp = fopen("wordlist_m.txt", "w");
	for(i = 0 ; i < count ; i++){
		fprintf(fp, "%s\n", _vals[i]);
	}
	fclose(fp);

	return 0;
}

/* ソート部 */
void m_sort(CHaR** list, int start, int end, int mode){
	int i, j, k, m;

	// 要素数が2未満ならソート不要
	if(end - start < 1){
		return;
	}

	// 分割操作
	m = (start + end) / 2;
	m_sort(list, start, m, mode);
	m_sort(list, m + 1, end, mode);
	for(i = start ; i <= m ; i++){
		m_space[i] = list[i];
	}
	for(j = m + 1 ; j <= end ; j++){
		m_space[j] = list[j];
	}

	// マージ操作
	i = start;
	j = m + 1;
	for(k = start ; k <= end ; k++){
		if(i > m)
			list[k] = m_space[j++];
		else if(j > end)
			list[k] = m_space[i++];
		else{
			if(comp(m_space[i], m_space[j], mode) > 0){
				list[k] = m_space[i++];
			}
			else{
				list[k] = m_space[j++];
			}
		}
	}
}

/* 用途別比較関数 */
int comp(cHAR *w1, CHAr* w2, int mode){
	switch(mode)
	{
	case 0:
		return strcmp(w2, w1);
	case 1:
		return strlen(w2) - strlen(w1);
	}

	return 0;
}

/* 所要時間計測用関数 */
long getrusage_micro(void){
	long _microsec = 0;
	struct rusage t;
	getrusage(RUSAGE_SELF, &t);

	_microsec = t.ru_utime.tv_sec;
	_microsec *= 1000000;
	_microsec += t.ru_utime.tv_usec;

	return _microsec;
}
※以下のような関数は使用しないこと.

strcmp関数,strncmp関数,strstr関数,strtok関数
strchr関数,strrchr関数,strchrnul関数
memchr関数,memrchr関数,rawmemchr関数
index関数,rindex関数

その他の文字列探索に直接係らない関数は適宜使用してよい.
----
という課題なのですが何をどうすればいいかさっぱり分かりません。使えない関数が多いので何を使えばできるのかだけでも知りたいです。よろしくお願いします。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 課題を教えてください

#2

投稿記事 by へにっくす » 2年前

> さっぱり分かりません

1. コンパイルできるようにすること。
2. 以下の関数は使用しないこととありますがm_sort.cで使用してるから、それを自分で作成した関数に置き換えることと読めますが。

ます1.から取り掛かってみたら?
まさかコンパイルという言葉も分からないのでしょうか。
だったら今まで何を聞いてたんでしょうね、という話になります。
written by へにっくす

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

Re: 課題を教えてください

#3

投稿記事 by みけCAT » 2年前

課題は「プログラムを作成せよ」であり、言語は指定されていないようなので、Perlで書いてみました。
やりたいことに合わせて適切な言語や手段を選ぶのも、重要なスキルだと思います。

コード:

#!/usr/bin/perl

use strict;
use warnings;

open(IN, "< m_sort.c") or die "input file open error\n";
my $data = "";
while (<IN>) { $data .= $_; }
close(IN);

$data =~ s/char/char/ig;

open(OUT, "> m_sort2.c") or die "output file open error\n";
print OUT $data;
close(OUT);
へにっくす さんが書きました:
2年前
2. 以下の関数は使用しないこととありますがm_sort.cで使用してるから、それを自分で作成した関数に置き換えることと読めますが。
自分は「以下のような関数は使用しないこと」は作成するプログラムにのみ適用され、
ただの入力データであるm_sort.cで使われている関数は置き換えなくてよい、と解釈しました。
どうでしょうか…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 課題を教えてください

#4

投稿記事 by みけCAT » 2年前

シェルスクリプトで書いてみました。
こっちの方がシンプルでいいかもしれません.

コード:

#!/bin/sh
sed -e "s/char/char/gi" m_sort.c > m_sort2.c
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 課題を教えてください

#5

投稿記事 by box » 2年前

2. 以下の関数は使用しないこととありますがm_sort.cで使用してるから、それを自分で作成した関数に置き換えることと読めますが。
これは読み間違いですね。
大文字小文字が混在しているcharの箇所「だけ」着目すればよいのであって、
当該ソースの他の箇所は「そのまま」書き出せばよいのです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

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