08/09/05 10:02:47
'\0'のこと考えるの忘れてたぜ orz
547:デフォルトの名無しさん
08/09/05 10:14:30
>>546
よくあることだぜ。
むしろ、普通は数字直接入力なんてしないからな。
548:デフォルトの名無しさん
08/09/05 16:36:09
>>542
>>543
>>544
>>545
助かります♪
ありがとうございました。
549:デフォルトの名無しさん
08/09/08 13:10:28
[1] 授業単元:確率・統計
[2] 問題文(含コード&リンク):
AさんとBさんが順番にコインを投げる
ただし、AさんとBさんはそれぞれp, qの確率で表を出すことができるとする。
ここで、Aさんならm回、Bさんならn回先に表を出したら勝ちとする勝負をした場合
Aさんが勝つ確率を求める関数を作成しなさい。
ただし関数は以下のプロトタイプ宣言に従うこと。
double odds(double p, double q, int m, int n);
[3] 環境
[3.1] OS: Windows + Cygwin
[3.2] コンパイラ名とバージョン: gcc 3.4.4
[3.3] 言語: C
[4] 期限: 2008年09月08日11:59まで
[5] その他の制限:特にありませんが、アルゴリズムや考え方についての解説があると助かります。
よろしくお願いします。
550:デフォルトの名無しさん
08/09/08 14:52:44
>>549
数学の問題じゃねーか
数式よろ
551:デフォルトの名無しさん
08/09/08 15:27:46
#include <iostream>
#include <stdexception>
double odds(double p, double q, int m, int n) {
// Aが表を m 回出すまでの確率
double a = ( double )m / p;
// Bが表を n 回出すまでの確率
double b = ( double )n / q;
// AのBに対する勝率
// ただし、AはBよりも1回分余計に振るチャンスがある
return a / b + 1 / a; }
int main(){
using namespace std;
double p( 0 ), q( 0 );
int m( 0 ), n( 0 );
cout << "入力が必要です、例えばAとBが表を出す確率:";
cin >> p, q;
if ( p =< 0.0 || q =< 0.0 || p > 1.0 || q > 1.0 ) { throw domain_error( "ちょ、おまw" ); }
cout << "おまえが入力せよ、つまりAとBが表を出す回数:";
cin >> m, n;
if ( m =< 0 || n =< 0 ) { throw domain_error( "ちょ、おまw" ); }
cout << "AのBに対する勝率は・・・" << odds( m, n ) << endl;
return false; }
552:デフォルトの名無しさん
08/09/08 17:33:15
>>551
ちょ、おまw
553:デフォルトの名無しさん
08/09/08 18:04:00
[1] 授業単元:C言語実習
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: WinXP SP3/Vista SP1
[3.2] コンパイラ名とバージョン: Borland
[3.3] 言語: C
[4] 期限: 明日9日 午前6時頃まで
[5] その他の制限:
課題番号の大きい順、6>5>4>3に優先して希望
出かけてる間に母親が親戚の子に勝手に俺のラップトップを貸した上、
明日の登校日に提出する課題の入ったUSBを吹っ飛ばされました…orz
復元作業とはいえ間に合うか不安なのでお願いします
554:デフォルトの名無しさん
08/09/08 18:45:22
まさに丸投げ
555:デフォルトの名無しさん
08/09/08 20:45:43
ハードディスクにないの?
556:デフォルトの名無しさん
08/09/08 20:51:10
>>553
やらせようとしている内容は察しがつくが
問題文が気持ち悪いな
表現のゆらぎが尋常じゃない。統一しろよと
557:デフォルトの名無しさん
08/09/08 20:52:58
>>551
脳が溶けた
558:デフォルトの名無しさん
08/09/08 21:35:46
>>553
親戚の子も母も許してやれよ?
その寛大な気持ちが、将来のお前の資産になる。
あぁ、母親はやらせくれるだろうし、親戚の子はお前を大切に育ててくれるのだから。
559:デフォルトの名無しさん
08/09/08 21:36:38
>>558
イミフ
560:デフォルトの名無しさん
08/09/08 21:41:33
IMF
読み:イミフ
561:553
08/09/08 22:11:40
>>554
URLリンク(kansai2channeler.hp.infoseek.co.jp)
1と2を終わらせて3に入ったものの、この有様で…。
USB吹っ飛ばされたショックで焦りすぎました、夜風にあたって頭冷やしてきます。
>>555
USB内で完結させてしまったのが敗因でした。
やり直しから大人しくHDDで作業→USBでコピー、の形を取ることにしました。
562:デフォルトの名無しさん
08/09/08 22:21:00
>>561
頑張ってコメントを書いているようだが内容が的外れ
最初は誰でもそんなもんだろうけど
563:デフォルトの名無しさん
08/09/08 22:23:57
そういえば、コメントってどういうことをどういう風に核のかっていう教則本みたいなのはみたことないな。
一応、先頭にプログラムの目的と製作日付、製作者の魔羅サイズは記入するようにしているけど・・・
564:デフォルトの名無しさん
08/09/08 22:30:24
>>563
標準時?最大時?現在時?
565:デフォルトの名無しさん
08/09/08 22:49:25
>>561
・ループから抜けるにはbreakを使うとよい
・一致文字列チェックでp[j]をみてるが、高頻度で見てはいけないところを
みるようになっている。それを防ぐために、配列pの各要素をNULLで初期化
しておいて、NULLじゃないところだけ一致チェックをするとよい
・一致した文字に対応する文字列件数を加算 の処理がcnt[n]++;
となっているが、cnt[j]++;では?
566:デフォルトの名無しさん
08/09/08 22:51:11
そんなことなかった。nで数チェックしてるのね。
みてはいけないとこはみてなさそうだった。ごめん。
567:デフォルトの名無しさん
08/09/08 22:57:21
printで状況を見る努力もしてるし、コメントもあながち的はずれではないし。
いい感じと思うけどなぁ。
丸投げして自分の考えと全く異なるコードを提出するより
可能ならばもう一回作って提出できる方がいいなと思う。
その途中で過去の自分のコードを改善できることもあるし。
別に丸投げが悪いといってるわけではなくて、時間があれば
そういうこと(作り直し)をしてみたらいいんじゃない?程度。
568:デフォルトの名無しさん
08/09/08 22:57:45
>>561
データ復旧させたほうが早いかも
がんばれ!
569:デフォルトの名無しさん
08/09/08 23:59:34
>>549
double odds(double p, double q, int m, int n)
{
if(m==0) return 1.0;
if(n==0) return 0.0;
return ( p*q*odds(p,q,m-1,n-1) + p*(1-q)*odds(p,q,m-1,n) + (1-p)*q*odds(p,q,m,n-1) ) / (p+q-p*q);
}
//
// F(m,n) = p*q*F(m-1,n-1) +p*(1-q)*F(m-1,n) +(1-p)*q*F(m-1,n) +(1-p)*(1-q)*F(m,n)
// 上の式を、F(m,n) について解く
//
570:デフォルトの名無しさん
08/09/09 01:39:52
>>553
課題6だけ。
出力と、main()のループを抜けるロジックがアレだけど、
眠いんでそっちで調整して。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
571:デフォルトの名無しさん
08/09/09 02:34:31
[1] 授業単元:ファイル出入力
[2] 問題文(含コード&リンク):
複数の人の名前と体重、身長を質問してローレル指数を計算して
「名前、体重、身長、ローレル指数、やせすぎ(または丁度良いなど)」
をファイルに保存しなさい。
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:
[3.3] 言語:C
[4] 期限: 2008/09/9(am.7)
[5] その他の制限:特になし
自分でやってみたのですが分かりません。急ですみませんがよろしくお願いします。
#include <stdio.h>
int main(void)
{
int p,n,w,h,r;
FILE *fp1;
fp1 = fopen("c:\\file.dat","w");
printf("人数を入力してください。:");
scanf("%d",&p);
572:デフォルトの名無しさん
08/09/09 02:36:07
for(;p>0;p--){
printf("名前を入力してください。:");
scanf("%s",&n);
fprintf(fp1,"%d\n",n);
printf("体重を入力してください。(kg):");
scanf("%d",&w);
fprintf(fp1,"%d\n",w);
printf("身長を入力してください。(cm):");
scanf("%d",&h);
fprintf(fp1,"%d\n",h);
r=w/(h*h*h)*1.0E7;
fprintf(fp1,"%d\n",r);
if (r<100){
printf("やせすぎです。\n");
fprintf(fp1,"やせすぎ\n"); }
else if(r>=100 && r<115){
printf("やせている。\n");
fprintf(fp1,"やせている\n"); }
else if(r>=115 && r<145){
printf("丁度良いです。\n");
fprintf(fp1,"丁度良い\n"); }
else if(r>=145 && r<160){
printf("太っています。\n");
fprintf(fp1,"太っている\n"); }
else {
printf("太りすぎです。\n");
fprintf(fp1,"太りすぎ\n"); }
}
fclose(fp1);
return 0;
}
573:デフォルトの名無しさん
08/09/09 06:19:46
>>572
何が分からんのか分からんのだが。
> printf("名前を入力してください。:");
> scanf("%s",&n);
> fprintf(fp1,"%d\n",n);
↑の fprintf(fp1,"%d\n",n); は fprintf(fp1, "%s\n",n); だべ。
後、名前って文字列だよな?なんで int 型の変数に入れようとしてんの?だったら例えば
char s[64];
scanf("%s", s);
fprintf(fp1, "%d\n", s);
こうだな。
後、
> r=w/(h*h*h)*1.0E7;
もおかしい。r は float や double で定義せんと小数点使えん。
後、整数型を直接割り算しても0にしかならん。
ならば
身長、体重も小数点扱える型で定義するか、キャストしてから割り算せい。
574:デフォルトの名無しさん
08/09/09 06:29:06
まとめ
> int p,n,w,h,r;
char n[64];
int p;
float n, w, h, r;
> scanf("%s",&n);
> fprintf(fp1,"%d\n",n);
scanf("%s", n);
fprintf(fp1, "%s\n", n);
> scanf("%d", &w);
> fprintf(fp1, "%d\n", w);
scanf("%f",&w);
fprintf(fp1, "%f\n", w);
> scanf("%d",&h);
> fprintf(fp1,"%d\n",h);
scanf("%f", &h);
fprintf(fp1, "%f\n", h);
> r=w/(h*h*h)*1.0E7;
> fprintf(fp1,"%d\n",r);
r = w / (h * h * h ) * 1000000;
fprintf(fp1, "%f\n", r);
とりあえずこれで。
575:デフォルトの名無しさん
08/09/09 06:47:11
訂正
> 後、整数型を直接割り算しても0にしかならん。
整数の部分しか持って来ないってことね。
int i = 3 / 2;
ってやったら、i は 1 になる。
後、fprintf で小数点以下を書き込みたくないのなら、
> fprintf(fp1, "%f\n", w);
fprintf(fp1, "%0.0f\n", w);
にすると小数点以下を無くして書き込む。
576:デフォルトの名無しさん
08/09/09 14:00:24
いいかげん>>569に誰か突っ込めよ
577:デフォルトの名無しさん
08/09/09 15:04:48
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] Windows XP
[3.2] gcc
[3.3] C
[4] 期限:2008/9/12
[5] xlsファイルでシートごとに問題が分かれています。よろしくお願いします。
578:デフォルトの名無しさん
08/09/09 16:23:52
#include <stdio.h>
unsigned str_length(const char str[])
{
unsigned len = 0;
while (str[len])
len++;
return (len);
}
void str_rev(const char str[]){
unsigned i = str_length(str);
while(i>0)
printf("%c",str[--i]);
}
int main(void)
{
char str[100];
printf("文字列を入力してください:");
scanf("%s", str);
printf("入力した文字列は%sです。\n長さは%uです。\n", str, str_length(str));
printf("文字列を逆から表示→");
str_rev(str);
printf("\n");
return (0);
}
ポインタを使って文字列を逆から表示させる課題があるのですが、
上のプログラムのどこを変更すればポインタを使ったプログラムになるでしょうか?
よろしくお願いします。
579:デフォルトの名無しさん
08/09/09 16:38:12
>>578
>>541
過去スレ全部とは言わない。
せめてこのスレ位読んできて。
580:デフォルトの名無しさん
08/09/09 19:23:13
>>576
ツッコミの手本を見せてください><
581:デフォルトの名無しさん
08/09/09 22:41:15
>>577
丸投げかよ
582:デフォルトの名無しさん
08/09/09 23:17:10
>>577
問題1
#include <stdio.h>
#define CONST_NUM ( -2007110825 ) /*( 314159265 )*/
const int number = CONST_NUM;
char str_decimal[16];
char str_hex[16];
char str_octal[16];
char str_binary[40];
const char * bin_table[] = {
"0000", "0001", "0010", "0011",
"0100", "0101", "0110", "0111",
"1000", "1001", "1010", "1011",
"1100", "1101", "1110", "1111",
};
int main()
{
int i = 0;
int l = 0;
sprintf( str_decimal, "%d", number );
sprintf( str_hex, "0x%x", number );
sprintf( str_octal, "0%o", number );
l = sprintf( str_binary, "0b" );
for ( i = 28; i >= 0; i -= 4 ) {
l += sprintf( str_binary + l, "%s", bin_table[( number >> i ) & 0x0f] );
}
printf( "decimal:%s\n", str_decimal );
printf( " hex:%s\n", str_hex );
printf( " octal:%s\n", str_octal );
printf( " binary:%s\n", str_binary );
}
583:デフォルトの名無しさん
08/09/09 23:35:36
>>577
問題2
URLリンク(kansai2channeler.hp.infoseek.co.jp)
584:583
08/09/09 23:40:08
微妙に読み間違っていた。
・typedefを消去
・string1 s1を消去
・strign2 s2を消去
・s1,s2をそれぞれstring1、string2に置換
585:デフォルトの名無しさん
08/09/10 01:06:41
>>578
URLリンク(kansai2channeler.hp.infoseek.co.jp)
586:デフォルトの名無しさん
08/09/10 16:51:46
すいません。またお願いします。
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: (Windows vista)
[3.2] コンパイラ名とバージョン: (Visual Studio 2005)
[3.3] 言語: C言語
[4] 期限: (来週まで)
[5] その他の制限: (ポインタの最初の段階まで習っています)
587:デフォルトの名無しさん
08/09/10 17:26:11
>>586
>>542以下じゃないのか?
588:デフォルトの名無しさん
08/09/10 18:50:24
>>586
問1
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p="Japan";
int i;
i=strlen(p);
i-=1;
for(;i>=0;i--)
putchar(*(p+i));
return 0;
}
589:デフォルトの名無しさん
08/09/10 18:51:30
>>586
問2
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p="pointer test program";
char save[256];
strcpy(save,p);
printf(save);
return 0;
}
590:デフォルトの名無しさん
08/09/10 18:52:16
>>586
問3
#include <stdio.h>
int main(void)
{
char *day_p[ ]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Fraiday",
"Saturday",
NULL
};
int i;
for(i=0;day_p[i];i++)
printf("%s\n",day_p[i]);
return 0;
}
591:デフォルトの名無しさん
08/09/10 18:54:14
>>586
問4
#include <stdio.h>
int main(void)
{
char *day_p[ ]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Fraiday",
"Saturday",
NULL
};
int i;
for(i=0; *(day_p+i); i++)
printf("%s\n",*(day_p+i));
return 0;
}
592:デフォルトの名無しさん
08/09/10 23:33:43
>>586
問4別解
#include <stdio.h>
int main(void)
{
char *day_p[ ]={
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Fraiday",
"Saturday",
NULL
};
char **p;
for (p=day_p; *p; p++) {
printf("%s\n", *p);
}
return 0;
}
593:デフォルトの名無しさん
08/09/10 23:35:29
>>589
- printf(save);
+ printf("%s", save);
594:デフォルトの名無しさん
08/09/10 23:37:13
>>578
- unsigned str_length(const char str[])
+ unsigned str_length(const char *str)
- void str_rev(const char str[]){
+ void str_rev(const char *str){
595:デフォルトの名無しさん
08/09/11 05:17:31
[1] 授業単元:C/C++(最小ファイルサイズを目指せ!!)
[2] 問題文(含コード):
int型のsin,cosテーブルを"sincos.cpp"というファイル名で出力
コード:main.c<とりあえずココまで短くなりました>
float sin();f;i;main(){for(f=fopen("sincos.cpp","w");i<450;i++)fprintf(f,
"%c%6d,%s",i%10?32:9,(int)(sin(i*3.141592653589793/180)*65536),i%10<9?"":
"\n");fclose(f);}
これより短くせよ。但し、出力結果は同じになるように。
[3] 環境
[3.1] Windows
[3.2] VisualStudio2005
[3.3] C/C++どちらでも可
※スレ違いだったらゴメンなさい
596:デフォルトの名無しさん
08/09/11 05:36:16
7行スレでやるといいよ
597:デフォルトの名無しさん
08/09/11 12:59:59
とりあえずfcloseいらなくね?
598:y
08/09/11 14:51:28
文字列(数字のみ)で構成されているファイルを読み込んで
文字列を数値に変換して並び替えを行うプログラムを作っているんですけど
文字列を数値に変換をして並び替えを行った結果、
先頭の数字0がなくなった状態で並び替えがされていました。
先頭の数字0がなくならない状態で並び替えを行う方法を教えてください。
お願いします。
例)
先頭の数字0がなくならない並び替え
並び替え前 並び替え後
00159 0101
130 → 130
0101 00159
先頭数字0がなくなった並び替え
並び替え前 並び替え後
00159 101
130 → 130
0101 159
599:デフォルトの名無しさん
08/09/11 15:04:37
>>598
文字列と数値の構造体にして数値でソートして文字列を表示
600:y
08/09/11 15:19:06
文字列と数値の構造体にして数値でソートして文字列を表示
するとはなんですか?
プログラムにするとどうなりますか?
教えてください。
601:デフォルトの名無しさん
08/09/11 15:25:52
C言語なら俺に聞け(入門編)で詳しく解説されている。
602:デフォルトの名無しさん
08/09/11 15:30:30
>>600
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char moji[32];
int suu;
} NUM;
int compare(const NUM *a, const NUM *b)
{
return a->suu - b->suu;
}
int main(void)
{
NUM num[3] = {"00159", 0, "130", 0, "0101", 0};
int i;
for (i = 0; i < 3; i++) {
num[i].suu = atoi(num[i].moji);
}
qsort(num, 3, sizeof(NUM), (int (*)(const void*, const void*))compare);
for (i = 0; i < 3; i++) {
printf("num%d=%s\n", i, num[i].moji);
}
return 0;
}
603:デフォルトの名無しさん
08/09/11 19:55:20
>>595
う~ん、直値は見なかったことにしよう
URLリンク(kansai2channeler.hp.infoseek.co.jp)
604:デフォルトの名無しさん
08/09/12 11:54:51
>>598
URLリンク(kansai2channeler.hp.infoseek.co.jp)
605:604
08/09/12 12:02:29
fcloseすんの忘れてた。
あと、data.txtの内容は整数限定で
10桁以上の数値に関しては無しの方向で
606:デフォルトの名無しさん
08/09/12 12:10:08
>>604
ポインタの配列で出来るのに何でわざわざ構造体にしてんの?(numdataとか要らないし)
strotol(atoi)で出来るのに何でわざわざToNumDataとか作ってんの?
なんでそんなど素人の分際で人に教えようとしてんの?
607:604
08/09/12 12:12:55
>>606
文句言うならお前が手本を示せ。
ソースも書かずに何言ってるんだか。
608:デフォルトの名無しさん
08/09/12 12:14:52
まあでもこのくらいじゃないと、どっかで手本丸写ししたってバレちゃうかもしれんし。
609:604
08/09/12 12:16:23
607は俺じゃないよ
610:606
08/09/12 12:27:54
ほれ。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
○2度読みする必要なし。
○構造体もイラネ。
○ToNumDataってatoiでいいじゃん。
○malloc+strcpyってstrdupでいいじゃん。
○比較関数はローカルなんだからstaticつけろよ。
○比較関数の引数宣言が変だったから直しといた。
○関数はトップダウン順に(main→cmp)書いた方が見やすい。プロトタイプ宣言を惜しむな。
○こういうツールはホントはstdinから読むべきなんだけど、data.txtから読みたいみたいだから尊重しといたぞw
611:604
08/09/12 13:46:18
>>610
strdupって知りませんでした
staticも付けるべきでした
その他何かと勉強になりました
猛省します
612:デフォルトの名無しさん
08/09/12 15:17:18
よーし>>610にイチャモンを付けまくるぞー
strdupはC言語標準の関数じゃないし。
いちいちC言語の規格を無視する理由になる程便利でもないし。
使わないほうがよくね?
あとreallocの結果がNULLの時にメモリリークしてるぜ。
printf(buffer[i])は文字列の中に%があると
破綻するからデータに%しかなくても使うのはよくないprintf("%s",...)にしなさい。
それに比較関数のポインタをキャストするのはよくない。
関数ポインタのキャストは動作するか保障されてない。
素直に比較関数の中でvoid*をキャストしろ。
比較関数で減算使ってるけど、
値がでかいとオーバーフローとかアンダーフローする可能性がある。
素直に比較しろ。
613:デフォルトの名無しさん
08/09/12 15:47:46
1] 授業単元: 情報
[2] 問題文(含コード&リンク): 2点の座標A(a,b),B(c,d)を与えたとき
1.ABの距離を求めよ
2. ABを通る直線の方程式を求めよ
3. 2で求めた方程式がx=1,y=1,y=xと交点を持つかどうか調べ持つならその交点の座標を
持たないならNoと返すプログラムを作成せよ
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語:C
[4] 期限: 2008年9月12日23時59分
[5] その他の制限:特にないです。
よろしくお願いします。
614:デフォルトの名無しさん
08/09/12 15:52:49
>>612
こんなうるさい奴と仕事したくない・・・・
615:デフォルトの名無しさん
08/09/12 16:01:35
>>614
ていうか仕事だともっと細かく突付くよ。
潰せる問題点はできる限り早めに潰したほうが望ましいし。
イチャモン付けるだけもなんなので自分も書いてみた。
もう面倒だし、これでよくね?
色々と無視してるけど。
char s[256][256];
f(char*a,char*b){return atoi(b)-atoi(a);}
main(){
int i=0;
while(gets(s[i]))++i;
qsort(s,256,256,f);
while(i--)puts(s[i]);
}
よい子の皆はこのコードは悲惨なので真似しないでねー
616:デフォルトの名無しさん
08/09/12 18:22:02
>>613
URLリンク(kansai2channeler.hp.infoseek.co.jp)
座標は整数で入力するようにした。
3番目の問題はよくわかんなかったので解いてません。
617:デフォルトの名無しさん
08/09/12 18:35:09
[1] 授業単元: C言語基本
[2] 問題文(含コード&リンク):
文字判定でスペースが入力されたら 「空白です」 と表示させたい
[3] 環境
[3.1] OS: Windows
[3.2] VC6.0
[3.3] 言語: C
[4] 期限: 無期限
618:デフォルトの名無しさん
08/09/12 19:45:47
コンパイルするとエラーメッセージが出てきてしまいます><
手直ししていただけませんでしょうか?
[1] 授業単元: コンピュータープログラミングⅠ
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: windows
[3.2] コンパイラ名とバージョン: Borland C++ Compiler5.5
[3.3] 言語:C++
[4] 期限: 2008.9.12(24:00)
619:デフォルトの名無しさん
08/09/12 20:07:16
>>618
URLリンク(kansai2channeler.hp.infoseek.co.jp)
620:デフォルトの名無しさん
08/09/12 20:20:23
>>618
void You::Attack()をint You::Attack()に(宣言もint Attack()に訂正)
int You::Attack()の最後にreturn a;
void Shishou::Attacked(int SAttacked)内のaを全てSAttackedに
621:デフォルトの名無しさん
08/09/12 20:36:02
>>610
>>620
レスありがとです><
こんな簡単なことに時間を割いてもらって大変申し訳なかったです
でもおかげで助かりました!どうもありがとう!
622:デフォルトの名無しさん
08/09/12 20:42:17
ここって、シュミのプログラマーしかいないんじゃね?
Cなんてばぐったら致命的な損害及ぼすFA、医療、航空などにつかわれてっから
あめーもんじゃーねーぞ。
623:デフォルトの名無しさん
08/09/12 20:55:03
>>622
どこをみてそういったの?
624:613
08/09/12 21:07:53
>>616
お礼おくれてすみません
ありがとうござました!
どなたか3番も解ける方いないでしょうか・・・
625:デフォルトの名無しさん
08/09/12 21:34:02
>>624
puts("y=1と交点を持つか");
if (A.y == B.y) {
puts("No");
}
else {
printf("交点 %.3lf,1 \n", (1-h)/slop);
}
puts("x=1と交点を持つか");
if (A.x == B.x) {
puts("No");
}
else {
printf("交点 1,%.3lf \n", slop + h);
}
puts("y=xと交点を持つか");
if (slop == 1) {
puts("No");
}
else {
printf("交点 %.3lf,%.3lf \n", h/(1-slop), h/(1-slop));
}
626:デフォルトの名無しさん
08/09/12 21:59:38
質問です。
msg.data[0] = 0xE0;
msg.data[1] = 0x07;
msg.data[2] = 0x00;
msg.data[3] = 0x00;
msg.data[4] = 0x07;
msg.data[5] = 0xAD;
msg.data[6] = 0xA9;
msg.data[7] = 0xD7;
//msg.dataはUCHAR型配列です
このコードの0x○○の部分をchar型配列のIDという変数からmsg.dataに
格納するように変更したいです。
わかりにくいんですが、今IDにはE007000007ADA9D7というのが格納されています。
上記のコードを
msg.data[0] = ID[0];
msg.data[1] = ID[1];
msg.data[2] = ID[2];
msg.data[3] = ID[3];
msg.data[4] = ID[4];
msg.data[5] = ID[5];
msg.data[6] = ID[6];
msg.data[7] = ID[7];
で出来るのかな、と思いましたが余裕で無理でした。
どなたか方法を知っていればお願いします。
627:デフォルトの名無しさん
08/09/12 22:03:03
strtol様の出番だな。
というわけで後は誰か任せた。
628:626
08/09/12 22:04:36
>>627
strtol?
今調べてみます。
ありがとうございます。
629:デフォルトの名無しさん
08/09/12 22:12:51
>>627
strtolでもいいけどNUL文字を自分で入れないと駄目ジャン。
むしろsscanfのほうが使いやすいんじゃない?
630:626
08/09/12 22:18:31
今、試してるんですがいまいち要領がつかめません。
どなたかちょろっと書いてくださると助かるんですが・・・。
631:デフォルトの名無しさん
08/09/12 22:33:59
#include <string.h>
unsigned char ID[8] =
{
0xE0 , 0x07 , 0x00 , 0x00 , 0x07 , 0xAD , 0xA9 , 0xD7
};
struct msg_t
{
unsigned char data[8];
};
int main( int main , char **argv )
{
struct msg_t msg;
/*IDの配列サイズだけmsg.dataにコピー*/
memcpy( msg.data , ID , sizeof( ID ) );
return 0;
}
632:デフォルトの名無しさん
08/09/12 22:49:49
こう?
sscanf(ID, "%2x%2x%2x%2x%2x%2x%2x%2x"
, &data[0], &data[1], &data[2], &data[3]
, &data[4], &data[5], &data[6], &data[7]);
633:626
08/09/12 23:00:09
>>631
>>632
おお、助かりました!!
これでもう少しアプリ開発が進みそうです
634:デフォルトの名無しさん
08/09/12 23:07:04
う、うん。
>>631と>>632の何が違うか理解してから使ってね。。。
635:デフォルトの名無しさん
08/09/14 02:01:11
>>617
#include <stdio.h>
int main( void )
{
char ch;
puts( "1文字だけ入力してください。" );
ch = getc();
switch( ch ){
case ' ':
puts( "空白です" );
default:
break;
}
return( 0 );
}
636:あおい
08/09/14 17:52:30
改行コードとして"LF"が使われているテキストファイルを読み取り、
"LF"を"CR+LF"に変換できるようなソースを教えてください。
ロジックとしては、
1文字ずつ読み込み、"LF"じゃなかったらそのまま出力し、"LF"だったら"CR+LF"にして出力する
のようなものが思いつくのですが、C言語は経験が無くて・・・。
また処理時間がシビアに要求されていて、なるべく処理時間が早いソースができればと思っています。
637:あおい
08/09/14 17:57:58
(636の補足)
外部サーバ(OSは不明)から改行コード"LF"のテキストファイルが
HULFT6を使用して送られてきます。
こちら側はWindows2003サーバで受け取り、そのテキストファイルを読み込んで
データ異常チェック・複数ファイルの結合といった処理を行います。
その際、改行コード"LF"では不都合かと思い、"CRLF"に一度変換してから処理に回そうと考えているのです。
C言語に詳しい方どうか助けてください。
638:あおい
08/09/14 18:04:12
重ね重ねすいません。質問の仕方のルールがありましたね。
改めて書き直します。
【質問テンプレ】
[1] 授業単元: 改行コード変換
[2] 636&637参照
[3.2] VC 6.0
[3.3] 言語: C
[4] 期限: 2008年09月15日22:00まで
どうかお願いします。
639:デフォルトの名無しさん
08/09/14 18:06:21
そのロジックで良いんじゃないかな。
もう少し具体的には、一文字前をおぼえておいて、
現在書こうとしている文字がLFで、一文字前がCRで無ければ
CRも書く。
例えば、
int last = '¥0';
int ch;
while ((ch = getchar()) != EOF) {
if (last != '¥r') putchar('¥r');
putchar(ch);
last = ch;
}
こんな感じかな。
fgets, strlen, fputs 使った方が少しだけ速いかもしれないが
簡明さでは劣る。
640:デフォルトの名無しさん
08/09/14 18:14:48
ごめん、if(ch=='¥n')を追加しといて。
俺ってばか。
641:あおい
08/09/14 18:27:38
迅速な応対ありがとうございます。
とても助かりました。
もう一つだけ教えていただいていいでしょうか?
改行コード"LF"と"CR"ってC言語上では何になるのでしょうか?
"CR"は"\r"?
ホントに初心者で申し訳ないのですが、
教えていただいたソースに簡単なコメントを添えていただけると助かります。
642:デフォルトの名無しさん
08/09/14 18:32:51
速度ならバリなりで読み込めよ
643:デフォルトの名無しさん
08/09/14 18:36:58
ただし、Webでの受け渡しなら、届いた分ずつ処理すればいい。
ほとんど、ネットの転送時間に依存して書き換え速度は無視できる
644:デフォルトの名無しさん
08/09/14 18:40:00
全部読み込む->変換->書き込み
の方が早いんじゃないの?
645:あおい
08/09/14 18:43:52
受信方法はHULFT6というツールで行います。
ファイルを送ってくる相手は別会社なので、あまり柔軟な要求は聞いてくれません。。。
最大20ファイルほどを1ファイルずつ連続で送ってきます。
1ファイルにはデータレコードのみで4レコード入っています。
受け取ったファイルを5分ごとにまとめて編集し、1ファイルに集約します。
そんなシステムを要求されているのですが・・・。
仕組みは考えられてもCに詳しくないので困っているんです。
646:デフォルトの名無しさん
08/09/14 18:44:11
届いた分ずつの方が速いよ。 1Mで転送待ちで5秒掛かったとたら
そのあと処理に0.5秒掛かれば合計で5.5秒。
もし32Kbyte届いたとして、それを書き換える時間は次のデータが届くまでには終わっているだろう。
647:デフォルトの名無しさん
08/09/14 18:45:40
こんな簡単な要求で苦しんでる会社と仕事したくないな・・・・
648:デフォルトの名無しさん
08/09/14 18:50:24
HULFT6調べたら、独自形式で圧縮、復元してるみたいね。 順次の処理は無理みたいだ。
ローカルファイルを書き換えるという方法しかないね。
簡単な方法だと、
nkf.exe -Lw -c inputfile > outputfile
でいいのでは?
649:デフォルトの名無しさん
08/09/14 19:00:34
ただし、NKFは文字コードの自動判別がはいるから、処理には時間が掛かる。
間にあわなければ、C言語を使ったら
650:デフォルトの名無しさん
08/09/14 19:03:00
1Mから500Mのサイズで最も速く書き換えられるアルゴリズムを作ってみてください。
651:デフォルトの名無しさん
08/09/14 19:10:19
>>650
>最も速く書き換えられる
なにを?
652:デフォルトの名無しさん
08/09/14 19:11:53
考えたアルゴリズム。 500M=5M*100に分割して読み込む。
スレッドを用意して、5M+αのバッファを2~4個持つ。
空いているところへデータと分割位置を渡して処理をさせる。
処理後に出力ルーチンへ渡す。
出力ルーチンは0番から順に書き込み、バッファとスレッドを解放する。
653:デフォルトの名無しさん
08/09/14 19:13:07
>>651
500Mのテキストファイルの改行コードを最も高速で変換するプログラムです。
654:デフォルトの名無しさん
08/09/14 19:22:42
処理時間の大半がIOになると思うけど、そういう処理でもやっぱ、マルチスレッドにして処理が早くなったりするの?
655:デフォルトの名無しさん
08/09/14 19:24:43
スレッド生成時間とかが気になる。
656:デフォルトの名無しさん
08/09/14 19:25:22
>>641
基本的にLFは'\n'でCRが'\r'だと思って問題ない。
>>653
そういう次元の話だと、もはやアルゴリズムよりいかにCPUを使い倒すかって問題になる。
657:デフォルトの名無しさん
08/09/14 19:27:42
この単純な課題で誰が上級者なのかチャレンジしよう。いまくんでみているところ
658:あおい
08/09/14 20:12:02
みなさん、初心者でホントにすいません。。。
改行コード'LF'のテキストを'CR+LF'に変換する、
一番シンプルで処理速度が期待できるCのソースを教えてください。
よろしくお願いします。
659:デフォルトの名無しさん
08/09/14 20:15:27
シンプルで、そこそこ速いのは、512Kbyte位読み込んで、書き換えて書き出す。
というので良いと思う。スレッド使っても速くなるかは微妙。
660:デフォルトの名無しさん
08/09/14 20:39:27
>>658
変換する対象はファイルでいいの?
661:デフォルトの名無しさん
08/09/14 20:40:25
これで充分だろ。
てかnkf使うんじゃダメなのか?
#include <stdio.h>
int main(void)
{
int ch;
while((ch = getchar()) != EOF){
if(ch == '\n'){
putchar('\r');
}
putchar(ch);
}
return 0;
}
662:デフォルトの名無しさん
08/09/14 20:45:39
>>661
一文字ずつ読んだら鈍いし、それは間違えてないか?
663:デフォルトの名無しさん
08/09/14 20:51:01
作ってみた。何を対象にして時間計測すればいいの?
#include<stdio.h>
#include<stdlib.h>
#define BUF_SIZE (1<<20)
#define CHAR_LF 0x0A
#define CHAR_CR 0x0D
int lf2crlf(FILE *fp_in, FILE *fp_out){
char *buf_in, *buf_out;
size_t buf_size=BUF_SIZE, read_size, write_size, whole_size=0, i;
buf_in=malloc(buf_size);
buf_out=malloc(buf_size*2);
if(buf_in==NULL || buf_out==NULL) goto on_exit;
while((read_size=fread(buf_in, 1, buf_size, fp_in))){
for(i=0,write_size=0;i<read_size;i++){
if(buf_in[i]==CHAR_LF) buf_out[write_size++]=CHAR_CR;
buf_out[write_size++]=buf_in[i];
}
whole_size+=fwrite(buf_out, 1, write_size, fp_out);
}
on_exit:
free(buf_in);
free(buf_out);
return whole_size;
}
int main(void){
lf2crlf(stdin, stdout);
return 0;
}
664:661
08/09/14 20:51:30
>>662
一文字づつ読んだら遅い?オーケー、おまえが速いと思うプログラムを書いてみて、
オレのと速度比較してみ。そのうえで、おまえのプログラムのほうが速かったら、
そのとおりでしたと認めるよ。
あと、間違えてると思うんならその箇所を指摘してくれ。単に、「間違えてないか?」
と言われても「どこが?」と聞き返すしかないぞ。
665:デフォルトの名無しさん
08/09/14 20:59:29
ちょっとまってろ
666:デフォルトの名無しさん
08/09/14 21:07:40
1行読み込んで1番最後だけ確認するのが早いんじゃないの?
667:デフォルトの名無しさん
08/09/14 21:11:19
DOSのころ、setvbufでバッファを大きくしたらそれだけでファイルIOが速くなったけど、Windows95か98のころに、
確認してみたら、setvbufでバッファを大きくしても、ぜんぜん速くならなかったような記憶がある。
668:662
08/09/14 21:16:16
質問があります。
>>661でgetchar()っていうのは、ファイルも開いて無くて使えますか?
>>663でstdinて (ここ)にくるやつですか? ***.exe (ここ)
669:デフォルトの名無しさん
08/09/14 21:19:51
スクリプト言語なんかでも書いてみて、スピードの比較をやってみたら面白そう。
670:662
08/09/14 21:24:17
できたよ。 バッファを始め512Kでやってたけど2Mのほうが速い。
#include <stdio.h>
#include <string.h>
#include <time.h>
void trans(char *input, char *output);
int main(){
int cl=clock();
trans("input.txt","output.txt");
cl=clock()-cl; printf("%d\n",cl); }
#define K 2024288
void trans(char *input, char *output){
char *x=new char[K*1.3];
char *y=new char[K+1]; y[K]=0;
FILE *fp=fopen( input,"rb");
FILE *fq=fopen(output,"wb");
int m,n,r,N;
while( N = fread(y, 1, K, fp) ){
m=n=r=0;
for(;;){
for(;r<N;r++)if(y[r]=='\r')if(y[r+1]!='\n')break;
if(r==N){ fwrite(x,1,m,fq); fwrite(&y[n],1,N-n+1,fq); break; }
int d=r-n+1;
memcpy(&x[m],&y[n],d); x[m+d]='\n';
m+=d+1; r++; n=r;}
}
fclose(fp);fclose(fq);}
671:662
08/09/14 21:28:28
まとめて2M読み込んで、別のバッファに結果を書き込んで出力しているけど
プログラムの工夫のポイントは、一度も\rが出てこなかったら、コピーは作らず
元のバッファをそのまま出力するところと、|r以外の連続する文字列はmemcpyで一気に移すところです。
しかし、ほとんど手間が掛かっているところはHDDアクセスのようです。
バッファを増やしても、アクセスランプが点滅しっぱなしなので。
672:デフォルトの名無しさん
08/09/14 21:30:21
1文字変数読みづらい
673:デフォルトの名無しさん
08/09/14 21:30:39
>>670
話の本筋とはずれるんだが、
動的にメモリを2Mも確保するのが怖いのは俺だけ?
別に怖い理由があるとかではないんだがなんとなく漠然と…。
674:デフォルトの名無しさん
08/09/14 21:34:02
>>673
スタックに確保するほうが怖いだろ
675:662
08/09/14 21:34:05
メモリを2M以上確保したことがないんですか? 全然余裕と思いますが。
676:デフォルトの名無しさん
08/09/14 21:35:34
perlとか、起動しただけで、プロセスが1M越えてるしな。
677:デフォルトの名無しさん
08/09/14 21:38:27
>>673
どこで動的に確保してる?
678:673
08/09/14 21:40:20
そういうもんなのか>動的確保
いつもなんとなく怖いからせいぜい2kくらいまでしか確保してなかった…
今度からはもっと大胆にとってみる
679:662
08/09/14 21:44:08
470Mのファイルを、読み込みバッファ512Kで処理すると約80秒
2Mだと約60秒、8Mだと約70秒掛かりました。
ただし8MはコンパイラをBCCからVC++に変更しました。
VC++2008はなかなか性能が良いと経験的に判っているのでバッファ増やしたら速くなると思ったのですが。
680:デフォルトの名無しさん
08/09/14 21:50:11
670って、妖しいような?
681:662
08/09/14 21:52:42
どうやら2M程度で十分なようです。 BCCで8Mにしても60秒は切れないです。
でもFire File Copy で単純にコピーしてみると29秒で済みます。
処理時間のほとんどがディスクアクセスに費やされるなら、もっと速くできるはずです。
682:あおい
08/09/14 21:53:47
みなさんありがとうございます。
変換する対象はファイルです。
拡張子は無しですが、メモ帳で開けるのでバイナリではなくテキストです。
ただ、1レコードに複数の項目があって、カンマ区切りになっています。
それが1ファイル内に最大4レコードあります。
速くて何よりシンプルなソースだと助かります。
初心者なものでホントにすいません。。。
683:あおい
08/09/14 21:55:52
ちなみにVisual Studioで開発しています。
684:デフォルトの名無しさん
08/09/14 21:58:27
>>679
実メモリを8Mも積んでないからじゃね? 遅くなるの。
685:デフォルトの名無しさん
08/09/14 21:58:29
非同期で処理と読み書きすればはやくなりそうです。
686:デフォルトの名無しさん
08/09/14 21:59:33
>>682
情報小出しキター!!!!
687:デフォルトの名無しさん
08/09/14 22:00:26
>>679
L2/L3キャッシュの容量超えてない?<8M
688:デフォルトの名無しさん
08/09/14 22:00:59
>>684
Fire File Copy では15M確保しましたよ。そしたら29秒です。
読み込みバッファ8Mとコピー先バッファ約10Mで併せて合計18Mくらいの確保ですが
Fire File Copyの確保量とほぼ同じです。
689:デフォルトの名無しさん
08/09/14 22:04:24
キャッシュなんてただの飾りです。
偉い人にはそれが
690:デフォルトの名無しさん
08/09/14 22:05:04
>>662
>>662のデータで>>661の処理時間どれくらいになった?
参考までに聞かせてくれ。
1文字ずつ読んで、あそこまで強気になれる時間かどうか知りたい。
691:デフォルトの名無しさん
08/09/14 22:05:46
HDDキャッシュ容量にもよるのでは?
692:684
08/09/14 22:06:28
ああ、ボケてた。
いまどきメモリを8M積んでないPCとかあるわけないか。
693:デフォルトの名無しさん
08/09/14 22:15:29
>>661の動かし方が判りません。
あとディスクアクセス以外の時間を計ってみたら3秒ほどしか使ってませんでした。
ほとんど入出力のアクセスの問題です。APIで直接操作したらいいかもしれません。
694:デフォルトの名無しさん
08/09/14 22:23:54
でも3秒以内なのは、はじめから\r\nという改行コードのせいと思います。メモリ間転送は全くしていないので。
新聞のログですがWindowsなのでSjisで改行は\r\nです。
695:デフォルトの名無しさん
08/09/14 23:05:06
>>690
試してみた
512MB の乱数で生成したテキストデータ ( A-Za-z0-9!#$%&'()=^;:][/.,<>?_}*{\n を等確率 )
>>661 が 50sec or 36sec
>>663 が 41sec or 15sec
>>663 (バッファを2MBに変更) が 36sec or 12sec
>>670 が 36sec or 12sec
それぞれ一回目の実行と二回目以降の所要時間が大幅に違う
二回目以降は明らかにキャッシュヒットしてる速さ
696:デフォルトの名無しさん
08/09/14 23:13:53
実際のデータは等確率ではない(\rはあまり現れない)ので、
memcpyで一気に写す>>670は一文字ずつよりかなりはやいはずです。
697:デフォルトの名無しさん
08/09/14 23:32:59
>>695
コンパイラ何使った?
もし、VC++ 2005以上なら_CRT_DISABLE_PERFCRIT_LOCKS定義した結果も計ってよ。
698:デフォルトの名無しさん
08/09/14 23:34:09
今更だけど、stdin/stdoutはテキストモードだろうから、
Windowsで661のコードはあまり意味ない気がする。
699:デフォルトの名無しさん
08/09/14 23:35:46
これって如何に同一ドライブのコピーを速くするかに掛かっているな。
CなどはOSのキャッシュも使い、内蔵キャッシュも使っているだろうから
ディスクアクセスが頻繁だと時間が掛かると思う。
WinAPIでOSのキャッシュ無効に出来るからそれで計ったらいい速度になると思う。
700:695
08/09/14 23:38:21
>>697
gcc -O2 にてコンパイル
>>697 は自分で試して結果を張ってくれればいいじゃない
ほら、乱数テキスト生成コード
int main(void){
FILE *fp;
char table[]="\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'()=^;:][/.,<>?_}*{";
char buf[1024*128];
int i, j;
fp=fopen("input.txt", "wb");
if(fp==NULL) return 1;
for(i=0;i<1024*4;i++){
for(j=0;j<sizeof(buf);j++){
buf[j]=table[rand()%(sizeof(table)-1)];
}
fwrite(buf, 1, sizeof(buf), fp);
}
fclose(fp);
return 0;
}
701:697
08/09/15 00:41:31
>>700
tx やってみた。VC++ 2008 SP1で/O2。
全てのソースに_setmodeでstdin/stdout共にバイナリモードにするコードを挿入した。
計測はCygwinのtimeのrealの値。
左がなし、右が_CRT_DISABLE_PERFCRIT_LOCKS
661 7.872s 0.632s
663 0.477s 0.403s
663 0.429s 0.602s (バッファ2MB)
2回目
661 6.500s 0.485s
663 0.578s 0.344s
663 0.578s 0.485s (バッファ2MB)
>>670は出力が間違っていたので除外した。とは言え一応計ってみたら0.387sだった。
702:デフォルトの名無しさん
08/09/15 00:54:50
質問者おいてけぼりの流れにワロタ。
いいぞ、もっとやれ。
703:デフォルトの名無しさん
08/09/15 00:59:35
まちがってた? さしたら修正と速度向上を目指してもう一度やってみる
704:デフォルトの名無しさん
08/09/15 01:07:29
670はもうこんなんでいいんじゃないか?
void trans(char *input, char *output){
FILE *fp=fopen( input,"rb");
FILE *fq=fopen(output,"wb");
char *buff1=(char*)malloc(K);
char *buff2=(char*)malloc(K*2);
int r_size,cr=0;
while((r_size=fread(buff1,1,K,fp))){
char *r=buff1,*w=buff2;
while(r<buff1+r_size){
if(*r=='\n' && cr==0){
*w++='\r';
}
cr=(*r=='\r');
*w++=*r++;
}
fwrite(buff2,1,w-buff2,fq);
}
fclose(fp);fclose(fq);
}
705:デフォルトの名無しさん
08/09/15 01:11:31
>>686
その小出しによって攪乱されるあなたの方がちょっとどうかしてるのでは
706:デフォルトの名無しさん
08/09/15 01:32:57
情報小出しはウザいだろ
仕様不明確はかなりめんどくさい
707:デフォルトの名無しさん
08/09/15 03:18:42
まぁテンプレに沿ってないやつの相手をするなら情報の小出しくらい覚悟しろってことだな
708:デフォルトの名無しさん
08/09/15 04:20:29
仕様に変更が発生しない小出しならスルーすればいいじゃない
709:デフォルトの名無しさん
08/09/15 14:05:37
[1] 授業単元 : プログラミング総合演習
[2] 問題文 : URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語:C
[4] 期限: 2008年09月17日22:00まで
ビットフィールドへの変換もいまいち分かりません。
よろしくお願い致します。
710:デフォルトの名無しさん
08/09/15 14:39:06
>>709
なんかサーバ落ちてる
711:デフォルトの名無しさん
08/09/15 16:26:34
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
課題1
∫[0→1]1/(1+x^2)dxを台形公式を用いて求めるプログラムを作成せよ。
台形公式:
∫[a→b]f(x)dx≒h/2{y[0]+2(y[1]+y[2]+…+y[n-1])+y[n]}
h=(b-a)/n
n=20
課題2
∫[0→1]1/(1+x^2)dxをシンプソンの公式を用いて求めるプログラムを作成せよ。
シンプソンの公式:
∫[a→b]f(x)dx≒h/3{y[0]+4(y[1]+y[3]+…+y[2n-1])+2(y[2]+y[4]+…+y[2n-2])+y[2n]}
h=(b-a)/2n
n=20
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:LSIC-86
[3.3] 言語:C
[4] 期限:2008年9月16日7:00まで
[5] その他の制限:できるだけ簡単な構文でお願いします。
答えは0.785…となるようです。
よろしくお願いします。
712:デフォルトの名無しさん
08/09/15 18:23:28
#include<stdio.h>
double f(double x){ return 1.0/(1.0+x*x); }
int main(){
int i,n;
double h,a,b,s;
a=0.0; b=1.0; n=20;
//1
h=(b-a)/n;s=f(a);
for(i=1;i<n;i++) s+=2.0*f(a+h*i);
s+=f(b); s*=h/2.0;
printf("1:%f\n",s);
//2
h=(b-a)/(2.0*n); s=f(a);
for(i=1;i<2*n;i+=2) s+=4.0*f(a+h*i);
for(i=2;i<2*n;i+=2) s+=2.0*f(a+h*i);
s+=f(b); s*=h/3.0;
printf("2:%f\n",s);
return 0;
}
713:デフォルトの名無しさん
08/09/15 20:05:58
[1] 授業単元:C++
[2] 西暦と月を入力し○年○月○日を出せるようにする
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:Microsoft Visual studio
[3.3] 言語: C++
[4] 期限: 9月16日 11:30
[5] その他の制限:とくにありません
よろしくお願いします
714:デフォルトの名無しさん
08/09/15 21:52:41
日はどうするのかと
#include <iostream>
using namespace std;
int main(int argc,char *argv[]){
int year,month,day;
cout<<"年を入力=";
cin>>year;
cout<<"月を入力=";
cin>>month;
cout<<"日を入力=";
cin>>day;
cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;
return 0;
}
715:デフォルトの名無しさん
08/09/15 22:38:37
[1] 授業単元:C++
[2] 西暦と月を入力しそのつきのカレンダーを表示させる
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:Microsoft Visual studio
[3.3] 言語: C++
[4] 期限: 9月16日 11:30
[5] その他の制限:とくにありません
すいません間違えてました
よろしくお願いします
716:デフォルトの名無しさん
08/09/15 23:02:05
カレンダーの形式は? 2008年9月としたときのサンプル
717:デフォルトの名無しさん
08/09/15 23:25:37
#include <iostream>
#include <iomanip>
using namespace std;
const int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31};
const char dayOfTheWeek[7][4] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
int main(int argc,char *argv[]){
int year,month,x,i;
cout<<"年を入力=";
cin>>year;
cout<<"月を入力=";
cin>>month;
x=(year+year/4-year/100+year/400+(13*month+8)/5 +1)%7;
for(i=0; i<7; i++) cout << dayOfTheWeek[i] << " " ;
cout << endl;
for(i=0; i<x; i++) cout << " ";
cout << setw(3);
for(i=1; i<=days[month-1]; i++){
cout << setw(3) << i << " ";
if((i+x)%7==0) cout << endl;
}
cout << endl;
return 0;
}
718:デフォルトの名無しさん
08/09/16 00:41:23
>>712
ありがとうございます
助かりました
719:デフォルトの名無しさん
08/09/16 02:39:45
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <string>
using namespace std;
const int days[] = { 31,28,31,30,31,30,31,31,30,31,30,31};
const string monthName[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
const string dayOfTheWeek[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
int main(int argc,char *argv[]){
int year,month,x,i;
string buf;
cout << "年を入力=";
do{ cin >> buf;}while((year = atoi(buf.c_str()))<=0);
cout << "月を入力=";
do{ cin >> buf;}while(!((month = atoi(buf.c_str()))>=1 && month<=12));
//xはその月の1日の曜日。0:日曜~6:土曜
x=(year+year/4-year/100+year/400+(13*month+8)/5 +1)%7;
cout << year << " / " << monthName[month-1] << endl;
for(i=0; i<7; i++) cout << dayOfTheWeek[i] + " " ;
cout << endl;
for(i=0; i<x; i++) cout << " ";
for(i=1; i<=days[month-1]; i++){
cout << setw(3) << i << " ";
if((i+x)%7==0) cout << endl;
}
if((i+x)%7!=1) cout << endl;
return 0;
}
エラーチェックとか追加!
720:デフォルトの名無しさん
08/09/16 15:17:32
1から100までの数を出力する。
宜しくお願いします。
721:デフォルトの名無しさん
08/09/16 15:36:03
#include <studio.h>
int mani(viod){
puts("#include <studio.h>¥nint mani(viod){int i;for(i=1;i<=100;i+++)printf("%s",i);retrun(0);}¥n","%d");
retrun(0);
}
722:デフォルトの名無しさん
08/09/16 16:02:07
[1] 授業単元:C++
[2] 問題文(含コード&リンク):C++でオセロを作る
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:CPad for Borland C++ Compiler
[3.3] 言語:C++
[4] 期限:9/17まで
[5] その他の制限:for if while do switch printf scanfだけで作る。それと対人
723:デフォルトの名無しさん
08/09/16 16:05:02
>>709の課題1だけでもいいので教えていただけないでしょうか
724:デフォルトの名無しさん
08/09/16 16:17:52
>>709
問題1
//
//課題部分
unsigned int dec;
dec=atoi(str_dec);
hex.hex7=dec%16;
dec=dec/16;
hex.hex6=dec%16;
dec=dec/16;
hex.hex5=dec%16;
dec=dec/16;
hex.hex4=dec%16;
dec=dec/16;
hex.hex3=dec%16;
dec=dec/16;
hex.hex2=dec%16;
dec=dec/16;
hex.hex1=dec%16;
dec=dec/16;
hex.hex0=dec%16;
return 0;
}
//
#include<stdlib.h> 必要
725:デフォルトの名無しさん
08/09/16 16:30:12
[1] 授業単元:数理科学C
[2] 問題文:URLリンク(sakuratan.ddo.jp)
の(2)
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: 指定なし
[3.3] 言語: C/C++/どちらでも可
[4] 期限:9月21日
[5] その他の制限: 制限なし
726:デフォルトの名無しさん
08/09/16 17:26:34
>>725
#include<stdio.h>
#include<math.h>
double a(int n)
{
double an;
if (n == 0) {
return 1.0;// 6角形の1辺の長さ
}
an = a(n - 1);
return (an / (sqrt(2 + sqrt(4 - (an * an)))));
}
int main(void)
{
int n = 10;
double pai;
pai = a(n) * pow(2, n) * 6 / 2;
printf("%f\n", pai);
return 0;
}
727:デフォルトの名無しさん
08/09/16 20:01:07
[1] 授業単元:計算機応用
[2] 問題文(含コード&リンク):data.txtからデータを取り出し配列に格納せよ。
また長方形の個数(data.txtの行数)も求めよ
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc (Cygwin)
[3.3] 言語: C
[4] 期限: 2008年9月17日0:00まで
[5] その他の制限: 特にないです。
data.txtの中身
---------------------------------------
a{1} = [100, 200; 200, -300; 100, -300; 200, -200]';
a{2} = [1, 2; 2, 2; 1, 1; 2, 1]';
---------------------------------------------------
data.txtの中身は
長方形名 = {長方形の頂点1のx座標, 長方形の頂点1のy座標;頂点2のx,頂点2のy;・・}
となっています。
この中から各座標を取り出し、2次元配列d[長方形の数][4]に
d[i番目の長方形][0]=小さい方のx座標
d[i番目の長方形][1]=大きいほうのx座標
d[i番目の長方形][2]=小さい方のy座標
d[i番目の長方形][3]=大きいほうのy座標
となるように格納してください。data.txtの長方形の数が変わっても対応できるようにお願いします
分かりにくい文章ですみません・・・よろしくお願いします
728:デフォルトの名無しさん
08/09/16 20:06:37
data.txtの中身を間違っていました
正しいのは
a{1} = [100, 200; 200, -300; 100, -300; 200, 200]';
a{2} = [1, 2; 2, 2; 1, 1; 2, 1]';
です
729:デフォルトの名無しさん
08/09/16 20:09:55
[1] 授業単元:C言語
[2] 問題文:文字列をchar型のポインタとして受け取り、そのポインタから10文字か、
NULL文字が現れるまで画面に1文字ずつ表示する関数を作成しなさい。
画面に1文字表示するたびに改行を入れなさい。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: 指定なし
[3.3] 言語: C
[4] 期限:9月17日午前6時
[5] その他の制限: 制限なし
お願いします。
730:デフォルトの名無しさん
08/09/16 20:38:29
void char_out(const char *str){
int i;
for(i=0;;i++){
if(str[i]=='\0' || i<10)break;
printf("%c\n",str[i]);
}
}
コンパイルしてねーから凡ミスとか知らね。
731:727
08/09/16 23:02:05
すみません。なんとか自力で解けました
スレ汚してごめんなさい
732:デフォルトの名無しさん
08/09/16 23:35:18
[1] 授業単元:C++
[2] 100文字以内の文字列をキー入力し大文字/小文字を反転して表示せよ。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:Microsoft Visual studio
[3.3] 言語: C++
[4] 期限: 9月23日
[5] その他の制限:配列[101]を使用。+32 -32で文字の変換を行う
全くのシロウトですいません;
よろしくお願いします
733:デフォルトの名無しさん
08/09/16 23:46:07
↑より素人・・・どころか問題外ですみません。
プログラムを始めようと思い、いろいろ調べましたが、
Borland C++ Compiler というソフトがいいらしいことはわかりました。
が、PCにすでにMicrosoft visual c++ 2005 Redistri butableや、
Microsoft Visual Studioといったものが入っているのですが、
これではできないのでしょうか?
スレ汚してすみません。。。
734:デフォルトの名無しさん
08/09/16 23:48:47
#include<iostream>
using namespace std;
int main(){
char str[101];
cin >> str;
for(int i=0; str[i] != '\0'; i++){
if(str[i] >= 'a' && str[i] <= 'z'){
str[i] -= 'a'-'A';
}else if(str[i] >= 'A' && str[i] <= 'Z'){
str[i] += 'a'-'A';
}
}
cout << str <<endl;
return 0;
}
735:デフォルトの名無しさん
08/09/16 23:50:29
>>733
使えるはずだけど、Visual Studioじゃいやなの?
URLリンク(park6.wakwak.com)
736:デフォルトの名無しさん
08/09/17 00:11:34
>>734
cin >> str;
ってスペースとれるっけ?
737:デフォルトの名無しさん
08/09/17 00:24:55
#include<iostream>
using namespace std;
int main(){
char str[101];
cin.getline(str,sizeof(str));
for(int i=0; str[i] != '\0'; i++){
if(str[i] >= 'a' && str[i] <= 'z'){
str[i] -= 'a'-'A';
}else if(str[i] >= 'A' && str[i] <= 'Z'){
str[i] += 'a'-'A';
}
}
cout << str <<endl;
return 0;
}
738:デフォルトの名無しさん
08/09/17 00:55:55
>>735
いいんですけど、どこから起動するのか分かりません。プログラムファイル内の
ヴィジュアルスタジオのファイルを覘いてもASP.TLBというファイルが一つあるだけです。
Borland C++は会員登録が面倒なのと、使えればヴィジュアルスタジオほうを使いたいです。
739:デフォルトの名無しさん
08/09/17 01:15:38
>>738
URLリンク(www.forest.impress.co.jp)
740: ◆ZnBI2EKkq.
08/09/17 03:52:26
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] Windows XP
[3.2] gcc
[3.3] C
[4] 期限:2008/9/19
[5]どうかお願いいたします。
741:デフォルトの名無しさん
08/09/17 08:43:10
>>739
スタートから起動できるよ
742:デフォルトの名無しさん
08/09/17 09:05:52
[1] 授業単元:画像処理
[2] 画像の平滑化を、移動平均フィルタとメディアンフィルタを用いて行うプログラム(それぞれ一つづつ)の作成
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:NetBeans
[3.3] 言語: C
[4] 期限: 9月19日 12:30
[5] その他の制限:とくにありません
プログラミング苦手で全く分かりません…よろしくお願いしますm(__)m
743:デフォルトの名無しさん
08/09/17 10:28:03
>>734
>>737
ありがとうございます。
自分なりに授業で習った<stdio.h>に少しもじって書き直したのですが
#include<stdio.h>
int main(void)
{
char str[101];
int i;
printf("100文字以内の文字列を入力してください。\n");
scanf("%s",&str);
for(i=0; i<100; i++)
{if(str[i] >= 'A' && str[i] <= 'Z'){
str[i] = str[i] + 32;
}else if(str[i] >= 'a' && str[i] <= 'z')
{
str[i] = str[i] - 32;
}
}
printf("%s\n",str);
return 0;
}
スペースを含んだ文字列がどうやってもできません;;
それとNULL文字は最後の最後で独立して指定したいのですが
どこでどう指定したらいいのかよくわかりません
ほかにも間違いがあったら指摘お願いしマス。。
スレ汚しですいません;;
744:デフォルトの名無しさん
08/09/17 11:51:07
>>743
CとC++は書き方が変わるから、正確に申告汁。
745:デフォルトの名無しさん
08/09/17 12:17:18
>>743
scanf("%s",&str);
は間違い
746:デフォルトの名無しさん
08/09/17 12:41:26
紛らわしいけど配列へのポインタだから大丈夫じゃね?
配列へのポインタは先頭の要素を指すだろうし
747:デフォルトの名無しさん
08/09/17 14:13:34
[1] 授業単元:C言語
[2] 1から11の乱数を5個発生させ、それぞれを配列に順に保存する。
この作業をn回繰り返し、1から11の各数字がどれだけ出現したかを求めよ。
また、各数字の出現割合を求めよ。
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:Microsoft Visual Studio
[3.3] 言語: C
[4] 期限: 9月18日
[5] その他の制限:特になし
下のコードまでは書けたのですが、ここから出現回数と出現割合の
求め方が分かりません。よろしくお願いします。
int array[n][5];
for(i=0;i<n;i++){
for(j=0;j<5;j++){
array[i][j]=rand()%10+1;
}
}
748:デフォルトの名無しさん
08/09/17 14:30:14
>>743
scanf("%s",&str);
よりも
scanf("%s",&str[0]);
または
scanf("%s",str);
のほうがいいと思う。(一番下が簡単)
#include<stdio.h>
#define INPUT_SIZE 100
int main(void)
{
char str[INPUT_SIZE+1];
int i;
printf("%d文字以内の文字列を入力してください。\n", INPUT_SIZE);
fgets(str,sizeof(str),stdin);
for(i=0; str[i]!='\0'; i++){
if(str[i] >= 'A' && str[i] <= 'Z'){
str[i] = str[i] + 32;
}else if(str[i] >= 'a' && str[i] <= 'z'){
str[i] = str[i] - 32;
}else if(str[i] == '\r' || str[i] == '\n'){
str[i] = '\0';
break;
}
}
printf("%s\n",str);
return 0;
}
749:デフォルトの名無しさん
08/09/17 14:43:42
>>747
5個発生させる意味がよくわからないんだけど・・・
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define N 1000
#define MAX_RAND 11
int main(){
int i,j;
int ary[N][5];
int count[MAX_RAND];
memset(ary,0,sizeof(ary));
memset(count,0,sizeof(count));
srand((unsigned int)time(NULL));
for(i=0;i<N; i++){
for(j=0; j<5; j++){
ary[i][j] = rand()%MAX_RAND + 1;
count[ary[i][j]-1]++;
}
}
for(i=0;i<MAX_RAND; i++){
printf("%5d:%5d\n",i+1,count[i]);
}
return 0;
}
750:デフォルトの名無しさん
08/09/17 15:05:12
ありがとうございます。
1:6と表示されたら、1が6回出たということですが、
この6回出たというのは、全体の何パーセントということになるのでしょうか。
751:デフォルトの名無しさん
08/09/17 15:14:09
printf("%5d:%5d\n",i+1,count[i]);
↓
printf("%5d:%5d times, %f %%\n",i+1,count[i],(double)100*count[i]/(5*N));
752:デフォルトの名無しさん
08/09/17 15:58:34
ありがとうございます。
助かりました。
もし、よろしければ100*count[i]/(5*N));という式を
どういう考えで導いたのか教えていただけないでしょうか。
数学的質問で申し訳ありません。(100を掛けるのは%に直すためなのは分かります)
753:デフォルトの名無しさん
08/09/17 16:05:41
なんていうかそこまで行くとC言語がどうこういうレベルじゃないような
754:デフォルトの名無しさん
08/09/17 16:55:32
5個の乱数を出すことを、N回繰り返すから、全部で5N個の乱数が出力されて、
i+1はcount[i]回現れる。
i+1が現れる統計的な確率はcount[i]/5N。
パーセントにすると(count[i]/5N)x100
(double)は計算式に表れる数がすべて整数なので、分子をdouble型にキャストしてあげないと小数点以下が切り捨てられてしまう。
755:デフォルトの名無しさん
08/09/17 17:08:23
>>744
失礼しました;;
>>745
>>748
ありがとうございます
助かりました
また試験前に足を運ばさせていただくかもしれませんので
そのときにまたよろしくお願いします。
756:デフォルトの名無しさん
08/09/17 23:05:56
>>754
ありがとうございます。
納得できました。
757:デフォルトの名無しさん
08/09/19 16:59:23
台形の面積を求めるプログラムなのですが
#include <stdio.h>
double menseki(double, double, double);
int main(void)
{
double = h, f1, f2, ans;
scanf("%lf", &h );
scanf("%lf", &f1);
scanf("%lf", &f2);
printf("h = %lf\n",h);
printf("f1= %lf\n",f1);
printf("f2= %lf\n",f2);
ans = menseki(h,f1,f2);
printf("Answer = %lf\n", ans);
return(0);
}
double menseki(double a, double b, double c){
return((b+c)*a/2);
}
これで、コンパイルしても成功しません。
なぜでしょうか??
758:デフォルトの名無しさん
08/09/19 17:03:17
>>757
エラーメッセージ読めよ
759:757
08/09/19 17:20:00
>>758
エラーメッセージを見てもなぜエラーが発生するかわかりませんでした。
7:宣言が正しく終了していない(関数 main )
9: 未定義のシンボル h(関数 main )
10: 未定義のシンボル f1(関数 main )
11: 未定義のシンボル f2(関数 main )
17: 未定義のシンボル ans(関数 main )
760:デフォルトの名無しさん
08/09/19 17:20:47
double = h, f1, f2, ans;
761:デフォルトの名無しさん
08/09/19 17:34:29
宣言は
型名 変数名;
=はいりませんね
762:757
08/09/19 17:36:34
>>760-761
そうでした・・・。すみません。。
ありがとうございました。
763:デフォルトの名無しさん
08/09/19 18:24:43
この程度が解決できないならプログラムを組むな、
と言いたいのが最近多い気がするけど昔からか?
764:デフォルトの名無しさん
08/09/19 18:27:55
随分と敷居が高くなったなここも
765:デフォルトの名無しさん
08/09/19 18:28:13
どう考えても昔からいます
766:デフォルトの名無しさん
08/09/19 18:43:55
最近はテンプレ無視にも寛容になったみたいだから
むしろ敷居は下がっただろ
767:デフォルトの名無しさん
08/09/19 19:05:35
>>763
スレ違いだってことだ
宿題丸投げじゃねーじゃん
768:デフォルトの名無しさん
08/09/19 19:13:36
大学の卒業研究で作っているプログラムについて質問させてください。
C++、コンパイラはgcc、動かすのはlinux上です。
データ構造の動的確保についてなのですが
すでに自分で作った mvector というデータ構造があります。
mvectorを宣言するときは
mvector mvec(DIM); //DIMはベクトルの次元を指すint型
という感じです。mvectorは事実上ただの配列やvectorと似ていますが少し機能追加(算術計算など)しています。
ここでmvectorの配列(二次元配列のような感じ)を動的確保したいのですがどうやればいいかよくわかりません。
最初は適当に
head = new (mvector(DIM))[data]; //headは先頭ポインタを受け取る子、dataは配列の数
としたのですが普通にエラーです。 mvector(DIM)[data]もエラーです。
引数をもつ子の配列というのはどう確保すればよいのでしょうか。よろしくお願いいたします。
769:デフォルトの名無しさん
08/09/19 19:15:35
vector使えよ
770:デフォルトの名無しさん
08/09/19 19:44:03
new ((mvector(DIM))[data]); ではどうよ
771:デフォルトの名無しさん
08/09/19 22:51:01
ユーザー定義型のインスタンスを要素とする配列をnewで確保した場合、
各要素の引数付きコンストラクタを呼ぶことは出来ない。
デフォルトコンストラクタが呼ばれる仕様。
772:デフォルトの名無しさん
08/09/19 22:57:25
テンプレート引数の出番か。
まぁ、無理に new[] を使うよりは、vector使うべきだとは思うが。
#include <iostream>
template<int dim>
class mvector
{
int m_dim;
public:
mvector() : m_dim(dim){}
int get_dim(){ return m_dim;}
};
int main()
{
mvector<3> *head = new mvector<3>[10];
...
delete[] head;
return 0;
}
773:デフォルトの名無しさん
08/09/19 23:18:20
既存のデータ構造を変えたくなければ、配列をインスタンスじゃなくポインタにするのも手。
でも初期化と解放の両方で、各要素の構築/解放が必要になって手間。
mvector **head = new mvector*[data];
//確保
for(int i=0; i<data; i++) head[i] = new mvector(DIM);
//解放
for(int i=0; i<data; i++) delete head[i];
delete[] head;
774:デフォルトの名無しさん
08/09/19 23:28:48
mvectorの内部バッファをコンストラクタじゃなくて
別途メンバ関数で割り当てできるようにするのが
一番スマートかもしれない。
mvector *head = new mvector[data];
for(int i=0; i<data; i++) head[i].alloc(DIM);
...
delete[] head;
775:デフォルトの名無しさん
08/09/20 12:14:38
>>769-774
ありがとうございます。にわかに理解できない部分もありますが勉強になります。ちょっと要勉強というか要解読です。
newを使わずにstd::vectorを使えばだいぶ簡単にすることが出来るのでしょうか?
new自体にこだわりはないのでもしvectorで簡単に実現で切るならばうれしいです。
作ろうとしているmvectorの配列mvarrayは現在以下のようです。
class mvarray{ //mvector の配列みたいなデータ構造
private:
int _data;
mvector* head;
public:
mvarray(int data){ //コンストラクタ、これが困ってる
head = new mvector[data];
_data = data;
}
mvector* th(int n){ //二次元配列のn番目の配列を返す感じのもの。th は 4th,5th,のth.
return (head + n);
}
int data(){ retrun _data;}
}
長々と申し訳ないですが、もう少しだけお願いいたします。
776:デフォルトの名無しさん
08/09/20 12:20:25
std::vector<std::vector<mvarray> > mvec(DIM, std::vector<marray>())
んでコンストラクタではなく>>774のように初期値を後から与える
vectorならresize()が使えるから後からサイズを変えてもいいし
777:デフォルトの名無しさん
08/09/20 23:51:58
[1] 授業単元: ソフトウエア実習
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン: ボーランド
[3.3] 言語: C
[4] 期限: 明日中
どうかお願い致します。
778:775
08/09/21 00:12:02
みなさんのおかげでうまく実装できました!
本当にありがとうございます。助かりました。
また困ったことが会ったらよろしくお願いいたします。
779:デフォルトの名無しさん
08/09/21 12:20:54
>>777 (1)
#include<stdio.h>
#define DATA_NUM 12
int main(int argc, char *argv[]){
char *filename_in, *filename_out;
FILE *fp_in, *fp_out;
int i, array[DATA_NUM]={0};
if(argc!=3){
fprintf(stderr, "\nUsage: %s filename_in filename_out\n", argv[0]);
return 0;
}
filename_in=argv[1];
filename_out=argv[2];
fp_in=fopen(filename_in, "r");
if(fp_in==NULL){
fprintf(stderr, "\nERROR: %s cannot open.\n", filename_in);
return 1;
}
fp_out=fopen(filename_out, "wb");
if(fp_out==NULL){
fprintf(stderr, "\nERROR: %s cannot open.\n", filename_out);
fclose(fp_in);
return 2;
}
for(i=0;i<DATA_NUM;i++){
fscanf(fp_in, "%d", &array[i]);
}
fwrite(array, sizeof(int), DATA_NUM, fp_out);
fclose(fp_in);
fclose(fp_out);
return 0;
}
780:デフォルトの名無しさん
08/09/21 12:22:45
>>777 (2)
#include<stdio.h>
#define DATA_NUM_MAX 100
int main(int argc, char *argv[]){
char *filename_in, *filename_out;
FILE *fp_in, *fp_out;
int data_num, array[DATA_NUM_MAX]={0};
if(argc!=3){
fprintf(stderr, "\nUsage: %s filename_in filename_out\n", argv[0]);
return 0;
}
filename_in=argv[1];
filename_out=argv[2];
fp_in=fopen(filename_in, "r");
if(fp_in==NULL){
fprintf(stderr, "\nERROR: %s cannot open.\n", filename_in);
return 1;
}
fp_out=fopen(filename_out, "wb");
if(fp_out==NULL){
fprintf(stderr, "\nERROR: %s cannot open.\n", filename_out);
fclose(fp_in);
return 2;
}
for(data_num=0;data_num<DATA_NUM_MAX;data_num++){
if(fscanf(fp_in, "%d", &array[data_num])!=1) break;
}
fwrite(array, sizeof(int), data_num, fp_out);
fclose(fp_in);
fclose(fp_out);
return 0;
}
781:デフォルトの名無しさん
08/09/21 12:34:37
>>777 (3)
#include<stdio.h>
#define DATA_NUM_MAX 100
int main(int argc, char *argv[]){
char *filename_in, *filename_pos_out="p.txt", *filename_neg_out="n.bin";
FILE *fp_in, *fp_pos_out, *fp_neg_out;
int i, data_num, array[DATA_NUM_MAX]={0};
if(argc!=2){
fprintf(stderr, "\nUsage: %s filename_in\n", argv[0]);
return 0;
}
filename_in=argv[1];
if((fp_in=fopen(filename_in, "r"))==NULL){
fprintf(stderr, "\nERROR: %s cannot open.\n", filename_in);
return 1;
}
for(data_num=0;data_num<DATA_NUM_MAX;data_num++) if(fscanf(fp_in, "%d", &array[data_num])!=1) break;
fclose(fp_in);
fp_pos_out=fopen(filename_pos_out, "w");
fp_neg_out=fopen(filename_neg_out, "wb");
if(fp_pos_out==NULL || fp_neg_out==NULL){
fprintf(stderr, "\nERROR: %s or %s cannot open.\n", filename_pos_out, filename_neg_out);
return 2;
}
for(i=0;i<data_num;i++){
if(array[i]>0) fprintf(fp_pos_out, "%d ", array[i]);
if(array[i]<0) fwrite(&array[i], sizeof(int), 1, fp_neg_out);
}
fclose(fp_pos_out);
fclose(fp_neg_out);
return 0;
}
782:デフォルトの名無しさん
08/09/21 14:47:15
>>781
ありがとうございます
(1)(2)(3)すべて実行すると、出力に「Usage: 自分のPCの名前 filename_in filename_out」と表示されましたが
書き込み用のファイルを確認した所、値が書き込まれておらず「・・・・」と点が並んでいるだけです
何故でしょうか・・・?
783:デフォルトの名無しさん
08/09/21 17:14:29
>>782
バイナリエディタで開け
784:デフォルトの名無しさん
08/09/21 21:13:43
>>783
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 00
09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00 00 00
となっていてきちんと正常でした。お手数かけましてすみません
ありがとうございました!
785:デフォルトの名無しさん
08/09/22 10:24:12
ん?それ負数じゃないな?
786:デフォルトの名無しさん
08/09/22 17:57:52
1] 授業単元: C言語
[2] 問題文:auto関数とstatic関数の違いが分かるプログラムを作成しなさい、ただしfor文を使用する
[3] 環境
[3.1] OS:Win
[3.2] 任意
[3.3] 言語: C
[4] 期限: 2008年9月25日13:00まで
できればプログラムは短くコンパイルして結果が長くならないようなものでお願いします
787:デフォルトの名無しさん
08/09/22 18:05:58
変数じゃねーのか?
788:786
08/09/22 18:40:59
ごめん
関数じゃなくて変数でした^^;
789:デフォルトの名無しさん
08/09/22 18:48:57
>>786
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < 10; i++) {
int j = 0;
static int k = 0;
printf("j = %d, k = %d\n", j, k);
j++; k++;
}
return 0;
}
こんなんでいいか?
790:デフォルトの名無しさん
08/09/22 18:50:12
>>786
#include <stdio.h>
void Count()
{
auto int a = 0;
static int s = 0;
printf("a = %d, s = %d\n", a++, s++);
}
int main()
{
int i;
for(i = 0; i < 10; i++)
Count();
return 0;
}
791:デフォルトの名無しさん
08/09/22 19:19:29
>>789>>790
あり
やっぱりC勉強するんだったら家に環境整えたほうがいいのかな
792:デフォルトの名無しさん
08/09/22 19:45:42
言わずとも揃えるべき
793:デフォルトの名無しさん
08/09/22 19:53:22
>>791
sshとかで学校につなげてプログラミングするとか手段はあるぞ。
794:デフォルトの名無しさん
08/09/23 00:01:13
[1] 授業単元: ディジタル信号処理
[2] 問題文(含コード&リンク): URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: Windows vista
[3.2] コンパイラ名: Microsoft Visual Studio 2005
[3.3] 言語:C
[4] 期限: 9月24日
よろしくお願いします
795:デフォルトの名無しさん
08/09/23 01:25:27
[1] 授業単元:プログラミング応用
[2] 問題文(含コード&リンク):
ファイルを読み込んで読み込んだファイルの
コメントが関数内で閉じられているかチェックするツールを作る
例
#include <stdio.h>
int main(void)
{
int a = 0;
printf("aは%dです",a);
/*コメント
return 0;
}
/*プログラム終わり*/
↑こうなっていた場合に「/*コメント」と書かれている部分の行を指摘する
/**/が関数内で閉じられているかのチェック
実行はコマンドプロンプト
出力はprintf
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc 3.4
[3.3] 言語:C
[4] 期限: 9/26
[5] その他の制限: 制限は特にありません。
[6]備考:fopenした後からの処理でいいので教えてもらえると幸いです。
796:デフォルトの名無しさん
08/09/23 01:48:26
[1] 授業単元: 情報
[2] 問題文:商品の値段と支払額を入力し、お釣りの貨幣の種類/枚数を表示。
例) 2800円の商品に3000円支払い
-> \10000:0枚 \5000:0枚 \1000:0枚 \500:0枚 \100:2枚 \50:0枚 \10:0枚 \5:0枚 \1:0枚
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: ?
[3.3] 言語: C
[4] 期限: 9/26(金)
[5] その他の制限:if、printf、scanf、四則演算+-*/のみ習いました。シンプルな回答がベストです。
宜しくお願い致します。
797:デフォルトの名無しさん
08/09/23 03:15:03
>>796
#include <stdio.h>
int kinds_of_money[] = { 10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1, };
int num_of_money[sizeof kinds_of_money / sizeof kinds_of_money[0]] = { 0 };
int main()
{
int bill = 0;
int payment = 0;
int change = 0;
int i = 0;
puts( "請求額は?" );
scanf( " %d", &bill );
puts( "支払額は?" );
scanf( " %d", &payment );
if ( bill > payment ) {
puts( "足りんわwwww" );
return 1;
}
for ( i = 0, change = payment - bill; change > 0; i++ ) {
num_of_money[i] = change / kinds_of_money[i];
change = change % kinds_of_money[i];
}
for ( i = 0; i < sizeof kinds_of_money / sizeof kinds_of_money[0]; i++ ) {
printf( "\\%d:%d枚 ", kinds_of_money[i], num_of_money[i] );
}
return 0;
}
798:デフォルトの名無しさん
08/09/23 03:53:24
>>795
URLリンク(kansai2channeler.hp.infoseek.co.jp)
エラー処理省きまくった。
799:798
08/09/23 03:57:54
>>795
URLリンク(kansai2channeler.hp.infoseek.co.jp)
>>798は無視で。
800:798
08/09/23 04:02:30
>>795
もうぐだぐた。
>>799を訂正。
stack[count++] = line;
→
if ( ( count == 0 ) || ( stack[count - 1] != line ) ) {
stack[count++] = line;
}
801:デフォルトの名無しさん
08/09/23 08:04:34
[1]C文解釈中級
[2]次の文章を行単位に並べ替えて、コンパイルが通るようにして、この文章を実行した時の処理仕様
を100字以内にまとめなさい。コンソールで実際にコンパイルして実行してみた結果も添えてメールしなさい。
idx = strlen(label);
#include <string.h>
p = strchr(label, *src);
if(p) count[p - label]++;
for( ; *src != '¥0'; src++){
p = strchr(buf, '¥n');
*dst = '¥0';
void alphabetsort(char *dst, const char *src)
for(i = 0; i < 256; i++) while(count[i]-- > 0){ *dst = label[i]; dst++; }
if(p) *p = '¥0';
int count[256] = {0}, idx, i;
return 0;
char buf[100], dst[100], *p;
alphabetsort(dst, buf);
int main(void)
{
}
#include <stdio.h>
fgets(buf, sizeof(buf), stdin);
char *p, label[256] = " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
else{ label[idx] = *src; count[idx] = 1; idx++; }
printf("%s¥n", dst);
{
}
}
[3]1.Linux 2.GCC 3.C言語
[4] 2008/09/30 15:00までにメール
まったくわかりません。よろしくです
802:デフォルトの名無しさん
08/09/23 09:40:04
>>801
#include <stdio.h>
#include <string.h>
void alphabetsort(char *dst, const char *src)
{
int count[256] = {0}, idx, i;
char *p, label[256] = " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ";
idx = strlen(label);
for( ; *src != '\0'; src++){
p = strchr(label, *src);
if(p) count[p - label]++;
else{ label[idx] = *src; count[idx] = 1; idx++; }
}
for(i = 0; i < 256; i++) while(count[i]-- > 0){ *dst = label[i]; dst++; }
*dst = '\0';
}
int main(void)
{
char buf[100], dst[100], *p;
fgets(buf, sizeof(buf), stdin);
p = strchr(buf, '\n');
if(p) *p = '\0';
alphabetsort(dst, buf);
printf("%s\n", dst);
return 0;
}
803:デフォルトの名無しさん
08/09/23 15:20:03
[1] 授業単元: if文がテーマです
[2] 問題文:アラビア数字を入力→ローマ数字に変換して表示
〔ex.〕5→V 111→CXI 1000→M
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: ?
[3.3] 言語: C
[4] 期限: 9/25(木)
[5] その他の制限:if、printf、scanf、+-*/%のみで簡潔に作成
804:デフォルトの名無しさん
08/09/23 16:10:26
>>803
4はIV、IIIIどっち(減算則も考慮するのか)
805:デフォルトの名無しさん
08/09/23 16:20:17
>>803
#include <stdio.h>
void func(int n, char I, char V, char X)
{
if (n == 1) printf("%c", I);
if (n == 2) printf("%c%c", I, I);
if (n == 3) printf("%c%c%c", I, I, I);
if (n == 4) printf("%c%c", I, V);
if (n == 5) printf("%c", V);
if (n == 6) printf("%c%c", V, I);
if (n == 7) printf("%c%c%c", V, I, I);
if (n == 8) printf("%c%c%c%c", V, I, I, I);
if (n == 9) printf("%c%c", I, X);
}
int main()
{
int tho, han, dec, mon, x;
printf("%s", "数字を入力してください\n");
scanf("%d", &x);
tho = x / 1000;
han = x % 1000 / 100;
dec = x % 100 / 10;
mon = x % 10;
func(tho, 'M', '*', '+');
func(han, 'C', 'D', 'M');
func(dec, 'X', 'L', 'C');
func(mon, 'I', 'V', 'X');
return 0;
}
806:デフォルトの名無しさん
08/09/23 18:47:34
>>803 IVでもIIIIでもどちらでも構いません。
>>804 早速の対応有難うこざいます。
void funcなどは習っていないため、出来ればvoid main()で始まる形に
していただけると有り難いのですが…。よろしくお願いします。
807:デフォルトの名無しさん
08/09/23 18:58:27
>>806
>if、printf、scanf、+-*/%のみで簡潔に作成
forやwhileもだめなんだよね
808:デフォルトの名無しさん
08/09/23 19:33:32
>>806
とりあえず関数にまとめてた部分を展開しておいたよ
URLリンク(kansai2channeler.hp.infoseek.co.jp)
809:デフォルトの名無しさん
08/09/23 19:34:58
もはや %c の意味がほとんどないなw
810:デフォルトの名無しさん
08/09/23 22:53:42
[1]プログラミング実習
[2](1)単純洗濯法を用いて人口の多い県から順にソートせよ
(2)バブルソートを用いて人口密度の大きい県から順にソートせよ
北海道 83461 5692
青森 9606 1482
東京 2186 11772
愛知 5150 6868
大阪 1892 8797
[3] windows/dev-c++4.9.9.2/cのみ
[4] 9月中
[5] 配列・if・while・for・プロトタイプ関数まで既習
811:デフォルトの名無しさん
08/09/23 22:55:56
用語がwww
812:デフォルトの名無しさん
08/09/23 22:56:38
>>810
そのデータの取り込み方は自由なの?
ソースに埋め込んじゃっておk?
標準入力にすべき?
813:デフォルトの名無しさん
08/09/23 23:10:02
バブルで洗濯?
814:デフォルトの名無しさん
08/09/23 23:12:00
洗濯→選択ですね すみません
標準入力でお願いします
815:デフォルトの名無しさん
08/09/23 23:27:52
県じゃないのがある…という突っ込みはナシ?
816:795
08/09/24 01:52:00
>>800
考えてもらいありがとうございます。
しかし、そのプログラムだと
#include <stdio.h>
int main(void)
{
int a = 0;
printf("aは%dです",a);
/*コメント1
/*コメント2*/
/*コメント3
return 0;
}
/*プログラム終わり*/
となったときに「/*コメント1」の行も検出してしまう
と思ったのですが、平気でしょうか?
わざわざ考えてもらったのに
文句が多くてすみません。
817:デフォルトの名無しさん
08/09/24 02:05:03
[1] C
[2] CSVファイルを構造体へ全て格納後、別ファイルへ出力せよ。
(CSVファイルフォーマットは任意とし、行数は可変とする)
[3] WIN/gcc/C
[4] 2008/09/26
CSV読み込み、出力は出来たのですが……
CSVの中身を一度全て格納しなければならず、そこで困っております。
構造体の配列を定義して、足りなくなったらreallocして行けばいいのしょうか?
818:デフォルトの名無しさん
08/09/24 02:16:40
>>817
読み込みができてるならそのサイズでmallocすればいいじゃないか
819:デフォルトの名無しさん
08/09/24 02:28:36
>>818
なんと言いますか、C++などのArrayみたいなことをしたいのです。
構造体の配列にCSVファイルを全部保存したいのですが、
ファイル行数が可変のために、行数に応じて構造体の配列数を増やして行く方法しかないのかなと疑問に思っております。
ファイルが大きいとreallocするときに時間がかかりそうなので……
820:デフォルトの名無しさん
08/09/24 02:35:32
>>819
Cで可変長配列的なことしたいなら、malloc/reallocするしかないよ。
今回の件なら、最初に一度ファイル全体を空読みして、行数だけ数えてから行数分mallocして、
2度目のファイル読みで格納ってすれば、reallocの無駄は省ける。
けど、代わりにファイル2度読みのコストがかかるから、どちらのコストをとるかだね。
821:デフォルトの名無しさん
08/09/24 02:41:49
100Kずつ確保
822:デフォルトの名無しさん
08/09/24 02:42:45
配列が連結していないといけない訳でもあるか?
823:デフォルトの名無しさん
08/09/24 02:47:52
配列で無きゃだめなの?リストを使う問題かと思ったんだが
824:デフォルトの名無しさん
08/09/24 02:54:00
>>820
やはり可変だと、メモリ確保し続けるか、必要分を確認してとかではないと
辛いみたいですね、ありがとうございます。
>>821
無駄なメモリ領域を出来るだけ省きたいのです
>>822
特にはないですが、ポインタの配列にするほうがいいでしょうか?
>>823
Cにリストってありましたっけ?
825:デフォルトの名無しさん
08/09/24 02:55:32
無駄を省きたいのなら10Kずつ確保でいいだろう。
たらなくなったら10Kずつ増やしていく
826:デフォルトの名無しさん
08/09/24 03:00:49
>>825
10Kに満たないと勿体なくないですか?
気分の問題だと思うのですが、ピッタリにしたいんです。
>>823
リストを調べました、リスト構造のことで間違いないでしょうか?
難しそうですが、これならやりたいことが出来そうです。
ありがとうございました。
>レスしてくださった方々へ
malloc/reallocなら簡単そうですが、やはりコスト的な問題があるようなので、
難しそうですがリスト構造を勉強して、それで対応してみます。
深夜にもかかわらず、助けていただいてありがとうございました。
827:デフォルトの名無しさん
08/09/24 03:02:49
まあ、他言語の可変長配列だって結局malloc/reallocと同じことしてるわけだから
reallocをそんなに嫌わないであげてください><
828:デフォルトの名無しさん
08/09/24 03:04:37
>>826
そしたら、あらかじめファイルサイズを求めておいて、バイナリでそのまま読み込めよ
ぴったりだぞ
829:デフォルトの名無しさん
08/09/24 03:05:42
>>826
これは実装依存だが、malloc(13);とかやったとしても実際の確保領域は16バイトだったりするよ。
嫌なら要素一回ずつreallocするしかないけど、パフォーマンスが落ちるし、無駄が出るよ。
830:デフォルトの名無しさん
08/09/24 03:07:09
ファイルの行数を先に取得して一括でmallocすればいいことじゃないのか?
可変にこだわる意味がわからないのだが
ところでC++のArrayってなんだ?
std::vectorのことならかなり豪快にメモリ確保してるぞ
831:デフォルトの名無しさん
08/09/24 03:13:06
こういう時って、やっぱりみんなテラバイト超のファイルもプロセスできるように作ってる?
832:デフォルトの名無しさん
08/09/24 03:17:55
>>827
行数増えた場合大変なことになりそうなのです
>>828
ファイルそのままだと使いづらいじゃないですか……
って確かに、そう考えると10Kつづ確保して行ってもいい気がしてきました。
>>829
mallocは指定した分だけ確保だと思ってました。
実際は(多少?)誤差があるんですね、勉強になりました。
>>830
それのことです。
なるほど……便利だと思ってたのですが、裏では結構あくどいことしてるんですね。
833:デフォルトの名無しさん
08/09/24 10:42:40
>>832
あくどいっつーかきっちり確保するよりおおむね効率がいいからだな
誤解するなよ
834:デフォルトの名無しさん
08/09/24 14:07:01
[1] 授業単元:映像処理
[2] 問題文(含コード&リンク):太陽系プログラム
planet.cのプログラムを以下のように発展させよ。
①オブジェクトの色を変更する
②オブジェクトをソリッドにする
③他のオブジェクト形状を使用する。(例:惑星を立方体にする)
④隠面処理を行う。
⑤惑星に(その惑星の周囲をまわる)衛星をつける。
⑥2個のパーツを組み合わせたオブジェクトを作る。(例:土星)
⑦色、光沢などの表面属性を時間経過で変化するようにする。(例:時間とともに色が自動的に変化する)
⑧複数の軌道面がある。
///planet.c///
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC
[3.3] 言語:C
[4] 期限:9月28日
丸投げです。よろしくお願いいたします。
835:デフォルトの名無しさん
08/09/24 16:19:49
>>834
4までやった
URLリンク(kansai2channeler.hp.infoseek.co.jp)
836:デフォルトの名無しさん
08/09/24 17:14:47
ついでにmallocも効率やら扱いやすさのためであって意図的。
誤差というべきではない。
837:834
08/09/24 17:28:33
>>835
提出の条件が⑧まで完成したプログラムですので、
できれば⑧まで作って頂けませんでしょうか。
せっかく作って貰ったのに、すいません・・・
838:デフォルトの名無しさん
08/09/24 17:38:09
学校でOpenGLなんてやるのか
へーおじさんびっくりだわ
839:デフォルトの名無しさん
08/09/24 17:59:17
どうせGLUTだろ
840:835
08/09/24 18:26:06
>>837
暇で面白そうだからやっただけ
気が向いたら残りもやるかもしれないがあてにしないほうがいい
841:798
08/09/24 22:42:13
>>816
そういうのを検出するプログラムじゃないの?
/*コメント1の行の検出はNGで
/*コメント3の行の検出のみやれってこと?
その場合、検出しなきゃいけない行の基準がわからないんだけど?
>>795で示している例でも/*コメントから始まって、プログラム終わり*/で
コメントはちゃんと閉じているよね?