C/C++の宿題を片付けます 115代目at TECH
C/C++の宿題を片付けます 115代目 - 暇つぶし2ch651:デフォルトの名無しさん
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で示している例でも/*コメントから始まって、プログラム終わり*/で
コメントはちゃんと閉じているよね?

842:デフォルトの名無しさん
08/09/24 23:19:18
[1] 授業単元:C++
[2] 問題文(含コード&リンク):
「t[5]に5つの整数が格納されている。これを昇順にソートするプログラムを示せ。
ソートのアルゴリズムは何でもよい事とする。」
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン:CPad for Borland C++ Compiler
 [3.3] 言語:C++
[4] 期限:9/25まで

これをバブルソートで作る場合のプログラムをお願いしますm(_ _)m

843:デフォルトの名無しさん
08/09/24 23:30:07
>>842
#include<stdio.h>
int main()
{

int t[] = {2, 40, 2, 554, -4}, i, j, tmp;
int n = sizeof(t) / sizeof(int);
fputs("前 : ", stdout);
for (i = 0; i < n; ++i) {
printf("%d ", t[i]);
}
putchar('\n');

for (i = 0; i < n - 1; i++){
for (j = n - 1; j > i; j--) {
if (t[j] < t[j - 1]) {
tmp = t[j];
t[j] = t[j-1];
t[j-1] = tmp;
}
}
}
fputs("後 : ", stdout);
for (i = 0; i < n; ++i) {
printf("%d ", t[i]);
}
putchar('\n');
return 0;
}
こんなんでいかが?

844:デフォルトの名無しさん
08/09/24 23:54:04
>>843
ありがとうございます><


845:795
08/09/25 23:03:51
>>841
ごめんなさい。
説明不足だったかもしれません。
一応、
>>795の最初のほうに書いてあるように
「コメントが関数内で閉じられているかチェックする」
ようにしないといけないんです。
それがどうしても難しくてわからないんです。
本当に質問する立場でえらそうにしてごめんなさい。
どうやったら、関数内でコメントが閉じられているか判断できるでしょうか?



846:デフォルトの名無しさん
08/09/26 09:47:53
どっちにしろ>>798では
printf("/*\n");
とか出てきたら破綻する。

847:デフォルトの名無しさん
08/09/26 15:06:54
[1] 授業単元:課題自由研究
[2] 問題文(含コード&リンク):ポーカーのプログラム製作
[3] 環境
 [3.1] OS:Windows XP
 [3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005
 [3.3] 言語:C++
[4] 期限:特になし
[5] その他の制限:C++であること

ない脳みそで考えたのですが、JOKERの効果と役の設定がわかりません。
今の所製作してあるプログラムの駄目出しもお願いします。

848:デフォルトの名無しさん
08/09/26 15:11:00
// 乱数の初期値のセット
srand((unsigned) time(NULL));
// 0~9 までの乱数を 1回生成
for (i=0; i<5; i++) {
n = rand() % 4; // 10は0~9の要素数 マーク判定用
m = rand() % 11; // カードの数値判定用
//マーク判断、数値の判定
if(n==0){sprintf(str, "H %d " , m);
TextOut(hdc,50,20*i,str,(int)strlen(str));
a=m;}
else if(n==1){ sprintf(str, "D %d " , m);
TextOut(hdc,50,20*i,str,(int)strlen(str));
b=m;}
else if(n==2){ sprintf(str, "C %d " , m);
TextOut(hdc,50,20*i,str,(int)strlen(str));
c=m;}
else if(n==3){ sprintf(str, "S %d " , m);
TextOut(hdc,50,20*i,str,(int)strlen(str));
d=m;}
if(m==0){//機能してないかも・・・・・・
sprintf(str, "JOKER");
TextOut(hdc,50,20*i,str,(int)strlen(str));
}}
z1=a;z2=b;z3=c;z4=d;


849:デフォルトの名無しさん
08/09/26 15:11:52
//役の判定 a b c d z
if(a==b || a==c || a==d || b==c || b==d || c==d || a==z1 || d==z2 || c==z3 || d==z4){
sprintf(str, "ワンペア!!");
TextOut(hdc,50,100,str,(int)strlen(str));}
else if(a==b==c || b==c==d || c==d==a || z1==a==b || z2==a==b || z2==b==c ||z3==b==c || z3==c==d || z4==d==a || z1==d==a){
sprintf(str, "スリーカード!!");
TextOut(hdc,50,100,str,(int)strlen(str));}
else {sprintf(str, "ノーペア!!");
TextOut(hdc,50,100,str,(int)strlen(str));}

850:デフォルトの名無しさん
08/09/26 15:27:42
GUI?

851:834
08/09/26 15:31:08
>>834
どなたかお願いできませんでしょうか。

852:デフォルトの名無しさん
08/09/26 15:50:51
>>849
これはひどい

853:デフォルトの名無しさん
08/09/26 16:53:37
[1] 授業単元:C
[2] 問題文(含コード&リンク):
数値が文字列として開業で区切られたデータファイル(例:音楽をA/D変換により取り込んだデータ)
の処理を考える。データファイルがデータのみである場合に、その
データファイルに含まれるデータ総数を数えるプログラムを作成しなさい。
[3] 環境
 [3.1] OS:fedora
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:9月末

よろしくお願いします

854:デフォルトの名無しさん
08/09/26 17:01:31
>>853
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE * fp;
int x, n = 0;
fp = fopen("data.txt", "r");
while (fscanf(fp, "%d", &x) == 1) n++;
printf("%d個です\n", n);
fclose(fp);
return 0;
}

855:デフォルトの名無しさん
08/09/26 17:06:40
>>854
ありがとうございます!

856:853
08/09/26 17:29:40
すいません、続けてですがこちらもお願いします。


[1] 授業単元:文字列の操作
[2] 問題文(含コード&リンク):
各人の氏名を、性と名にわけてキーボードからの入力で2つの変数に格納し
2つの文字列を連結することで、性と名の区切りに1つの空白を入れて
表示するプログラムを作成しなさい。
[3] 環境
 [3.1] OS:fedora
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:9月末

857:デフォルトの名無しさん
08/09/26 17:37:25
>>856
#include <stdio.h>
int main()
{
char first[2000], family[2000], full[4000];
puts("姓を入力してください");
scanf("%1999s", family);
puts("名を入力してください");
scanf("%1999s", first);
sprintf(full, "%s %s", family, first);
puts(full);
return 0;
}

858:853
08/09/26 17:42:29
>>857

ありがとうございます!助かりました!

859:795
08/09/27 02:32:05
すみません。
誰か
>>795
のソースを作ってくれないでしょうか。
ここ数日、考えても本当にわからなくて。

860:デフォルトの名無しさん
08/09/27 03:17:27
>>859
どういうものを作ればいいか分からない
もう少し分かりやすく説明してくれないかな

861:デフォルトの名無しさん
08/09/27 03:25:21
>>859
もうちょいパターンを洗い出して整理してはどうか。まずそこが出来てないように思う。

/* OK パターン */

/*
/* OK パターン */
hoge("/* OKパターン */");

int main(void)
{
/* NG パターン
  return 0;
}
/*

こんなもん??

862:デフォルトの名無しさん
08/09/27 04:02:28
結構厄介だな。
普通コンパイラなんかだと最初にコメントを除去するからな。
コメントそのものとコードとの位置関係をチェックするのか…。


863:デフォルトの名無しさん
08/09/27 04:16:05
真面目にやろうと思えばコンパイラのパーサに近いものを作らなきゃならないし
宿題レベルの問題じゃないと思うけどね。

>>859
コメントの中に"}"があれば関数が閉じてない可能性は高くなるけれど
以下のプログラムを入力した場合どんな出力になってほしい?

void main(void)
/* {が関数の始まり */
{
/* }まで関数の処理を記述する (}を含むけれど正しいコメント) */

/* 関数の返り値 (コメント閉じ忘れで本来検出したい部分)
return 0;
}
/* プログラムの終了 */


864:デフォルトの名無しさん
08/09/27 04:31:28
「関数」にはこだわらないほうがいいんじゃないかな。
関数と構造体と配列の初期化と単なるブロックの { } を区別するのはそれこそパーサーになってしまう。
とりあえずは全部ひっくるめて { } とコメントだけに注目して作ったほうがいいと思う。

865:デフォルトの名無しさん
08/09/27 04:39:48
}と};で区別すればなんとかなりそうな
C言語で関数をブロックでくくる事ってできたっけ?

866:デフォルトの名無しさん
08/09/27 12:09:45
整数型配列 a[5]を宣言する。
配列aに適当な整数を代入する。
配列から最大値を求め画面表示する。
#include<stdio.h>

main()
{
int a[5];
int maxdata;
int i;

a[0]=12;
a[1]=3;
a[2]=40;
a[3]=10;
a[4]=30;

maxdata=a[0];

for(i=1;i<5;i++)
{
if(?)
{
maxdata=a[i];
}
}
printf("最大値:%d",maxdata);
}

?の部分がわかりません。
お願いします。

867:デフォルトの名無しさん
08/09/27 12:20:07
a[i] > maxdata

868:デフォルトの名無しさん
08/09/27 12:22:37
>>867
ありがとうございました。

869:デフォルトの名無しさん
08/09/27 12:37:03
お礼のおっぱいはまだかね?

870:デフォルトの名無しさん
08/09/27 14:10:17
>>865
グローバルな領域に何も無い空文(;だけ)があっても
エラーにならないよ。
int main()
{
・・・
}; /* 関数の終わりと空文と解釈 */

871:デフォルトの名無しさん
08/09/27 17:33:32
【質問テンプレ】
[1] 授業単元:プログラミング言語演習Ⅱ
[2] 問題文(含コード&リンク): 住所録管理を行うプログラム。
データは「氏名」「住所」「電話番号」「メールアドレス」「グループ」を持つようにする。
データの登録、変更、削除、検索ができるようにする。
登録の際、「氏名」は必須とし、他の項目は空白でも良しとする。
検索は、「氏名」「住所」「グループ」で行えるようにする。
データは、テキストファイルに書き込み、次回実行する際、それを読み込むようにする。
[3] 環境
 [3.1] OS:Fedora Core 6
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C言語
[4] 期限:9月中
[5] その他の制限:特に無し


872:795
08/09/27 19:14:40
>>860
そうですね。
>>861さんのいうように

/* OK パターン */

int main(void)
{
/*
/* OK パターン */
hoge("/* OKパターン */");
}

int main(void)
{
/* NG パターン
  return 0;
}
/*

int main(void)
{
/* NG パターン
  return 0;
}
*/

の5パターンで考えています。

本当に難しすぎますよね。
課題出した先生も難易度高すぎだと思いました。

873:デフォルトの名無しさん
08/09/27 19:31:26
>>859
つ {で+1 }で-1


874:デフォルトの名無しさん
08/09/27 19:33:12
パターンじゃなくてステートで考えた方がいい。

875:デフォルトの名無しさん
08/09/27 19:49:41
これはOK?
int main(void)
{
/*}
int hoge(void)
{
/* } */
 return 0;
}


876:デフォルトの名無しさん
08/09/27 20:42:46
#define BIGIN {
#define END }
みたいにされてたり、
その後で#undef BIGINされてたりして、
で、それらが#ifdefやら#ifndefやらに囲まれてて、
その間にパズルみたいにコメントがはりめぐらされたりしてるどうしようもないコードも
面倒みなきゃいけないならプリプロセッサ部分も作らなきゃいけないから大変だな。

877:デフォルトの名無しさん
08/09/27 21:31:44
パターンもステートも使って考えると
対象ファイルを読みながら/**/で囲まれた部分を
検出したら囲まれた部分は出力せず
その直後の行まで別ファイルに書き出し、
その時点でそのファイルを子プロセスで
Cコンパイラにコンパイルさせ、エラーコー
ドがunexpected endof fileでなければ
コメントエラーであると判断して、
その行を出力する
でオK?

878:デフォルトの名無しさん
08/09/27 21:34:25
>Cコンパイラにコンパイルさせ、エラーコードが
そこを作る課題だろうが。

879:デフォルトの名無しさん
08/09/27 21:43:18
[1] 授業単元:プログラミング応用
[2] 問題文(含コード&リンク):
ファイルを読み込んで読み込んだファイルが
C言語の文法に合致しているかチェックするツールを
作る。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: gcc 3.4
 [3.3] 言語:C
[4] 期限: 本日中
[5] その他の制限: 制限は特にありません。
[6]備考:fopenした後からの処理でいいので教えてもらえると幸いです。

880:デフォルトの名無しさん
08/09/27 21:46:58
字句解析と構文解析をするプログラムか
難易度高いな

881:デフォルトの名無しさん
08/09/27 21:54:10
既存のツールを利用するという >>877 のアイデアはおもしろいと思うぞぬ

882:デフォルトの名無しさん
08/09/27 22:01:40
>>879を本日中っていうかあと2時間でバグなく動かせる奴ってすごいよな。

883:デフォルトの名無しさん
08/09/27 22:11:52
>>879
難易度高いぞそれ

つshellexec

884:デフォルトの名無しさん
08/09/27 22:15:27
>>876
プリプロセッサを展開させるならboost::waveがあるぞ

885:デフォルトの名無しさん
08/09/27 22:16:42
>>882
宿題の期限が土曜って

886:デフォルトの名無しさん
08/09/27 22:37:00
>>879
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
int i, ret_code;
char cmd[1024], *filename_src, *filename_tmp="hoge.tmp";
FILE *fp_tmp;

for(i=1;i<argc;i++)
{
filename_src=argv[i];

fp_tmp=freopen(filename_tmp, "w", stderr);
if(fp_tmp==NULL)
{
fprintf(stdout, "\nERROR: temporary file cannot open.\n");
exit(1);
}
sprintf(cmd, "gcc -c %s", filename_src);
ret_code=system(cmd);
freopen("con", "w", fp_tmp);
remove(filename_tmp);

if(ret_code) printf("\nInvalid source code. %s\n", filename_src);
}

return 0;
}

887:デフォルトの名無しさん
08/09/27 23:15:07
>>879
その問題は例えば「{}」の数があってるかだけ数えるとか
そんな条件ついてたりしないか?

じゃなきゃ無理だろ

888:デフォルトの名無しさん
08/09/28 01:01:38
>>871
最近作ったがコードが見つからない。
作る時間もないのでその時のことを。
構造体とキューを使うとすぐできた。
 

889:デフォルトの名無しさん
08/09/28 01:11:22
>>871のものです。

URLリンク(kansai2channeler.hp.infoseek.co.jp)

自力でここまでやってみましたが、うまく実行できません。
それに、このプログラムでは、「氏名」を必須、他の項目は空白で良しという条件が満たされてません。

何卒アドバイスのほうをよろしくお願いします。

890:デフォルトの名無しさん
08/09/28 01:51:53
氏名だけは入力長0だったら再入力させれば?

891:デフォルトの名無しさん
08/09/28 09:36:29
>>889
宿題ぐらいのレベルなら、入力部を

int c = 0;

while (c == 0){
printf("氏名 >> ");
fgets(data[n].name, N, stdin);
c = strlen(data[n].name);
data[n].name[c] = '\0'; //最後の改行をNULL文字にする
}

で十分でしょう。

892:デフォルトの名無しさん
08/09/28 10:18:51
>>891
たいした問題じゃないけどそれだとN-1文字以上読み込んだときに一文字減るね

893:893
08/09/28 10:46:03
[1] 授業単元:機械工学学生実験(デジタル信号処理)
[2] 問題文(含コード&リンク):
※長いのでこの書き込みの下に分けて書き込みします。すみません。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン:不明
 [3.3] 言語:C
[4] 期限: 明後日
[5] その他の制限: ないです。
[6]備考:C言語を習ったことがないです。C++を大学1年次に半年だけ授業でやりました。
    今回の実験内容はTMS320C6713 DSKボードを使用して、マイク入力した音声を正弦波に変換し、
    スピーカで出力するまでのプログラムの流れをPCを操作しながら学ぶというものでした。

上記の問題をパワーポイント2枚にまとめなければならないので、このプログラムの解説をお願いいたします。
特に/* main */以下をできる範囲でお願いいたします。

894:893
08/09/28 10:52:40
[2] 問題文(含コード&リンク):
以下のプログラム中の割り込み処理についてマイクからスピーカまでのデータの流れに沿って説明せよ。

/* Include files */
#include <csl.h>
#include <csl_mcbsp.h>
/* Declarations */
#define DRR 0x01900000 // McBSP1 receive address
#define DXR 0x01900004 // McBSP1 transmit address
// #define BUFF_SIZE = 256
/* Prototypes */
extern void dsk6713_init(void);
interrupt void voice_change(void);
/* References */
extern MCBSP_Handle hMcbspData;
/* Global Variables */
#pragma DATA_SECTION(buff1,"myData");
short buff1[256] ;
short buff0[256] ;
short I= 0x0000 ;
short y[3] = {0, 0x15AE, 0};
short a1 = 0x786F; /* 2*cosWT */
// short a1 = 0x7FFF; /* 2*cosWT */
// short a1 = 0x8000 ; /* 2*cosWT */
volatile short *drr = (volatile short *)DRR;
volatile short *dxr = (volatile short *)DXR;


895:893
08/09/28 10:54:25
/* main */
void main(void)
{
dsk6713_init();
MCBSP_write(hMcbspData, 0);
while(1){}
}
short amari( short i )
{
// short i ;
short j ;
//j = i/256 ;
j = i - (i/256)*256 ;
// j = i ;
    return(j);
}
interrupt void voice_change(void)
{
// short tmpI ;
    y[0] = ((int)a1*(int)y[1]>>14) - y[2];
y[2] = y[1];
y[1] = y[0];
*dxr = ((int)y[0] *(int)(*drr)) >> 14;
    I = amari( ++I );
buff1[ I ] = *dxr ;
buff0[ I ] = y[0] ;
// buff1[ I ] = y[0] ;
}

見づらくてすみません。894-895が今回与えられたソースの全てです。

896:デフォルトの名無しさん
08/09/28 10:54:58
6713のコンパイラのlong intが32bitじゃなくてはまったのもいい思い出。

897:834
08/09/28 14:34:10
何度もすみません。
明日の昼12時まででしたら、提出遅れの形で提出できますので、
>>834 どうかお願いいたします。
配点大きな課題ですので、本当に困ってます…
よろしくお願いします。

898:デフォルトの名無しさん
08/09/28 14:37:02
罵声を浴びるの覚悟でOpenGLのスレとかで聞いた方がいいんじゃないの?

899:デフォルトの名無しさん
08/09/28 15:07:04
止めてやれよ、こういうの送り込むの

900:デフォルトの名無しさん
08/09/28 15:19:59
ところでOpenGLの本ぐらい読んだの?

901:デフォルトの名無しさん
08/09/28 15:55:21
>>897
よくわからんが、軌道計算とかもするの?

902:834
08/09/28 16:15:15
>>900
最近始めたので、まだ教員の配布資料しか手元にありません。
その資料にもOpenGLの特徴とか投影法?の仕組みしか載っていませんので、
プログラムについては完全にお手上げ状態です…
今夜にでも書店行って、買い足そうと思います。

>>901
軌道計算とは何でしょうか?
一応、明日までに教員の前で作成したプログラムを実行し、
⑧までの条件が満たされた動画であればOKという課題です。
適当な返事ですみません…

903:デフォルトの名無しさん
08/09/28 16:20:07
1から順に課題をクリアしていけば到達できるようになってるね。


904:デフォルトの名無しさん
08/09/28 16:35:05
>>902
少なくとも問題に軌道面という単語はあるのだが。


905:デフォルトの名無しさん
08/09/28 19:07:59
[1] 授業単元: cプログラミング基礎(一般的な入出力)
[2] 問題文(含コード&リンク): c言語で読み出しファイルからファイル位置と読みだすバイト数を指定し読み出
し、違う名前のファイルに書き出すプログラムを作成せよ。ただし読み出しファイル、読みだすデータ位置、読みだすバイト数
書き出すファイル名はDOS窓で指定できるようにすること。
[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: 不明
 [3.3] 言語: c
[4] 期限: 2008年9月28日23:59まで
[5] その他の制限: 大学一年レベルの簡単でなるべく分かりやすいように書くこと。

906:デフォルトの名無しさん
08/09/28 19:30:46
>>905
大学1年レベルって結構高レベルな気がするんだけど
初めてC言語習いましたってレベルのことなのか?


907:デフォルトの名無しさん
08/09/28 19:34:34
大学1年で初めて習い始めたというレベルだそうです。
ちなみに当方は前期の講義をまったく覚えておらず何もできない状態です。

908:デフォルトの名無しさん
08/09/28 19:39:54
>>905
#include <stdio.h>
int main()
{
FILE *fpr, *fpw;
char filename_r[1000], filename_w[1000];
char data[30000];
int a, n;
puts("読み込むファイル名");
scanf("%s", filename_r);
puts("書き込むファイル名");
scanf("%s", filename_w);
puts("読み出す位置");
scanf("%d", &a);
puts("読み出すバイト数");
scanf("%d", &n);
fpr = fopen(filename_r, "rb");
fpw = fopen(filename_w, "wb");
fseek(fpr, a, SEEK_SET);
fread(data, 1, n, fpr);
fwrite(data, 1, n, fpw);
fclose(fpw);
fclose(fpr);
return 0;
}


909:デフォルトの名無しさん
08/09/28 19:53:39
ありがとうございます。早速ためしに動かしてみますね。

910:デフォルトの名無しさん
08/09/28 22:06:51
>>905
URLリンク(kansai2channeler.hp.infoseek.co.jp)
無駄に長いかも

911:834
08/09/28 22:35:36
>>904
確認しましたが⑦⑧は難しいので、
省いても良いそうです。減点ですけど…
④までは作って頂けましたので、残り⑤⑥お願いできませんでしょうか。


912:デフォルトの名無しさん
08/09/28 22:44:19
>>847
ルール合ってるか分からん、表示その他結構色々適当、C++じゃない、
といった感じなんで参考にもならんかもですが。
URLリンク(kansai2channeler.hp.infoseek.co.jp)


913:デフォルトの名無しさん
08/09/28 23:20:47
>>910
こんな方法があったんですね。只今用語を調べながら
どうなっているか理解に努めています。ありがとうございました。

914:デフォルトの名無しさん
08/09/28 23:32:12
[1] 授業単元: 初級c++
[2] 演技のよくない数字4と9をはずして、1,2,3,5,6,7,8,10・・・・と数える「49抜き」があります。
この49抜きの数は10個の数字のうち4と9が無いので8進数と同じように考えることができます。
ここで、10進数の符号なし整数を渡してそれに対応する49抜きの数値を標準出力する関数void printfwo49(unsigned int n)
を以下のように空欄を埋め完成させなさい。

void printwo49(unsigned int n)
{
char buf[]="01235678";
if(空欄){ //nが8ならば上位の桁がある
printwo49( 空欄 );//上位の桁の処理を行う。
}
putchar(buf[n % 8]);
}

 [3.1] OS:xp
 [3.2] コンパイラ名とバージョン:vc6.0
 [3.3] 言語: c++
長文申し訳ありません。
よろしくおねがいいたします。

915:デフォルトの名無しさん
08/09/28 23:35:20
>>914
n>8
n/8

916:デフォルトの名無しさん
08/09/29 00:21:15
n>=8
じゃないかな

917:デフォルトの名無しさん
08/09/29 00:31:21
>>834 7番 これじゃ手抜きすぎ?
glColor3d((double)year / 360.0, (double)day / 360.0, 1.0);


918:デフォルトの名無しさん
08/09/29 00:39:21
>>914

URLリンク(ziddy.japan.zdnet.com)

919:914
08/09/29 00:51:40
ありがとうございます

920:デフォルトの名無しさん
08/09/29 00:51:51
こんなんみつけた

URLリンク(pw137.cs.ie.u-ryukyu.ac.jp)

921:デフォルトの名無しさん
08/09/29 00:57:17
Borland c++のunsigned int 型は4バイトの大きさがあります。4バイトというと、
ちょうどIPv4でのIPアドレスのバイナリ表現と同じ大きさになります。そこで、
unsigned int型の引数を渡し、それをxxx.xxx.xxx.xxxという形式で標準出力に
出力する関数void printIPAddress(unsigned int address)を以下のように書きました。
空欄を埋める正しい答えを選択せよ。

void printIPAddress(unsigned int address)
{
printf("%d.%d.%d.%d",
(address & 空欄)>>24,
(address & 空欄)>>16,
(address & 空欄)>> 8,
(address & 空欄));
}

① 0x000000ff ② 0x0000ff00 ③ 0x00ff0000
④ 0xff000000 ⑤ 0xff00000000

どうかよろしくおねがいします

922:デフォルトの名無しさん
08/09/29 01:26:34
c++の問題です。よろしくお願いいたします。

ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを
渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを
チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned
int address)を以下のように書いた。空欄をうめよ。
ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、
ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の
ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると
判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と
考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの
ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」
をキーワードに調べてください。

int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address)
{
return(root 空欄① 空欄②)==(root 空欄③ 空欄④)
}

長文で申し訳ありません。よろしくおねがいします

923:デフォルトの名無しさん
08/09/29 02:05:40
>>834
URLリンク(kansai2channeler.hp.infoseek.co.jp)
とりあえず全部満たしたんじゃないかな
二個のオブジェクトで作ったのは、みかんっぽいなにか

924:デフォルトの名無しさん
08/09/29 02:19:26
>>921





925:デフォルトの名無しさん
08/09/29 02:26:32
>>922
>return(root 空欄① 空欄②)==(root 空欄③ 空欄④)
ここ問題あってる?
return(root 空欄① 空欄②)==(address 空欄③ 空欄④)
じゃない?
だとしたら
& mask & mask

926:922
08/09/29 02:30:48
>>925さま
925さまのおっしゃる通りに間違えていました
ただしくは

ネットワークのルートアドレスとネットマスク、そしてチェックしたいIPアドレスを
渡して、チェックしたいIPアドレスがそのネットワークに含まれているかどうかを
チェックする関数int checkIPAddress(unsigned int root,unsigned int mask,unsigned
int address)を以下のように書いた。空欄をうめよ。
ただし、あるIPアドレスがネットワークに含まれているかどうかチェックするには、
ネットワークのルートアドレス(root)と、チェックしたいIPアドレス(address)の
ネットワークIDを比較してその値が同じであったら、そのネットワークに含まれていると
判定します。IPアドレス中のネットワーク部は、ネットマスクのビットパターンが1である部分と
考えます。IPアドレスからネットワークIPを取り出すには、IPアドレスをネットマスクの
ビットごとのANDを取り出します。詳細はインターネットの検索エンジンで「ネットマスク」
をキーワードに調べてください。

int checkIPAddress(unsigned int root,unsigned int mask,unsigned int address)
{
return(root 空欄① 空欄②)==(address 空欄③ 空欄④)
}

でした

927:デフォルトの名無しさん
08/09/29 09:33:57
テキストファイルを読み込んで次の出力を得る。
(・・・)内の文字は、そのまま出力する。
ただし\に続く数字3文字は8進数として、バイナリ出力する。
<・・・>内の文字は、2桁ごとに16進数としてバイナリ出力する。
0からFに現れない文字は無視する。

928:デフォルトの名無しさん
08/09/29 17:14:36
[1] 授業単元: if文
[2] 問題文(含コード&リンク): 正の整数を入力すると、それをローマ数字で表示するプログラムを作りなさい。
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio .Net 2003
 [3.3] 言語: C
[4] 期限: 9月30日16:00まで
[5] その他の制限: ほとんど習ってません(Cとは?・int・printf・scanf・if・else←今ここ)

よろしくお願いします。

929:デフォルトの名無しさん
08/09/29 17:17:10
>>928
>>805
>>808
関数ならってないなら>>808でどうぞ



930:デフォルトの名無しさん
08/09/29 17:20:27
>>929
どうもありがとうございました。

931:834
08/09/29 17:57:31
>>923
条件の多い課題をありがとうございました。
配点が大きな課題だったので何とか提出でき、助かりました。
本当にありがとうございます。

932:デフォルトの名無しさん
08/09/29 21:59:29
[1] 授業単元:Cープログラミング
[2] 問題文:(含コード&リンク): 配列を用いて0~9の16個の数値を入力
  し、入力した数値の個数を*で表示させるプログラムを作りなさい。
  ただし、If文の使用はないものとし、関数はvoid型を使用しなさい。
[3] 環境
[3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: Visual Studio 2005
 [3.3] 言語: C ++
[4] 期限: 10月1日16:00まで
[5] その他の制限:ポインタはまだ習ってないです。
  条件が多いですが、よろしくお願いします。


933:デフォルトの名無しさん
08/09/29 22:04:45
ポインタならってないと関数で配列渡せない気がするんだけどどうしたらいい?
関数つかわなくてもいい?

934:デフォルトの名無しさん
08/09/29 22:06:31
配列を渡してるように見せかければいいじゃない

935:912
08/09/29 22:21:58
>>847
wiki見たら随分ルール間違ってた……
一応作り直してみたもののやっぱりルールに不安あり。
全然参考にならんかもですがまあ一応ってことで。
URLリンク(kansai2channeler.hp.infoseek.co.jp)



936:デフォルトの名無しさん
08/09/29 23:23:37
>>933
ポインタはまだ習ってませんが、使用してもかまいません。

937:デフォルトの名無しさん
08/09/29 23:31:13
>>932
#include <stdio.h>
int main()
{
char s[16] = {0};
int i, j;
scanf("%16s", s);
for (i = 0; i < 16; ++i) {
printf("%c : ", s[i]);
for (j = 0; j < s[i] - '0'; ++j) {
putchar('*');
}
putchar('\n');
}
return 0;
}

いまいちよくわからんがこういうことでいいのかなぁ・・


938:デフォルトの名無しさん
08/09/29 23:34:22
>>937
s[16+1] じゃね?

939:デフォルトの名無しさん
08/09/29 23:37:50
>>938
scanf("%16s", s);
なのにか?

940:デフォルトの名無しさん
08/09/29 23:39:41
>>939
終端に \0 がはいる

941:デフォルトの名無しさん
08/09/29 23:45:21
>>940
ほんとだ、試したり調べたらそうだった
ごめんなさい

942:デフォルトの名無しさん
08/09/30 10:40:14
初心者です


cydwinで、argvをつかって テキストファイル名を
引数としてわたして、ファイルの読込とファイルへ
の書込みをするプログラムを作成しました。

作成したいもの

このプログラムを呼び出シェルの作成シェル実行時の
引数を読込と書込みのファイル名を指定する

実行内容、エラーなどすべてのログをログファイルに
残す。

以上ですおねがいします

期限 10月1日

943:デフォルトの名無しさん
08/09/30 11:39:09
○以下のプログラムを作成して下さい。

 課題2.getsを使用し文字列(10字程度)をキーボードから入力する。
      入力した文字列を前後逆転した文字列を画面表示する。

○表示画面イメージ

  入力文字列 : abcde    → ”入力文字列 : ”はprintf   abcdeはgetsで入力
  逆転文字列 : edcba    →printfで画面表示

期限 今日中

944:デフォルトの名無しさん
08/09/30 11:41:03
>>942
>>1 の質問テンプレ読んで書き直してくれ
それと意味が分からない

a.out はすでに作成してあり、使い方は次のとおり
./a.out in.txt out.txt

で、イメージとしてはこんなんを作るのか?
stdout stderr の両方を処理しないといけないのと標準出力にも出すのかもしれないけど…
int main(void){
char fname_in[FILENAME_MAX], fname_out[FILENAME_MAX];
scanf("%s", fname_in);
scanf("%s", fname_out);
sprintf(cmd, "./a.out %s %s |& tee -a log.txt", fname_in, fname_out);
system(cmd);
return 0;
}


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch