872 :
869:2005/06/21(火) 19:44:21
辞書ファイルの大きさは任意?
大規模ではなく英単語&和訳は4、5行位でもいいようです。
malloc系は習っている?
すみませんわかりません。
>>869 #include <stdio.h>
#include <string.h>
#define TOALPHA(c) (('a'<=(c)&&(c)<='z')?(c)+'A'-'a':(c))
#define DIC_MAX 8
#define DIC_LEN 256
int main( int argc, char* argv[] )
{
FILE *pf; int i, j; char dic[ DIC_MAX ][ DIC_LEN ], eng[ DIC_LEN ];
if ( argc >= 2 ) {
pf = fopen( argv[ 1 ], "rt" );
if ( pf == NULL ) return 0;
for ( i = 0; fscanf( pf, "%s\n", dic[ i ] ) != EOF; ) { i++; if ( i == DIC_MAX ) break; }
for ( ; i < DIC_MAX; i++ ) dic[ i ][ 0 ] = '\0';
fclose( pf );
while ( 1 ) {
printf( "English word : " ); scanf( "%s", eng );
if ( strcmp( eng, "q" ) == 0 ) break;
for ( i = 0; i < DIC_MAX; i++ ) {
if ( dic[ i ][ 0 ] == '\0' ) break;
for ( j = 0; eng[ j ] != '\0'; j++ ) if ( TOALPHA( eng[ j ] ) != TOALPHA( dic[ i ][ j ] ) ) break;
if ( eng[ j ] == '\0' && dic[ i ][ j ] == ',' ) printf( "%s in Japanese.\n", &dic[ i ][ j + 1 ] );
}
}
}
return 0;
}
ん、ん?
875 :
869:2005/06/21(火) 22:04:06
遅れましたが
>>873さまありがとうございました
876 :
デフォルトの名無しさん:2005/06/21(火) 22:04:31
先生!なんかこのスレ急にカラフルになってきています!
877 :
デフォルトの名無しさん:2005/06/22(水) 00:27:46
プログラム演習
文字列の後半と前半の文字が同じならくっつけて出力(長い方があればそっち)
サンプル
ABB
BCCB
出力
ABBCCB
サンプル
ACC
CCCA
出力
ACCCA
[3] 環境
OS:Linux
言語:C
[4] 期限:明日の昼ごろまでにできえれば・・
こんな情報だけではむりですかね?
最後と最初の参照だけでなく 二文字 三文字の参照のやり方がまったくわかりません
一通りのプログラムはならいました(/□≦、)
878 :
877:2005/06/22(水) 00:34:30
まちがえました・・
二個目の問題は 長い方だとCCCACC が出力されますね。
入力
ABC
BCD
出力
ABCD にしてください。。。二文字目どー判別させるんだ・・
同じ文字数ならどうすんだ?
880 :
877:2005/06/22(水) 00:39:14
両方出力します
ペコm(_ _;m)三(m;_ _)mペコ
>>877 問題の条件が妙に複雑だな。
「長い方があればそっち」ってそういう意味なのか?
# include <stdio.h>
# include <string.h>
int wrap_length(const char *a, const char *b) {
int al = strlen(a);
int bl = strlen(b);
int l;
if(al > bl) {
a += al - bl;
al = bl;
}
for(l = al; l >= 0; l--)
if(strncmp(a + (al - l), b, l) == 0) return l;
return 0;
}
int main(void) {
char a[128], b[128];
int wla, wlb;
gets(a);
gets(b);
wla = wrap_length(a, b);
wlb = wrap_length(b, a);
if(wla && (!wlb || wla <= wlb))
printf("%s%s\n", a, b + wla);
if(wlb && (!wla || wlb <= wla))
printf("%s%s\n", b, a + wlb);
return 0;
}
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[256];
char *p;
int len, i;
printf("1番目のアレを入力してください:");
fgets(str, sizeof(str), stdin);
len = strlen(str) - 1;
p = str + len;
printf("2番目のアレを入力してください:");
fgets(p, sizeof(str) - len, stdin);
if (str[strlen(str)-1] == '\n') str[strlen(str)-1] = '\0';
if (strlen(str) < len) len = strlen(str);
for (i = len; i >= 1; i--) {
if (strncmp(p - i, p, i) == 0) {
memmove(p - i, p, strlen(p) + 1);
break;
}
}
printf("[%s]", str);
return 0;
}
883 :
863:2005/06/22(水) 01:02:22
2分35秒負けたか・・・。
884 :
863:2005/06/22(水) 01:03:57
すまん、双方チェックすんのか。鬱だ。
885 :
877:2005/06/22(水) 01:10:48
ぬお はや・・・881さんありがとう。
ちなみに文字が長い方じゃなくてくっつけて文字列が長くなる方を出力。
でした。。と、適当に勉強してたら なに聞けばいいのかも
わからない始末・・
もっと精進します。ありがとうございました。
886 :
881:2005/06/22(水) 01:21:58
同じ文字列が二回出力されるバグがあった…
許容範囲かな?
887 :
877:2005/06/22(水) 01:24:00
>863さんもありがとう! がんばってきます
888 :
881:2005/06/22(水) 01:29:49
>>877 mainを以下のように訂正する。
汚いソースですまん。
nt main(void)
{
char a[128], b[128];
char out[128] = {0};
int wla, wlb;
gets(a);
gets(b);
wla = wrap_length(a, b);
wlb = wrap_length(b, a);
if(wla && (!wlb || wla <= wlb))
{
sprintf(out, "%s%s", a, b + wla);
puts(out);
}
if(wlb && (!wla || wlb <= wla))
{
char out1[128];
sprintf(out1, "%s%s", b, a + wlb);
if(out[0] && strcmp(out, out1) != 0)
puts(out1);
}
return 0;
}
889 :
881:2005/06/22(水) 01:31:55
>>888のntはintの誤りだ。
永眠してくる。
891 :
デフォルトの名無しさん:2005/06/22(水) 10:29:36
[1] 授業単元:プログラム
[2] 問題文(含コード&リンク):整数を決められた回数(三回)だけ入力し、
その偶奇を判定する
[3] 環境
[3.1] OS:UNIX
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:2005年6月23日
[5] その他の制限:
宜しくお願いします
[1] 授業単元: プログラミング演習
[2] 問題文:1)一次元データを読み込む関数1{a)下のファイル、b)乱数}を作成
2)そのデータを読み込み、データ数、最大最小、平均値、標準偏差を求める関数2
3)一次元データを他の関数より取り込み、その結果を表示する関数3
4)三つの関数をつないでmain関数を完成させよ
英語 数学 国語 理科 社会
70 56 66 45 88
66 85 68 55 73
55 65 53 67 55
85 72 76 58 65
[3] 環境
[3.1] OS:UNIX
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:6月23日まで
[5] その他の制限:ポインタ、構造体はまだ習っていません
お願いします
学校名、会社名もテンプレに入れて欲しい。
無茶言うな、さすがに釣れない
>>891 #include <stdio.h>
int main(int argc, char *argv[])
{
int input, i;
for(i = 0; i < 3; i++)
{
scanf("%d", &input);
if(input % 2 == 0)
{
printf("偶数");
}
else
{
printf("奇数");
}
}
return 0;
}
898 :
892:2005/06/22(水) 11:54:58
test
SUBSET_SUMの解が存在する場合に(x0,x1,…,xn-1)を出力する形にしたいんですがこれからどうすればいいんですか?
int subset_sum_dp_1(int a[],int b,int n){
int y[N][B],q[N][B],k,p;
for(k=0;k<n;k++){
for(p=0;p<=b;p++)
y[k][p]=0;q[k][p]=0;
}
y[0][0]=1;
if(a[0]<=b)
y[0][a[0]]=1;
}
for(k=1,k<n;k++){
for(p=0;p<=b;p++){
if(y[k-1][p]==1)
y[k][p]=1;
else if(p-a[k]>=0&&y[k-1][p-a[k]]==1)
y[k][p]=1;
}
}
if(y[n-1][b]==1){
p=b;
for(k=n-1;k>=0;k--){
if(q[k][p]==1){
x[k]=1;p-=a[k];
}else
x[k]=0;
}
return 1;
}
return 0;
}
[1] 授業単元:プログラミング技術
[2] 問題文(含コード&リンク):
(1)changeMonth関数を以下のように修正せよ。
・変更しようとする月に対し、dayが入っている値が大きすぎる
場合、dayを変更後の最後の日に修正するようにする。例えば
5/31に設定されているときにchangeMonth(2)が呼ばれたとき、
monthに2を、dayに28を代入する。
(2)
(1)のプログラムに対し、MyDate型の中のデータを一日繰り上げる
メンバ関数inclementを実装し、1/1,1/31,2/28,10/10,12/31の場合
で動作することを確認せよ。例えば次のプログラムの実行結果は
4月3日となる。
MyDate date;
date.changeMonth(3);
date.changeDay(31);
date.inclement();
date.inclement();
date.inclement();
date.print();
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C++
[4] 期限:05年06月22日23時頃まで
[5] その他の制限:
できれば(1),(2)別々に記述していただければと思います。
すみませんがよろしくお願いします。
902 :
デフォルトの名無しさん:2005/06/22(水) 14:01:08
[1] 授業単元:プログラミング演習I
[2] 問題文:
テストの点数(65 91 39 31 56 72 54 52 62 70 -1)
(-1はデータの終わりを表すものとする)を入力すると、
最高点、最低点が表示されるようなプログラムを作成せよ。
[3] 環境
[3.1] OS:Linux
[3.2] コンパイラ(バージョン):gcc
[3.3] 言語:C
[4] 期限:6/28まで
[5] その他の制限:配列まで習いました
*テストの点数の入力はリダイレクト入力で別のファイルから読み込ませるので、
その元になるプログラムを作成します。
以下は変更を行うプログラムです。
#include <iostream>
class MyDate {
private:
static const int maxDays[12];
int day,month;
public:
MyDate(int Day=1, int Month=1);
void changeDay(int Day) { if(Day > 0 && Day <= maxDays[month-1]) day = Day;}
void changeMonth(int Month) {if(Month > 0 && Month <= 12) month = Month;}
void print(void) {std::cout << day << ","<< month << "\n";}
};
const int MyDate::maxDays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
MyDate::MyDate(int Day, int Month)
:day(1),month(1)
{
changeMonth(Month);
changeDay(Day);
}
int main()
{
MyDate date(31,5);
date.print();
return 0;
}
904 :
902:2005/06/22(水) 14:05:00
#include <stdio.h>
#define NMAX 200
int main (void)
{
int i;
double tmax=-1;
double tmin;
double data[NMAX];
for( i = 0 ; i < NMAX ; i++ ){
printf( "%d 番目の点数は?\n", i );
scanf( "%lf", &data[i] );
if(data[i]==-1){
break;}
if(tmax < data[i] ){
tmax=data[i];}
if(tmin > data[i]){
tmin=data[i]; }
}
printf("最高点: %d\n",tmax );
printf("最低点: %d\n",tmin );
return(0);
}
ここまで自分で作成してみましたが、最低点がちゃんと表示されないので、
どこをどう直せばいいか、どなたか教えてください。
>>902 #include <stdio.h>
int main(int argc, char *argv[])
{
int max, min, i;
const int dat[] = {65, 91, 39, 31, 56, 72, 54, 52, 62, 70, -1};
max = dat[0];
min = dat[0];
i = 1;
while(dat[i] != -1)
{
if(max < dat[i])
{
max = dat[i];
}
else if(min > dat[i])
{
min = dat[i];
}
i++;
}
printf("max = %d, min = %d\n", max, min);
return 0;
}
907 :
901:2005/06/22(水) 14:14:18
その通りです・・・
908 :
906:2005/06/22(水) 14:17:17
>>902 すまん、レス最後まで読んでなかった...orz
void
MyDate::changeMonth(int Month){
if(Month > 0 && Month <= 12){
month = Month;
if(maxDays[month-1] < day)
day = maxDays[month-1];
}
void
MyDate::increment(){
if(maxDays[month-1] < ++day){
day = 1;
if(++month > 12)
month = 1;
}
}
910 :
902:2005/06/22(水) 14:26:40
やべ、ミスってる。
printf("最高点: %f\n",tmax );
printf("最低点: %f\n",tmin );
%d ×
%f ○
の訂正がありました。どなたかご教授お願いします。
>>902 いえいえ、ありがとうございます。
僕もミスってました。。
911 :
909:2005/06/22(水) 14:31:13
} 足りなかった
void
MyDate::changeMonth(int Month){
if(Month > 0 && Month <= 12){
month = Month;
if(maxDays[month-1] < day)
day = maxDays[month-1];
}
}
912 :
906:2005/06/22(水) 14:35:39
>>910 tmaxはdoubleにする必要は無いんじゃない?
とりあえず、さっきの修正版。
#include <stdio.h>
int main(int argc, char *argv[])
{
int dat;
int max, min;
scanf("%d", &dat);
max = dat;
min = dat;
while(1)
{
scanf("%d", &dat);
if(dat == -1)
{
break;
}
else if(max < dat)
{
max = dat;
}
else if(min > dat)
{
min = dat;
}
}
printf("max = %d, min = %d\n", max, min);
return 0;
}
913 :
902:2005/06/22(水) 14:44:04
>>912 入力値が変数なので一応doubleにしました。
僕の作成したプログラムでは出力結果が
最高点:91.00000
最低点:5.541873
と表示されてしまうのですが、何故なんでしょうか。
914 :
912:2005/06/22(水) 15:01:21
>>913 *入力値は変数ではなく整数。だからtmax や tminはint型で宣言する。
*最小値がおかしいのはtminを初期化していないから。
>>912のように、一番最初に入力された数値でtmaxとtminを初期化するといい。
*入力がリダイレクトなので、デバッグ目的でないならprintf( "%d 番目の点数は?\n", i );は必要ない。
*
>>912を見れば分かるが、君のdata[NMAX]は意味がない。
915 :
デフォルトの名無しさん:2005/06/22(水) 15:06:36
916 :
877:2005/06/22(水) 15:33:05
昨日は助かりました。 でですね、問題が発展してもうむりです。。
今回は 前回同様 後半と前半の文字列が同じならくっつける
例 AA AB =AAB ABC BCD = ABCD
問題のサンプル出力
5 /*何個の文字列で作るか*/
ACTC
ATG
TCAG
GTCG
1つの最長のシーケンスを見つけました:ACTCGTCAGTCG
と、複数の文字列を全部組み合わせて最長の組み合わせを表示。
です。今晩暇な神な方 おねがいします。。
環境 OS:Linux
言語:C プログラムは一通り習いました。
>>916 >と、複数の文字列を全部組み合わせて最長の組み合わせを表示。
上の例だとATGを使ってないけど良いのか?
自分で勝手に理解したところだけ出さないでできるだけ問題をそのまま出すニダ
お願いする方より回答者の方が質問を把握してるって妙な現象がw
919 :
デフォルトの名無しさん:2005/06/22(水) 16:00:50
>>916 文字列が連結可能かどうかを数値の大小に置き換えると
「最長上昇部分列」の問題に帰着する希ガス。
>>920 文字列の連結可能性は順序関係じゃないけど良いのか?