08/09/01 17:24:29
>>481
返信、ありがとうございます。
問題の書き方が言葉足らずだったようです。
URLリンク(www.orchid.co.jp) の
上のプログラムのような計算をし、かつ負数を取り扱えるような
ソースを書きたいのです。
483:デフォルトの名無しさん
08/09/01 17:38:28
int main(void){
int a = -10;
char buf16[16];
memset(buf16, 0x00, 16);
for (int i = 0; i < 15; i++){
buf16[14 - i] = "0123456789abcdef"[a & 0xF];
a >>= 4;
}
a = -10;
char buf8[16];
memset(buf8, 0x00, 16);
for (int i = 0; i < 15; i++){
buf8[14 - i] = "01234567"[a & 0x7];
a >>= 3;
}
}
484:ぱそこん
08/09/01 18:16:42
1授業単元;C言語
2問題文;抽選プログラム(定員、募集人数をキーボードから入力し、乱数を発生させて数値の重複のないように定員分のランダムな数値を求める。
そして、その発生した数値を昇順と、発生した順にそれぞれ出力する。)
3環境
4OS:widows xp またはLinuxでもok
5期限:できれば明日中(本当に急いでます!)
6その他;flg、do while文は必ず用いる。
C言語かなりの初心者です。
485:デフォルトの名無しさん
08/09/01 20:33:27
問題文:配列bufferの文字列の中にあるカンマを水平タブに変換して、配列strafterに
格納し表示させよ。
OS:Linux Fedora8
コンパイラ:gcc(バージョン失念。Fedora8のデフォルトのものです。
コメント:エラー吐きまくりで動作しません。助けて下さいorz
以下、現状のソース
-------------------
#include<stdio.h>
#include<string.h>
int main(void){
char buffer[512]="2000/01/01,9:00:00,AAA BBB CCC";
char repchar[1];
int i;
int buflen;
char strafter[512];
strafter[0]='\0';
repchar[0]='\t';
buflen = strlen(buffer);
printf("文字数 = %d\n",buflen);
printf("Before : %s\n",buffer);
for(i = 0; i < buflen ; i++){
i = i-1;
if(*(buffer+i) == ','){
strcat(strafter,repchar);
}
else{
strcat(strafter,(buffer +i));
}
}
printf("%s\n",strafter);
}
486: ◆O/vs7BIw1Y
08/09/01 20:50:30
[1] 授業単元:プログラミング
[2] 問題文:URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2008/09/15
[5] その他の制限: 標準ライブラリのみ使用
よろしくおねがいします。
487:デフォルトの名無しさん
08/09/01 20:58:08
>>485
repcharが文字列でないからじゃないかな
strcat(strafter,repchar);
面倒なのでこれでいいだろ
#include <stdio.h>
int
main()
{
char buffer[512] = "2000/01/01,9:00:00,AAA BBB CCC";
char strafter[sizeof(buffer)] = {0};
{ int i = 0;
while ( buffer[i] != '\0' ) {
strafter[i] = ( buffer[i] == ',' ) ? '\t' : buffer[i];
++i;
}}
printf("%s\n", strafter);
return 0;
}
488:485
08/09/01 21:43:21
>>487さん
ありがとうございます。
こんなやり方でいけるんですね。
C言語本格的に初めて5日目くらいですが,頑張らねばorz
489:
08/09/01 22:37:27
467のものです。
>>468
>>470
でやってもらったのですが、構造体を使えとさらに指示が出まして…
構造体を使ってやっていただきたいです。
ファイル処理はバイナリではなく、w,r,a,(a+)などでお願いします。
490:抽選プログラム
08/09/01 22:48:16
[1]授業単元;C言語
[2]問題文;抽選プログラム(定員、募集人数をキーボードから入力し、乱数を発生させて数値の重複のないように定員分のランダムな数値を求める。
そして、その発生した数値を昇順と、発生した順にそれぞれ出力する。)
[3]環境:gcc
[4]OS:widows xp またはLinuxでもok
[5]期限:できれば明日中(本当に急いでます!)
[6]その他;flg、do while文は必ず用いる。
C言語かなりの初心者です。
491:デフォルトの名無しさん
08/09/01 23:11:11
「ビンゴ プログラム C言語」くらいでググレ
492:デフォルトの名無しさん
08/09/01 23:42:48
>>490
URLリンク(kansai2channeler.hp.infoseek.co.jp)
鬱だ死
493:抽選プログラム
08/09/02 00:14:50
492さんありがとうございます!!
よかったらプログラムに書いてあるコメントを日本語で書いていただけないでしょうか汗
英語分からないんです涙
494:デフォルトの名無しさん
08/09/02 00:22:02
辞書引けよ・・・
495:ロベ
08/09/02 09:33:09
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
インテルHEX形式をモトローラSレコード形式に変換するプログラムを作成しなさい
~条件~
・通常の形式はS1レコードに変換する
・セグメントアドレスがあった場合はS2レコードに変換する
・拡張リニアアドレスがあった場合はS3レコードに変換する
・途中でセグメント/リニアアドレスが出てくる場合でも、最初からS2/S3レコードで出力すること(S1~S3の混合はNG)
・セグメント/リニアアドレス両方あった場合は、S3レコードとする
・スタートアドレスは考慮しなくてもよいものとする
・S0(スタートレコード)は出力しなくてもかまわない
・S4~S6は今回考慮しなくてもよい
・プログラム中でポインタを必ず使用すること
・ソース内にはコメントを表記すること
[3] 環境
[3.1] OS:Windows
[3.2] borland
[3.3] 言語:C言語
[4] 期限:9月4日0:00まで
[5] その他の制限:特になし
よろしくお願いします
496:デフォルトの名無しさん
08/09/02 10:02:19
あまりに難易度が高くてまったく分からない!
497:デフォルトの名無しさん
08/09/02 10:37:37
出てくる単語が分からないだけじゃない?
別に難易度高くないから調べてみたら?勉強になるし。
498:デフォルトの名無しさん
08/09/02 11:57:01
[1] 授業単元: 応用数学
[2] 問題文(含コード&リンク): 入力された関数を微分するプログラムを作れ
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 2008年9月10日まで
---実行例(<>内は入力)--
enter equation> <3x^4 + sin(x)^2>
derivative is
12x^3 + sin(2x)
------------------
高次項・三角関数・合成関数に対応させるのが条件です
499:デフォルトの名無しさん
08/09/02 21:32:48
[1] テキストからファイル出力でログインの認証システムを作る課題です。
ログイン後はユーザの新規登録・削除・変更、一覧と紹介(絞込み)が可能なもの。
①ユーザID/パスワード入力
②ユーザテーブルチェック・エラー処理・メニュー処理へ
【出力画面】
Uidを入力してください
○○
Pwdを入力してください
○○
Uid: ○○
Pwd: ○○
担当者: ○○
会社コード: ○○
アクセス区分: ○○
e-mail: ○○
1.照会(絞込み) 2.一覧 3.新規、変更、削除 4.ログアウト
終了しますか? (y,n)
【テキストの内容】
会社コード 担当者 ユーザID アクセス区分 e-mail
001 山田 太郎 u001 1 yamada@co.jp
002 山田 花子 u002 2 hanako@co.jp
003 田中 次郎 u003 3 tanaka@co.jp
というようなプログラムにします。
頑張りましたがどうしても無理でした。。
申し訳ないですが、どうかよろしくお願いしますm(__)m
[2.1] OS:WindowsXp
[2.2] Visial C++
[2.3] 言語: C++
[3] 期限:2008年9月3日
500:デフォルトの名無しさん
08/09/03 00:23:04
>499
ひまなので
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace baka1
{
class Program
{
static string[,] users = {
{"uid1", "pwd1","諡�蠖楢�蜷�","莨夂、セ繧ウ繝シ繝牙錐","繧「繧ッ繧サ繧ケ蛹コ蛻�蜷�","繧√k縺ゅ←"},
{"uid1", "pwd1","諡�蠖楢�蜷�","莨夂、セ繧ウ繝シ繝牙錐","繧「繧ッ繧サ繧ケ蛹コ蛻�蜷�","繧√k縺ゅ←"},
};
static void Main(string[] args)
{
for (int i = 0; i < users.Length; i++)
{
if (users[i, 0] == args[0] && users[i, 1] == args[1])
{
Console.WriteLine("user驟榊�励�ョi逡ェ逶ョ繧偵�励Μ繝ウ繝�");
}
}
}
}
}
501:デフォルトの名無しさん
08/09/03 00:24:20
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace baka1
{
class Program
{
static string[,] users = {
{"uid1", "pwd1","担当者名","会社コード名","アクセス区分名","めるあど"},
{"uid1", "pwd1","担当者名","会社コード名","アクセス区分名","めるあど"},
};
static void Main(string[] args)
{
for (int i = 0; i < users.Length; i++)
{
if (users[i, 0] == args[0] && users[i, 1] == args[1])
{
Console.WriteLine("user配列のi番目をプリント");
}
}
}
}
}
502:デフォルトの名無しさん
08/09/03 00:37:15
>>500>>501
コラw
503:デフォルトの名無しさん
08/09/03 09:51:54
そのままコピペするとUTF-8になっちゃうことあるよなw
504:デフォルトの名無しさん
08/09/03 17:34:53
ここってプログラムに関する質問じゃなくて、プログラムを作ってもらうのってありですか?
505:デフォルトの名無しさん
08/09/03 17:38:27
>>504
高いよ
506:デフォルトの名無しさん
08/09/03 17:43:19
宿題スレで聞いてるってことは宿題か?
このスレずっとさかのぼってみてみるといい。
507:デフォルトの名無しさん
08/09/03 17:56:44
誰か>>499を答えて下さる方いませんでしょうか?
他力本願で情けないのですが今の僕のレベルではお手上げ状態です(>_<)
508:デフォルトの名無しさん
08/09/03 18:42:40
お手上げなら正直に単位落とせばいいのに…
509:デフォルトの名無しさん
08/09/03 19:37:34
>>508
それはできません(>_<)どうか本当にお願いします(>_<)
510:デフォルトの名無しさん
08/09/03 20:12:17
>>509
マジレスすると、その機能を無料で作ってくださいとかありえない。
511:デフォルトの名無しさん
08/09/03 20:28:16
>>509
そうですか…。自力で作るしか方法は無いのですね。
わかりました、ご指摘いただいてありがとうございましたm(__)m
512:デフォルトの名無しさん
08/09/03 20:33:20
.
513:デフォルトの名無しさん
08/09/03 22:46:57
[1] 授業単元:C言語実習
[2] 問題文(含コード&リンク):
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
[3.1] OS:Windows XP
[3.2] コンパイラ名とバージョン:Borland
[3.3] 言語:C言語
[4] 期限:日付変更辺りまで
どうか宜しくお願いします。
514:デフォルトの名無しさん
08/09/03 23:02:30
>>513
#include <stdio.h>
#include <math.h>
int main(void)
{
FILE *fp_in, *fp_out;
char *filename_in="louise.dat", *filename_out="site.dat";
int x;
if((fp_in=fopen(filename_in, "r"))==NULL) return 1;
if((fp_out=fopen(filename_out, "w"))==NULL) return 2;
while(fscanf(fp_in, "%d", &x)==1)
{
fprintf(fp_out, "%f\n", sqrt(x));
}
fclose(fp_in);
fclose(fp_out);
return 0;
}
515:デフォルトの名無しさん
08/09/03 23:27:08
>>514
回答ありがとうございます。
ですが()を2重にしたり、NULLやreturn 0;以外のreturnの使い方を習っておりません・・・。
他にどんな書き方があるか聞いても良いでしょうか?
516:デフォルトの名無しさん
08/09/03 23:32:39
>>515
if((fp_in=fopen(filename_in, "r"))==NULL) return 1;
↓
fp_in=fopen(filename_in, "r");
if(fp_in==NULL) return 0;
517:デフォルトの名無しさん
08/09/03 23:44:50
>>516
ほう・・・カッコを外すと1が0になるのか・・・
518:デフォルトの名無しさん
08/09/03 23:52:07
return 0; 以外使えないなら仕方ない
519:デフォルトの名無しさん
08/09/04 01:48:04
>>517
揚げ足とることに必死で515をちゃんと読めてないw
520:デフォルトの名無しさん
08/09/04 07:47:02
if(fp_in==NULL) return 0;
↓
if(!fp_in) return 0;
521:デフォルトの名無しさん
08/09/04 09:52:49
>>520
なぜわざわざ可読性を下げる?
522:デフォルトの名無しさん
08/09/04 10:00:03
加毒性いうほどのもんじゃない
523:デフォルトの名無しさん
08/09/04 10:01:27
522は大規模な開発したことないんだな
524:デフォルトの名無しさん
08/09/04 11:50:53
慣用句とか知ってる?
525:デフォルトの名無しさん
08/09/04 12:05:34
それで可読性下がるなんて経験値低すぎる。
うちのコーディング規約でもif (!hoge)だし。
526:デフォルトの名無しさん
08/09/04 12:17:11
仕事なんかでは統一されていれば問題無いと思うが、
このスレは経験値低すぎる人が質問するスレだから不適切だな
527:520
08/09/04 12:18:41
>>521
>>515でNULLの使い方を習ってないと書いてたのでこうしました
528:デフォルトの名無しさん
08/09/04 12:22:51
次は!を習ってないと言われるわけですね
529:デフォルトの名無しさん
08/09/04 15:53:06
もう0で良いよ0で
530:デフォルトの名無しさん
08/09/04 17:38:15
[1] 授業単元:プログラミング入門
[2] 問題文(含コード&リンク):URLの“第12回目”の中にある一番下(課題1)の
問題。 URL→URLリンク(al.cm.is.nagoya-u.ac.jp)
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 9月5日16時まで
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 関数とかは習っていません。
どうか宜しくお願いします(><)
531:デフォルトの名無しさん
08/09/04 17:42:39
>>530
面倒でも問題はテキストに起こそうぜ。
君の大学がばれるぞ。
で、JAVA???
532:530
08/09/04 18:00:18
>>531
分かりました。
533:530
08/09/04 18:16:59
連続スミマセン。
>>531
Javaです。
534:デフォルトの名無しさん
08/09/04 18:24:00
>>533
スレタイ読んで来ような。
ほしいのはこっちだろ?
スレリンク(tech板)
535:533
08/09/04 18:37:51
>>534
すみません。わざわざ誘導してもらって…失礼します
536:デフォルトの名無しさん
08/09/04 19:49:48
旧帝大でこれかよ…
537:デフォルトの名無しさん
08/09/04 23:32:13
七帝の中でも名古屋はおみそみたいなもんだからw
538:デフォルトの名無しさん
08/09/05 01:06:40
こんなアフォをみると日本の将来が本当に不安になるな。
教授に怒られることもできない。匿名の2CHでこそっと聞いて。ちなみにJava板で解答げっとしてたよ、こいつ
539:デフォルトの名無しさん
08/09/05 01:08:06
何騙されてんだ、そこはFランだ
540:504
08/09/05 01:16:42
>>506
亀レスすみません
宿題なんですけど、問題を解くのではなくてプログラムを作る宿題なんです…
ちょっと1から読んで来ます(;´Д`)
541:デフォルトの名無しさん
08/09/05 04:49:32
3問ありますがよろしくお願いします。
[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] その他の制限: (ポインタの最初の段階まで習っています)
542:デフォルトの名無しさん
08/09/05 09:50:32
>>541 問1 こんな感じか?問2の意図がよくわからないが
#include <stdio.h>
void copy(char *from, char *to);
int main()
{
char a[8] = "America";
char b[8];
copy(a,b);
printf("a:%s\n",a);
printf("b:%s\n",b);
return 0;
}
void copy(char *from, char *to)
{
for(int i=0;*(from+i) != NULL;i++)
*(to+i) = *(from+i);
}
543:デフォルトの名無しさん
08/09/05 09:51:50
>>541
問1
#include <stdio.h>
int main(void)
{
char str1[7]="America";
char str2[7];
char *p1,*p2;
p1=str1;
p2=str2;
while(*p1)
*p2++=*p1++;
printf(str2);
return 0;
}
544:デフォルトの名無しさん
08/09/05 09:53:01
>>541
問2
#include <stdio.h>
int main(void)
{
char str[5]="abcde";
char *p;
p=str;
while(*p)
putchar(*p++);
return 0;
}
545:デフォルトの名無しさん
08/09/05 09:54:17
>>541
問3
#include <stdio.h>
#include <string.h>
int main(void)
{
char str1[6]="France";
char str2[6];
char *p1,*p2;
int i;
p1=str1;
p2=str2;
/* p1を'\0'の位置まで移動させる */
while(*p1)
p1++;
/* 今'\0'にいるため1つ前の'e'まで戻す */
p1--;
i=strlen(str1);
for(;i;i--)
*p2++ = *p1--;
printf(str2);
return 0;
}
546:543-545
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まで
できればプログラムは短くコンパイルして結果が長くならないようなものでお願いします