3 :
デフォルトの名無しさん :03/09/26 11:04
5 :
デフォルトの名無しさん :03/09/26 13:11
♥Д♥
8 :
デフォルトの名無しさん :03/09/26 19:25
C++でプリンタポートをいじってます。 ポートからの出力を100msくらいのパルスにしたいんですが Hiを出力後、100ms待ってLoを出力するまでの時間つぶしをする関数とか ありませんか? よろしくお願いします。
>>1 どんどん腰が低くなっていくのは何か意図でもあるのか
>>8 ハードウェアもOSも分からなければ答えようがない。
WindowsならtimeGetTime()でも使え。
>>10 あ、すいません。windowsです。
timeGetTime()ですね。キーワードさえわかればなんとかなりそうです。
ありがとうございました。
Windowsなら Sleep(100); でええやん。
それ宿題なのか?
14 :
デフォルトの名無しさん :03/09/27 21:12
とりあえずハゲ
15 :
デフォルトの名無しさん :03/09/27 21:37
>>1 はコンピュータ言語勉強する前に
日本語を勉強しなおせ。
小学生以下の失態を犯して恥ずかしくないのか?
はーぁ?
算数オリンピックからの問題です。 A君、B君、C君、D君が○×式のテストを受けました。 全10問の4人の解答とA君、B君、C君の点数は下の表のようになりました。 第1問 第2問 第3問 第4問 第5問 第6問 第7問 第8問 第9問 第10問 点数 A君 ○ × ○ × ○ ○ × × × ○ 70点 B君 ○ ○ × × × ○ ○ ○ × × 70点 C君 × × × ○ ○ × ○ × ○ × 60点 D君 ○ ○ × × ○ × ○ × × × ? このテストは1問10点で100点満点です。 さて、D君は何点でしょう。 この問題プログラム化して解くのに何分かかる。 ちなみに俺の場合普通に解いた方が速かった。5分くらい。 プログラム化の時間は恥ずかしくて言えない。
>>17 6分弱もかかってしまった。
#include <stdio.h>
int z,t;Q(char*p){for(z=0;*p;p++)z=z*2+*p-'0';return z;}R(int x){for(z=0;x;x/=2
)z+=x&1;return z;}main(){int a=Q("1010110001"),b=Q("1100011100"),c=Q("1101010")
,d=Q("1100101000");for(;t<1024;t++)R(a^t)-3||R(b^t)-3||R(c^t)-4||printf("%d0\n"
,10-R(d^t));}
漏れも手動かすより普通に解いたほうが速かった。
21 :
デフォルトの名無しさん :03/09/28 00:24
「お長居します」ってこと?
>>17 >このテストは1問10点で100点満点です。
では、A君とB君は50点で、C君とD君は40点です。
採点ミスがあったようですね。
30秒で解けました。
お前の話はつまらん
ネタはマ板で
27 :
デフォルトの名無しさん :03/09/28 11:01
お願いします。お助けください。 No.(学籍番号・4桁の数字) Name(名字・20文字以内のアルファベット) English(英語テスト・100点満点の点数) Math(数学テスト・100点満点の点数) 上記の項目を入力し、合計点の高い順にソートして結果を 画面に表示させるプログラムを作成しなさい。。 結果表示はNo. Name 合計点 English Mathの順になるように すること。細かな表示方法は各自の工夫に任せるものとする。 例としては、以下のような形式が考えられる。 1021 YAMADA 162 92 70 1005 NAKAYAMA 149 83 66 なお、50人分までのデータセット入力にたえられるように設計 すること。
俺は数学で70点なんか取りません 英語で92点も取れません
29 :
デフォルトの名無しさん :03/09/28 14:11
static const int min = 10; static const int max = 20; void ReviseValue(int& v) { if (v > max) { v = max; } else if(v < min) { v = min; } } 値がはみでてるかどうかをチェックして修正したいんだけど、 かっこよくやる方法教えて
>>29 表記的にかっこいいのは思いつくがパフォーマンスも考えればそれでいいんじゃない?
そんな短くてしかも改変の可能性もほとんど無いif分に行数を割くのは見にくくなるだけかとは思う。
31 :
デフォルトの名無しさん :03/09/28 14:35
switch文で文字列比較したいと思いませんか? switch ( str ) { case "hoge": shori( a ); break; case "piyo": shuri( a,b,c ); break; } こんな感じの処理を簡潔に記述するにはどうしたらいいですかね ぐるぐるまわって関数ジャンプも考えたけど引数が統一されてないと・・
>>29 #define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
v = max(min(v,20),10);
windows.hがインクルードしてあれば最初の2行はいらない。
>>32 max(++a,b) とかやるとき困っちゃうから
わざわざ関数定義してるのではないでしょうか
template<typename T> T max(T a, T b) { return a > b ? a : b } template<typename T> T min(T a, T b) { return a < b ? a : b } v = max(min(v, 20), 10);
35 :
デフォルトの名無しさん :03/09/28 15:57
>>31 static const char* vars[3] = { "hoge", "piyo", "fuga" };
switch ( std::find(vars, vars+3, str) ) {
case &vars[0]:
shori( a );
break;
case &vars[1]:
shuri( a,b,c );
break;
case &vars[2]:
nanika(a,b,c,d,e,f,g);
default:
std::cerr << "ヽ( ・∀・)ノ ウンコー" << std::endl;
}
&vars[2]はbreakし忘れ。
つーかよく考えたら&は(゚听)イラネ
>>35 vars[0]とか明らかに定数式じゃないし…
みなさまありがとうございます。
>>30 無駄が多かったif文は{ v = max;} みたいな感じで短くしました。
>>32 >>34 ぃゃ〜かっこいいですね〜。
勉強になります。
>>33 前置インクリメントなどはやらないつもりです。
static const char* vars[3] = { "hoge", "piyo", "fuga" }; int i; for(i=0; i<3; i++) { if(!strcmp(vars[i], str) break; } switch ( i ) { case 0: shori( a ); break; case 1: shuri( a,b,c ); break; case 2: nanika(a,b,c,d,e,f,g); default: throw("ヽ( ・∀・)ノ ウンコー"); }
41 :
デフォルトの名無しさん :03/09/28 16:22
問題3行3列の行列を入力し、逆行列を求めなさい。 ただし要素の入力、行列式の計算、要素の計算、要素の表示は関数を用いて行う。 ヒントは二次元配列、ポインタ、関数、exit()です。 ちなみにC言語です。 よろしくお願いします。
ケーリー・ハミルトン
>>34 C++使うならわざわざ自分で書かなくても<algorithm>にある。
v=v<min ? min : v>max ? max : v;
45 :
デフォルトの名無しさん :03/09/28 18:03
>>39 前置インクリメントというか、マクロの場合副作用が2回おきるのが問題。
インクリメントならわかりやすいけど、
max( f1(a), f2(b) );
とかだと非常に分かりにくいバグの元。
46 :
デフォルトの名無しさん :03/09/28 18:49
>>17 これってABCの回答が別のものになってもDの点数は解るのでしょうか?
一応書いてみたけど、使いまわしきかないなぁ。
#include <stdio.h>
#include <string.h>
int atob(char* p)
{
int result=0,len=strlen(p);
for(int i=0;i<len;i++){result += *(p+i)=='0' ? 0 : 1<<i;}
return result;
}
int main(void)
{
int A=atob("1010110001"),B=atob("1100011100")
,C=atob("0001101010"),D=atob("1100101000");
int result=0,w;
w=D^((C^((A^B)^-1))|(C&(A^B)))^-1;
for(int i=0;i<10;i++){result+=w&(1<<i)?10:0;}
printf("%d\n",result);
return 0;
}
>>46 無理でしょ。
論理的にありえない点数だったり、ABCが三人とも同じ答えなら正解を導くことは不可能になるし。
>>46 ABCそれぞれの点数が以下の場合でもDの点数が求まる。
A:100 B:40 C:30
A:70 B:70 C:60
A:40 B:100 C:30
A:30 B:30 C:100
A:30 B:30 C:40
結論。どんな点数でも求まる(矛盾してなければ)
>>41 3×3行列の逆行列は簡単に求める方法があったよね?
知ってるんでしょ?
>>40 ヽ( ・∀・)ノ ウンコー
かっこいいな。
53 :
デフォルトの名無しさん :03/09/29 09:25
奇数魔方陣を二次元配列でやれという宿題がでました。上手く出来ないので お願いいたします。
>>53 いきなりその宿題を「やれ」ってことはないでしょう。
その前に習った事の応用を利かせて解けばいいんじゃない。
>>53 国選エスパーを雇ってから来てください。
もし誘導されてきたんならその旨も書いてね。
57 :
デフォルトの名無しさん :03/10/01 12:46
for文などを使わずに、四則演算だけで小数点以下を四捨五入させるプログラムの組み方がわかりません。 おながいします。
58 :
デフォルトの名無しさん :03/10/01 12:47
+0.5して少数点以下を切り捨て
>>53 #include <stdio.h>
#define SIZE 5
int main(void)
{
int y,x,i;
int num[SIZE][SIZE]={0};
for(y=0,x=SIZE/2,i=1;i<=SIZE*SIZE;i++)
{
num[y][x]=i;
y--;x++;
if(y<=-1) y+=SIZE;
if(x>=SIZE) x-=SIZE;
if(num[y][x])
{
y+=2;x--;
if(y>=SIZE) y-=SIZE;
if(x<=-1) x+=SIZE;
}
}
for(y=0;y<SIZE;y++,puts("\n"))
for(x=0;x<SIZE;x++)
printf("%4d",num[y][x]);
return 0;
}
#include<stdio.h>
main(){
int num_1, num_2, div, mod, roundoff;
printf("割られる数を入力して下さい>");
scanf("%d",&num_1);
printf("割る数を入力して下さい>");
scanf("%d",&num_2);
div = num_1 / num_2;
mod = num_1 % num_2;
roundoff = ほにゃほにゃ
printf("四捨五入された商 = %d",roundoff);
exit(0);
}
今のところ、こんなかんじです。・・・重要なところができておりません。
>>59 「小数点以下を切り捨て」はどうやるのですか??
(int)(hoge + 0.5)じゃないの?
63 :
デフォルトの名無しさん :03/10/01 15:14
>>40 enum vars { hoge, piyo, fuga, not_vars };
enum vars str2vars( char *str ){
struct {
char*str;
enum vars var;
} str_var[] = { { "hoge", hoge }, { "piyo", piyo }, { "fuga". fuga }, { "", not_vars } };
int i;
enum vars var;
for ( i=0, var=not_vars; str_var[i].str; i++ ) if ( !strcmp( str_var[i].str, str ) ) break;
return var;
}
.
.
.
switch ( str2vars( str ) ){
case hoge: shori( a );break;
case piyo: shuri( a,b,c );break;
case fuga: nanika( a,b,c,d,e,f,g );break;
case not_vars: err( str, "不正な文字列です" );break;
}
>>61 (num_1 * 10 / num_2 + 5) / 10
一応参考までに double x = -1.5; int i = (int)x; で i が -1 か -2 かは実装依存な
>>62 (int)というものをまだ学んでいないので、調べてみます。
>>64 むむむ・・・すごいです。ありがとうございました。
>>61 試してないけど。
roundoff = div + (num_2 / mod <= 2)? 1 : 0;
考えながら書いているうちに返事が…
>>67 だと四則演算のみにならないのか。
>>67-68 >>64 と
>>67 は同じことを別の組み方で書いているのでしょうか?
それとも、ただ結果が同じなだけで厳密には違うのでしょうか?
初心者ですので、
>>67 の書き方がさぱーりわかりません・・・。
特にこの辺→「<=2)? 1:0」
もっと勉強して、わかるように努力します。
>>69 結果は同じになると思います(試してないんで)
mod / num_2 >= 0.5 の逆数を使ったやり方で、考え方が違います。
三項演算子 ? : をif文に置き換えるこんな感じ
if (num_2 / mod <= 2) roundoff = div + 1;
else roundoff = div + 0;
>>70 おぉ、勉強になります。ありがとうございますた。
72 :
お助けを 1 :03/10/01 20:55
学校の課題でつ。このままだと提出日に間に合わないので、1問よろしく手伝って下さい。おながいしまつ。m(__)mm(__)m 1.ベクトルクラス 以下のような2次元ベクトル(Vector)のクラスを作成せよ。 コピーコンストラクタと代入オペレータも練習のため作成せよ。 class Vector { public: // (0,0) ベクトルの生成 Vector(); // (x,y) ベクトルの生成 Vector(double x, double y); // コピーコンストラクタ Vector(const Vector& vector); // 代入オペレータ Vector& operator=(const Vector& vector); // (x,y) を返す double x() const; double y() const;
73 :
お助けを 2 :03/10/01 20:56
// 長さを返す double length() const; // ベクトルとのなす角度を返す double angle(const Vector& vector) const; // 符号反転したベクトルを返す Vector operator-() const; // ベクトルの加減算 friend Vector operator+(const Vector& left, const Vector& right); friend Vector operator-(const Vector& left, const Vector& right); Vector& operator+=(const Vector& vector); Vector& operator-=(const Vector& vector); // ベクトルの伸縮 friend Vector operator*(double n, const Vector& vector); friend Vector operator*(const Vector& vector, double n); friend Vector operator/(double n, const Vector& vector); friend Vector operator*(const Vector& vector, double n); Vector& operator*=(double n); Vector& operator/=(double n);
2分とかからず作れそうだが
>>72 privateとかprotectedに変数置いちゃ逝けないの?
protected: double x_, y_;
Vector() : x_(0), y_(0) {} Vector(double x, double y) : x_(x), y_(y) {}
Vector(const Vector& vector) { x_ = vector.x(); y_ = vector.y(); }
Vector& operator=(const Vector& vector) { x_ = vector.x(); y_ = vector.y(); return *this; }
double x() const { return x_; } double y() const { return y_; }
改行減らして圧縮してくれよ(;´Д`)
double length() const { return sqrt(x_ * x_ + y_ * y_); }
Vector operator-() const { Vector ret(-_x, -_y); return ret; }
friend Vector operator+(const Vector& left, const Vector& right) { Vector ret(left); ret += right; return ret; } friend Vector operator-(const Vector& left, const Vector& right) { Vector ret(left); ret -= right; return ret; }
Vector& operator+=(const Vector& vector) { x_ += vector.x(); y_ += vector.y(); return *this; } Vector& operator-=(const Vector& vector) { x_ -= vector.x(); y_ -= vector.y(); return *this; }
86 :
お助けを 3 :03/10/01 21:24
// 始点を中心として angle 度回転させたベクトルを返す Vector rotate(double angle) const; // 比較 friend int operator==(const Vector& left, const Vector& right); friend int operator!=(const Vector& left, const Vector& right); private: double my_x; double my_y; }; すみません。3つ目を書き込もうとしたら、20分経たなきゃダメとはじかれました。 これで全部でやす。 > 75 あまりプロっぽくするとバレバレなので、できればあまり高度なワザは出さないほうが懸命かと思われまつ。 みなさま、どうかよろしくおねがいしまつm(__)m
friend Vector operator*(double n, const Vector& vector) { Vector ret(vector); ret *= n; return ret; } friend Vector operator*(const Vector& vector, double n); { Vector ret(vector); ret *= n; return ret; }
friend Vector operator/(double n, const Vector& vector) { Vector ret(vector); ret /= n; return ret; } //つーかここは問題が間違ってるだろ friend Vector operator/(const Vector& vector, double n) { Vector ret(vector); ret /= n; return ret; }
回答レスのangleがすっぽかされてるのがワラタ double angle(const Vector& vector) const { return std::atan2( y-vector.y, x-vector.x ); } ↑関数・引数の名前が不適当 どっちからどっちに向けての角度かわからない。
Vector& operator*=(double n) { x_ *= n; y_ *= n; return *this; } Vector& operator/=(double n) { x_ /= n; y_ /= n; return *this; }
friend int operator==(const Vector& left, const Vector& right) { return left.x() == right.x() && left.y() == right.y(); } friend int operator!=(const Vector& left, const Vector& right) { return !operator==(left, right); }
レスリング部に所属している集団が部活帰りに 「ボクシングってダセェよな、シッシッ言っちゃってよ。」などと 言っているのが聞こえたので走って近づき、リーダー格の奴に、 右ボディを食らわせて前屈みにし、ワンツー連打から左フックでKOした。 オレはその場を立ち去る時に残りの高校生たちを指差し、 「お前らも灰になれるものを見つけろよ」と言った。 離れていく時に後ろから、「ボクシングっていいよな。」と声が聞こえた。
誰か作ってください。 C言語で 構造体の中の変数a[]を使って、 void s()という関数を作って その変数a[]をその関数で a[0]=1; a[1]=2; a[2]=3; ・ ・ ・ a[15]ぐらいまでして最後にメイン関数でそのa[0]からa[15]までの数字を 表示するプログラムを誰か作ってください。
94 :
デフォルトの名無しさん :03/10/02 12:14
C言語の課題なのですが、 標準入力からテキストファイルを読み込み、 行を辞書順に並べ直して標準出力に出力しなさい。 という課題で今頭を悩ませています。 並べ直しはqsort()をつかうのかなあ、などと試しているのですが、 正直ちょっと手詰まりになってしまいました。 どうか手助けお願い致します。
>94 何か条件は無いの。
>94 各行をバッファに入れてソートしたら良いだけ
>>94 分からんかったら、これ出せば良い。
#include <stdlib.h>
main(){system("sort");return 0;}
98 :
デフォルトの名無しさん :03/10/02 13:04
>>94 /* 128行までで、1行あたり1023文字まで */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *chomp(char *s)
{
size_t len=strlen(s);
if(len&&s[len-1]=='\n')
s[len-1]='\0';
return s;
}
static int scmp(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);
}
int main() { char a[128][1024]; char *pa[129]; int i; for(i=0;fgets(a[i],sizeof a[0],stdin)&&i<128;i++) pa[i]=chomp(a[i]); pa[i]=NULL; qsort(pa,i,sizeof(char *),scmp); for(i=0;pa[i];i++) puts(pa[i]); return 0; }
>>94 君は向上心がありそうだから、C++の場合を教えてやろう。
君のmissionはこれをCに直すだけだ。
健闘を祈る。
#include <string>
#include <list>
#include <iostream>
main()
{
using namespace std;
string s;
list<string> lst;
while(getline(cin, s))
lst.push_back(s);
lst.sort();
copy(lst.begin(), lst.end(), ostream_iterator<string>(cout));
}
>>100 すでにC++の場合の答えは出てるんですけど。set<string>と。
>98のプログラムで実行したらいきなり1024(byte)*128のメモリ占有されてしまうのもなんだかな〜
ああと計算間違いしてた。
C言語とC++言語の違いを述べよ また、C++言語の仕様を体系化せよ の課題はどうすればいいでつか?
「あぁん?お前そんなことも知らないのか?それなら ISO仕様書でも購入して勝手に読めやゴルァ!!!!!!」とでも言ったら
>>102 あちこち無様だが,多少動的に確保したモノ。
一筆書きだからミス修正ヨロ。
enum { PAGESIZE=4096 };
char *buf=NULL;char *tmpbuf;int bufsize=0;
char **list; char **tmplist;int listsize=0;
{size_t num_read;
do {
bufsize+=PAGESIZE; buf=realloc(buf,bufsize);
tmpbuf=buf+bufsize-PAGESIZE;
num_read=fraed(tmpbuf,PAGESIZE,1,stdin);
tmpbuf+=num_read;
}while( num_read == PAGESIZE );
*tmpbuf='\0'; ++tmpbuf; bufsize=tmpbuf-buf}
for(listsize=1;tmpbuf>buf;--tmpbuf) if(*tmpbuf=='\n') ++listsize;
list=malloc(listsize*sizeof(*list));
tmplist=list;
for(tmpbuf=buf+size-1;tmpbuf>buf;--tmpbuf) if(*tmpbuf=='\n'){ *tmpbuf='\0';*tmplist=tmpbuf+1;++tmplist }
*tmplist=tmpbuf;
qsort(list,listsize,sizeof(*list),strcmp);
for(tmplist=list;tmplist<list+listsize;++tmplist) printf("%s\n",*tmplist);
忘れないでね。
109 :
デフォルトの名無しさん :03/10/02 18:11
>>93 #include <stdio.h>
struct
{
int a[15];
}A;
void s()
{
int i;
for(i = 0; i < 15; i++)
A.a[i] = i + 1;
}
int main(void)
{
int i;
s();
for(i = 0; i < 15; i++)
printf("%d\n", A.a[i]);
return(0);
}
>>108 う〜ん例えが難しいんだよな。
簡単に言えば
#include<stdio.h>
void s()
struct A{
int a[];
};
int main(){
struct A A;
s(構造体);
A.a[0〜15]まで表示する。
}
void s(構造体){
a[0]=1; //構造体A.a[]
a[1]=2;
a[2]=3;
・
・
}
こんな感じw
すいません初心者なのでこんなんで勘弁してください。
>>109 ありがとうございます。
答えてくれたので
110のことはなかったことにしてください。
72です。ありがとうございまつ。自分的にお見事としかいいようがありません。 自分もすらすら早く書けるようになりたいです。 ひとつ質問なのですが、 friend Vector operator-(const Vector& left, const Vector& right); Vector& operator+=(const Vector& vector); この2つは、main() 関数でどう書いて呼んだらいいのでしょうか。 いろいろやってるんですが、「未解決ですエラー」とか出ます。捕捉おねがいできますでしょうか。 > 88 > //つーかここは問題が間違ってるだろ > friend Vector operator/(const Vector& vector, double n); > 89 :デフォルトの名無しさん :03/10/01 21:29 > 回答レスのangleがすっぽかされてるのがワラタ > double angle(const Vector& vector) const > 関数・引数の名前が不適当 > どっちからどっちに向けての角度かわからない。 自分のタイプミスではないようなので、出題がまちがっている可能性はなきいしもあらずです。 この辺は笑顔でかわします。
無きにしも非ず、だろ。何だよ、「なきいしもあらず」ってのは。
>>112 Vector left, right;
left-right;
left+=right;
double angle(const Vector& v) const{ return acos((x*v.x + y*v.y)/(length()*v.length())); }
(2*num_1 + num_2) / 2*num_2
>>115 double angle(const Vector& v) const{
return atan2(x * v.y - y * v.x, x * v.x + y * v.y);
}
>>116 そうだ * 2 でもよかったんだ…
とか感心してたら、ミスに気づいた。
a[51]という変数があってその配列の数字は a[0]=1、a[1]=2、a[2]=3、・・・a[51]=52です。 つまりa[]={1,2,3,4,5,6,7,8,9,・・・50,51,52} ですがそれを a[]={3,16,42,35,8,17,・・・} ランダムにするプログラムを作りたいのですが そのようなプログラムを誰か作ってくれませんか?
#include <algorithm> main() { a[]={1,2,3,4,5,6,7,8,9,・・・50,51,52} std::random_shuffle(a, a+51); //一応出力 std::copy(a, a+51, std::ostream_iterator(std::cout)); }
#include <iostream>するの忘れた
>>230 これって
std::copy(a, a+51, std::ostream_iterator(std::cout));
std::copy(a, a+51, std::ostream_iterator<int>(std::cout, ","));
にしないとうまく動かないんじゃない?
>>119 #include <stdlib.h>
#include <time.h>
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,・・・50,51,52};
int i=1000000,j,k,l;
srand(time(NULL));
while(i--){
j=rand(); k=rand();
l=a[j]; a[j]=a[k]; a[k]=l;
}
for(i=0;i<52;i++)
printf("%d ",a[i]);
return 0;
}
アウチ! j=rand(); k=rand(); ではなく j=rand()%52; k=rand()%52;
すごい初歩的なんですが、 #include<stdio.h> int main(){ char a[2][10]={"S5","D13"}; printf("%s\n",a[0]); //ここでS5からS3に printf("%s\n",a[0]); } このS5という文字をS3に変えるにはどうすればいいでしょうか? すいません初歩的な質問で。
72 です。まことにありがとうございました。ご回答いただけたので十分です。助かりました。m(__)m
129 :
デフォルトの名無しさん :03/10/03 21:47
cppllにバカが1人現れた! [cppll:9552] ファイル入出力ストリームとNEW演算子. すいません少し聞かせてください. 下記の処理で,少し理解できない部分があります. 処理の流れは,テキストファイルからint型の数を読み込み, その数分,動的に二次元配列をNEWでとるという流れになります. int** cost_matrix; int assign_num; ifstream fin( "test_1.txt",ios::out); if(!fin.is_open()) exit(1); // エラーチェック fin >> assign_num; *cost_matrix = new int[assign_num]; for(int i = 0 ; i < assign_num ; i++ ) cost_matrix[i] = new int[assign_num]; この流れではプログラムがうまく動かないのですが
130 :
デフォルトの名無しさん :03/10/03 21:48
int assign_num; ifstream fin( "test_1.txt",ios::out); if(!fin.is_open()) exit(1); // エラーチェック fin >> assign_num; int** cost_matrix; ←ここ *cost_matrix = new int[assign_num]; for(int i = 0 ; i < assign_num ; i++ ) cost_matrix[i] = new int[assign_num]; このようにすればうまくいきます. なぜでしょうか?? 初歩的な質問でしょうがよろしくお願いします.
偶然うまく動いたように見えてるだけ
133 :
デフォルトの名無しさん :03/10/03 22:00
放置の方向。
うみゅ。放置だね。
135 :
デフォルトの名無しさん :03/10/03 22:06
徹底的に放置しましょう
136 :
デフォルトの名無しさん :03/10/03 22:20
137 :
デフォルトの名無しさん :03/10/03 22:33
負けるな。放置
138 :
デフォルトの名無しさん :03/10/03 22:37
> 129 誰か相手にしてくれるよ。大丈夫。
え?俺、放置っすか?何故
140 :
デフォルトの名無しさん :03/10/03 22:40
136 君じゃないってさ。
>>140 誰も136の相手をしていないという意味だろ。
ああ、137のことか。
>>136 とりあえずWM_LBUTTONUPに反応しなされ。
渡されたパラメータからマウスの座標を見つけて更新。
InvalidateRectあたりでウィンドウを更新。
しかしこういうスレでWinアプリに手を貸そうと思うやつはまれじゃなかろうか。
144 :
デフォルトの名無しさん :03/10/03 22:46
>> 136 心配するな。
145 :
デフォルトの名無しさん :03/10/03 22:56
1 が答える
146 :
デフォルトの名無しさん :03/10/03 22:59
age
ここに書き込もうとしたら、「あなた騙されてますよ」っていうのが出たんですけど。
148 :
デフォルトの名無しさん :03/10/03 23:14
>>1 回答はsiro
150 :
デフォルトの名無しさん :03/10/03 23:21
面白いからあげ
151 :
デフォルトの名無しさん :03/10/03 23:27
か・な・ら・ず・こ・た・え・ろ
152 :
デフォルトの名無しさん :03/10/03 23:35
放
153 :
デフォルトの名無しさん :03/10/03 23:49
浪
#include<stdio.h> int main() { "Hello world.\n"; return 0; }
155 :
デフォルトの名無しさん :03/10/05 20:24
助かってますので、消えないでほしいでつ
なんか宿題出してくれないと消えちゃいます
ならちょっくらOS作ってくれんか?
宿題じゃないものは駄目です
じゃあコンパイラの作成を
明日までの宿題なので、お願いします。 問題 1〜10の和を求めた後、Hello Worldと表示しなさい。
main() { int printf(); int i = 55; return printf("Hello World"); }
>>160 program p
var i : integer;
begin
i := 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10;
writeln("Hello World");
end.
>>162 スレのタイトルが読めないようですね
日本語から勉強してください
>>161 プログラムの戻り値が異常終了時の戻り値になりますよ
>>160 #include <iostream>
#include <numeric>
#include <algorithm>
struct Gen { inline int operator()() { static int n = 1; return n++; } };
main()
{
using namespace std;
int onetoten[10];
generate_n(onetoten, 10, Gen());
accumulate(onetoten, onetoten + sizeof( onetoten)/sizeof(int), 0);
cout << "Hello World" << endl;
}
166 :
デフォルトの名無しさん :03/10/05 22:17
sin Xをテイラー展開して近似するという問題で プログラム自体はできましたが どうしてもXの値を大きくすると 誤差が大きくなってしまいます。 何か誤差を小さくする方法は無いものでしょうか?
long doubleを使う
プログラムを附記しときます #include<stdio.h> #include<math.h> #define NMAX 100 void main(void) { float eps,x,t,s; int n; printf("Taylor series\n"); scanf("&g",%eps); printf("eps=%g\n",eps); for(;scanf("%g",&x)!=EOF;){ printf("\nx=%g\n n\tt\t\ts\n",x); t=x;s=x; for(n=1;n<NMAX;n++){ t*=-1*x*x/(2*n*(2*n+1));s+=t; printf("%2d %15.6e %15.6e\n",n,t,s); if(fabs(t)<eps)break; } if(n>=NMAX) printf("---not converged---\n"); printf("exp(%g)=%g\tn=%d\n",x,s,n); } exit(0); }。
floatなんか使うなよ。せめてdouble。なるべくなら自分で高精度浮動小数点クラスを作る。
マクローリン展開は 0 から離れるほど収束が遅くなる もはやこれは常識!
一度クリックしたら変わるのは出来るんだけどもう一度クリックしたら重なって表示でもいいからでる 方法が分からないんだが、それだけ教えてくれんかの?
>>172 アイコンをボタンに張って、ボタンを同じ場所に5つ配置し、
それをひとつずつShowWindow()すると言う手はどうだ?
174 :
デフォルトの名無しさん :03/10/06 04:23
-------------------------------------- サーバ用プログラムの一部 -------------------------------------- int rec; char buff[1024]; char fbuf[1024]; int fbyte; FILE *fp; //クライアントからのデータ受付 rec = read(connfd,buff,1024); //ファイルオープン fp = fopen("info.txt","r") while(fgets(fbuf,1024,fp) != NULL){ fbyte = strlen(fbuf); write(connfd,fbuf,fbyte); }
175 :
デフォルトの名無しさん :03/10/06 04:24
-------------------------------------- クライアント用プログラムの一部 -------------------------------------- char buf[1024]; int ret; //サーバへのデータの出力とサーバからのデータの入力 while (fget(buf,1024,stdin)){ write(sockfd,buf,1024); ret = read(sockfd,buf,1024); buf[ret] = '\0'; print("%s",buf); } 以上のプログラムをサーバー側ののプログラムだけを改造して クライアントから入力した文字をそのまま返す(エコーバック)こと を実現したいのですが。Cの玄人様よろしくおながいします。 簡単な解説(どうやって実現させているのか)等もできればおながいします。
read()の戻り値って読み込んだサイズだったよね? それならこれだけ。 //クライアントからのデータ受付 rec = read(connfd,buff,1024); write(connfd,buff,rec); 説明のしようもないや。
filedes 取得絡みの解答が全くないな…
178 :
デフォルトの名無しさん :03/10/06 12:06
(゚Д゚)ハァ? filedes ってなんだよ、おい。
ファイルデスクリプタ?
typedef char* pchar , moji って 二つ目はmojiはcharってことで正解ですか? 基礎ですみませんが教えてください。
181 :
デフォルトの名無しさん :03/10/06 13:28
平均と分散を引数にとって、正規分布を作って、 グラフを出力する関数を作ってください。 言語はCです。
>>180 正解
>>172 2次配列flg[5][5]にアイコンのフラグ(1〜5)を格納
WM_PAINTでflg[5][5]をswitchして描画
WM_LBUTTONDOWNでflgをインクリメント、InvalidateDataでいいんでない?
>>178 sock, bind, connect, listen, accept あたりの話がごっそり抜けてるな
と思って
>>143 ,173,182
デキタ━━━━━━(゚∀゚)━━━━━━ !!!!!!
大感謝!出来たよ!やったよ!ありがとよ!!!
ヤッホーーイ!!ヽ(´Д`)ノInvalidateRect関数なんて知らなかったぜヤッホーーイ!!
また詰まったらヒント頼む・・・
俺もこんなに感動した日があったな〜・・・ハァ〜・・・
>>183 その辺のコードはすでに存在しているということが読み取れないか?
「?の一部」が
>>183 の言語野じゃtruncateされてるらすぃ。
行列Aのi行をk倍した行列Bを出力 行列Aのi行とj列を交換した行列Cを出力 お願いシマス
>>188 行列Aのi行とj列を交換っていうのは特定の1行と1列のみ?それとも丸ごと全部?
stdlib.hを使わずにatoi関数を自作せよという宿題がでました atoi("100")=100,atoi("-200"),atoi("134a")=134, atoi("12uy6")=12,atoi("a975")=0,atoi("134.23")=134 atoi("2/3")=2 というように、整数ならそのまま整数を出力して、 整数-英文字,記号...なら初めの整数だけ出力して、 それ以外は0を出力する関数を作りたいです。 どうやったら作れますか?
>stdlib.hを使わずに プロトタイプ宣言するだけだろ。
>>190 int value = 0; を宣言。
先頭から読んでいって数字なら value = value * 10 + その数字;
文字列の終わりか、数字じゃなくなるまで続ける。
>>193 ヌル文字も数字じゃないから「文字列の終わりか」は余計。
>>190 まず、1.先頭のwhile(空白||タブ文字)を飛ばし。
次に、2. if('+')が付いてるかelse if('-')が付いてるかしたら、それぞれ処理。
そして、3. >193の話。
>>190 #include <stdio.h>
int atoi(const char *string)
{
int n;
return sscanf(string, "%d", &n) == 1 ? n : 0;
}
>>195 n n
(ヨ ) ( E)
/ | _、_ _、_ | ヽ
\ \/( ,_ノ` )/( <_,` )ヽ/ / グッジョブ!!
\(uu / uu)/
| ∧ /
199 :
デフォルトの名無しさん :03/10/07 22:22
>>199 > あとは右クリ(黒を置く)と左クリ(白を置く)を交代交代出来るようにして、
これってあまり意味ないんじゃ…
>>200 俺もそう思う・・・
けれど、それが仕様なんだから良いんじゃない?
右クリと左クリで交互に置けるようにしないと黒2回おいたりしちゃうし・・・ と、言いますか、仕様なので…
>>202 > 右クリと左クリで交互に置けるようにしないと黒2回おいたりしちゃうし・・・
(゚Д゚)ハァ?
>>200 同意。マウスとキーボードとかなら分かるけど。
でも1本のマウスで恋人同士で勝負するとかはやるかも。
>あとは右クリ(黒を置く)と左クリ(白を置く)を交代交代出来るようにして
static teban=1;みたいなのをあらかじめ用意しておいて
黒の時は、case WM_LBUTTONDOWNの後にif(teban==1)を付け加え、
偽だったら全処理を行なわない、又は手番が違うと表示するとか。
白の時はその逆。最後、breakで抜ける前にteban=3-tebanみたいにして反転させる。
>反転条件を縦、横、斜め
指した位置から8方向を調べる。上ならy--、右下ならy++,x++みたいにして、
相手の駒でなくなるまで調べる。その時その駒が自分の駒だったらひっくり返す。
むむ・・・変な事言っちゃったか? 上のプログラムだと、左クリックを2回したら2個白が置けちゃいますよね・・・ でもオセロなんだから、白の次は必ず黒を置かなければならないですよね・・・ だから、白を置いた後にまた白を置こうとしても無理にしないと・・・・ ってことをいいたかったんだけど・・・ てかまた変なこと言っちまった?
いいじゃね〜かよ。本人がそれが仕様だって言っているんだから。 ・・・でも、ちょっと変だね。
>>205 に付けたし
盤を参照する時
>>205 の方法だと配列をはみ出してしまって危険だから、
配列のサイズを2ずつ大きくしておいて、端は駒を置く位置としては
使わないようにする方が良い。
後、8方向を調べる時、左上から右回りに調べるとして、調べる位置を動かす時、
ptnY[]={-1,-1,-1,0,1,1,1,0}、ptnX[]={-1,0,1,1,1,0,-1,-1}
みたいな配列を作っておいて、
for(i=0;i<8;i++)
{
y+=ptnY[i];x+=ptnX[i];
if(osero[y][x]!=3-teban)break;
}
みたいに調べるとすっきりかけると思う。
>>199 ちょっとwebで検索して、オンラインのオセロがどういう使い勝手になっているか見てこい。
一例でも右クリックと左クリックを使い分けているものがあったら教えてくれ。
teban = 3 - teban; って激しく気持ち悪いな。 enum 使うのがいやでも普通は teban = 1 - teban; ってやると思っていたのだが。
人の仕様をボロクソに言うスレか、ここは・・・
teban, teban ってターバンって読んでた。 手番かよ。なんだよ。
enum位使えよ namespace color { enum { WHITE, BLACK }; } using namespace color; teban = teban == WHITE ? BLACK : WHITE;
bool teban; teban ^= true;
>>208 配列のサイズが 8x8 の場合は危険で、10x10 なら安全だという
理屈がわからん。
>>213 その無駄なnamespaceの意味は?
enum{WHITE, BLACK} teban++; teban &= BLACK;
>>216 グローバル名前空間にenum置くような馬鹿は絶滅したと思ったが。
>>214 普通は teban = !teban。
>>219 tebanがlhsにもrhsにも出てきちゃう所がイマイチ。
>>215 所謂センティネルでしょ。
8x8フィールドの外側に堀を用意するか、自分で壁を判断するかの違いだよね。
>>220 これじゃ意味無いけど、
using namespace color;
ChangeTurn()
{
teban = teban == WHITE ? BLACK : WHITE;
}
これなら意味あるでしょ
ChangeTurn()
{
using namespace color;
teban = teban == WHITE ? BLACK : WHITE;
}
>>194 ほらよ。
int atoi(const char*nptr){
int sign=1; int result=0;
while (*nptr == ' ' || *nptr == '\t') ++nptr;
if (*nptr == '-') { sign=-1;++nptr; } else if (*nptr == '+') ++nptr;
while (*nptr >= '0' && *nptr <= '9') result=10*result+(*(nptr++)-'0');
return result*sign;
}
isspace(), isdigit() を知らんのか・・・。
>>226 じゃあ、それらを使用してコードを晒してくれ。
>>221 たしかにそうだが、boolに対してbitwise exclusive orするよりはマシ。
>>227 isspace(), isdigit() に該当する処理を置き換えたら良いだけだろ。
一々ムキになるなよ・・・。
>>227 ほらよ。
int atoi(const char *string) {
const char *nptr = string;
int sign = 1, result = 0;
for (; isspace(*nptr & 0xff); ++nptr);
if (*nptr == '-') sign = -1, ++nptr;
else if (*nptr == '+') ++nptr;
for (; isdigit(*nptr & 0xff); result = 10 * result + *nptr++ - '0');
return sscanf(string, "%d", &result) == 1 ? result : 0;
}
>>229 isspaceってよりはisblankだけどな
( ´Д`)/先生!isblankなんてANSI Cにないです
int atoi(const char*s){ int sign=1; int result=0; while ( isblank(*s) ) ++s; if (*s == '-') { sign=-1; ++s; } else if (*s == '+') ++s; while ( isdigit(*s) ) result=10*result+(*(s++)-'0'); return result*sign; }
>>234 だからisblankはあんたのコンパイラにしか入ってませんよ
( ´,_ゝ`)
int atoi(const char*s) throw(boost::bad_lexical_cast) { return boost::lexical_cast<int>(s); }
>>223 センティネルなら両端2ずつ延ばして12x12のフィールドで
延ばした部分に白と黒を置いた方がいい
>>223 すまん
両端1ずつ延ばした10x10のフィールドで
延ばした部分に0(何もない状態)を置いた方がいいな
わざわざ大きめの配列作らなくても配列カプセル化するクラス作ってgetterとsetterにチェックさせるのが一番いい。
>>238 Cとは言ってないからな
でもboost使いましたってことをレポートに示すより
atoiくらい自力で書いた方が速くない?
それを考えると
>>191 や
>>195 の方がエレガントだな
なんだこの厨房スレは
>>226 そんなテーブルルックアップ関数は(゚听)イラネ
車輪の(ry
>>247 車輪の設計図盗んで来ただけですが何か?
'-')
℃〜
どれを選ぼうと、
>>190 は人に助けてもらったのがバレバレで教官にどやされるのだな。
>>252 よく分からんけど最後の部分が
moji[i] = '\0'; じゃなくて
gyaku[i] = '\0'; じゃないの?
単純なミスだと思われ
すいませんが、立てている文字列どうやって、横並びにしますか。 a i u e o を aiueo にする。
もう出来てるじゃないか
ごめんなさい、説明不足なんで、 立てている文字列のファイルを読み込んで、横並びにして、別のファイルに書き込みます。
番号(int no)、名前(char name[20])をメンバとする構造体を作成し、データ入力及び表示を行うプログラムを作成してください。 最大5件分の入力か、「input data?(y/n)」の問いかけに対して'n'が入力された場合に、入力処理を終了してデータを表示してください。 なお、番号は1〜9999の範囲で一意なものとし、範囲外番号や登録済みの番号が入力された場合は再入力させてください。 名前についても20文字以上入力された場合は、エラーメッセージを表示して再入力させてください。 1件分の入力処理はinput_data()で、表示はdisplay_data()と処理を関数に分けて行ってください。 って問題なんですけど、番号入力の部分がわからないんです。 誰かおねがいします。
while( c = getchar(), ( c != '\n' ? putchar(c) : 1 ) != EOF );
ちなみにC言語で、構造体のところまでしか習ってません。
scanf() とか fgets() + atoi() or sscanf() とか
262 :
デフォルトの名無しさん :03/10/08 15:34
教えてください。 行列の和と積を求めるプログラムを作成せよという課題が出たのですが、宣言した型の行列しか 計算できません。どんな型の行列にも対応したプログラムにしたいのですが・・・。 ちなみにコンパイラはgccです。
もへじは黙ってろよ
>>262 C++ならtemplateを使え。
Cならマクロを使って似た様なことができるが、面倒くさいので、
「計算する時、全部doubleにキャストする」って方法でごまかすのが吉。
キャストじゃうまくいかねーか。
例えばThis@is@meなら This is me 記号を使って文字列を分割して改行する関数divide(char *a,char c) を作って欲しいです。 使うヘッダはstdio.hだけです
>>266 つまりstrtokを使うなってことか…
>>266 divide(char *a, char c)
{
while (*a) {
if (*a == c) *a = '\n';
a++;
}
}
char *aを分割したい文字列 char cを区切り文字 記号を使って文字列を分割して改行し標準出力に表示すると仮定 void divide(char *a,char c){ for(;*a!='\0';*a++){ if(*a!=c)putchar(*a); else putchar('\n'); } }
>>266 void divide(char *a, char c)
{
while(*a != '\0')
{
*a == c ? putchar('\n') : putchar(*a);
a++;
}
}
>>270 putchar(*a == c ? '\n' : *a);
マインスイーパーのプログラムをC++でお願いします。
#include <iostream> main() { using namespace std; cout << "マインスイーパーのプログラム" << endl; }
276 :
デフォルトの名無しさん :03/10/08 20:35
バイナリファイルに2バイトのデータが3つずつかなり多く入ってるんだけど、それをそれぞれ3つの変数(配列)にfread関数を使って格納する方法が分からない。 ゼミの提出明日までなんだ。誰か教えてー。
unsigned short date[3]; fread(data, 2, 3, file);
>>269 の関数を使ってcompile&実行したら結果はでるんですけど、エラーも出ます
divide(char *a,char c)が間違ってました
*をつけた*divide(char *a,char c)なら内容はどう変わるんですか?
>>278 ???? *divide(char *a, char c)
???? を答えよ
280 :
デフォルトの名無しさん :03/10/08 21:11
<<277 違う違う。 a[],b[],c[]の3つに格納するんだよ。
>>284 char *divide(char *a, char c)
{
char *tmp = a;
while (*a) {
if (*a == c) *a = '\n';
a++;
}
return tmp;
}
a が const char * じゃなくて char * だからそんなとこだろうと思ったよ
>>285 コンパイルしてe@rと入力して実行したら
e
r
e
r
...
と無限に出てきます
>>286 入力部分のソースと出力部分のソースを出せ
>>288 無限に出力されるはずがない。
よって、お前の書いたコードのミス。
#include <stdio.h>
char *divide(char *a,char c);
int main(void){
char n[256],*p1,*p2;
printf(">");
fgets(n,256,stdin);
p1=n;
do{
p2=divide(p1,'@');
printf("%s\n",p1);
p1=p2;
}while(p2!=NULL);
}
後は
>>285
>>291 言 っ て た こ と と 違 い ま せ ん か ?
だめだこりゃ
#include <stdio.h> char *divide(char *a,char c); int main(void){ char n[256]; printf(">"); fgets(n,256,stdin); divide(n,'@'); printf("%s\n",n); }
>>291 は、strtok() のように扱いたかったんだろうか・・・。
298 :
デフォルトの名無しさん :03/10/09 17:48
おながいします、C++でマインスイパー作って;;
#include <iostream> main() { using namespace std; cout << "マインスイパー" << endl; }
300 :
デフォルトの名無しさん :03/10/09 18:24
誰か助けて。21:00までにうpきぼん。おながい。。 問題 C言語には平方根を求めるsqrt関数が用意されている。このsqrt関数を使わずに、 入力された自然数Nの平方根Rを、小数点以下4桁まで求めるプログラムを作成 せよ。
301 :
デフォルトの名無しさん :03/10/09 18:38
ヒント:平方根Rの整数部分をまず決定すれば良い。そのためには自然 数を小さい方から順番に2乗して、入力された自然数Nを超えない最大 の整数を求める。同じ原理を適用してRの小数部を決定する。 だって。だれかおながい。21:00以降でもいいから。
302 :
デフォルトの名無しさん :03/10/09 18:46
double x = 0; double d; for (d = 1.0; d <= 0.0001; d /= 10) { for (; x * x < n; x += d) ; x -= d; }
303 :
デフォルトの名無しさん :03/10/09 18:52
302って300の問題の答え? 自然数Nの入力とかなくない? もうちょっと補足してくれ。おながいします。
文字列:"abcMdefgMMef"のとき、Mが一つの場合、"MMMM"を出力して、 二つの場合"MMMMM"を出力する。 ちなみに "abcMMMMdefgMMMMMef"のように出力したいです。 お願いします。
>>303 そこまで面倒みない。自分でやれ。
>>304 while ((c = getchar()) != EOF) {
if (c == 'M') {
c = getchar();
printf("MMMM");
}
putchar(c);
}
s = 1; if (n > 1) s = n; do { r = s; s = (n / s + s) / 2.0; } while(s < r); で求まるらしいがヒントとは関係ないからおそらくバレるな。
元の文字列にMの数が違うによって、出力するMの数も違いますから、 305の回答はまだ不完全じゃないですか。
3つの場合は"MMMMMM"か?
M二つの場合"MMMM"、四つのM M三つの場合"MMMMM"、五つのMです
問題を正確に写してくれ。
文字列:"abcMdefgMMef"のとき、 Mが一つの場合、"MMMM"を出力して、 Mが二つの場合"MMMMM"を出力する。 ちなみに "abcMMMMdefgMMMMMef"のように出力する。
3つの場合は"MMMMMM"として while ((c = getchar()) != EOF) { if (c == 'M') { printf("MMMM"); while ((c = getchar()) != EOF && c == 'M') putchar(c); if (c != EOF) putchar(c); } else { putchar(c); } }
>>300 #include <stdio.h>
#include <math.h>
int main() {
double n;
printf("数値入れろモルァ: ");
fflush(stdout);
if (scanf("%lf", &n) == 1)
printf("平方根は%.4fでつ\n", pow(n, 0.5));
return 0;
}
>>314 これを丸写しして研究課題として提出だいえいオアがGはッウェアフィjsじゃl;
ってことになったらなんかやだな
fatal プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
>>316 #include "stdafx.h"
319 :
デフォルトの名無しさん :03/10/10 00:12
再帰関数(Recursive)にしないといけないんですが、どう直したらいいのでしょうか? void List::retrieve(int inde, ListItemType& dataItem, bool& success) const { success = bool ((inde>=1)&&(index<=size)); if (success) dataItem=items[translate(index)]; }
320 :
デフォルトの名無しさん :03/10/10 00:29
正の整数を5つ入力として受け付けて、それらを配列に格納し、 それを以下に示すように棒グラフとして出力せよ。 ・例、入力が6,5,1,10,9のとき ****** ***** * ********** *********
321 :
デフォルトの名無しさん :03/10/10 00:36
#include<stdio.h> int main(void){ int i,j,hairetu[5]; puts("正の整数を5つ入力だゴルァ") scanf("%d",&hairetu[i]); for(i=1;i<=5;i++){ for(j=1;j<=hairetu[i];j++){ printf("*"); } printf("\n"); } return(0); } どこが間違っていますか?
322 :
デフォルトの名無しさん :03/10/10 00:37
>>320-321 で実行すると
どんな数字を入力しても
*
*
*
*
*
となってしまいます
scanf("%d",&hairetu[i]); この時点でiの値が不定です
324 :
デフォルトの名無しさん :03/10/10 01:00
puts("正の整数を5つ入力だゴルァ") for(i=1;i<=5;i++){ printf("%d",i); scanf("%d",&hairetu[i]); } これを追加すればいいんですか?
>>324 配列がいくつから始まるか習わなかったか?
>>319 void List::retrieve(int index, ListItemType& dataItem, bool& success) const
{
if (index >= 0)
retrieve(-index, dataItem, success);
else {
success = index <= -1 && index >= -size;
if (success)
dataItem = items[translate(-index)];
}
success = !success;
}
327 :
デフォルトの名無しさん :03/10/10 01:20
>>327 それを知ってるのに、なぜ0からアクセスしない?
329 :
デフォルトの名無しさん :03/10/10 01:24
ってことはこうですか? puts("正の整数を5つ入力だゴルァ") for(i=0;i<5;i++){ printf("%d",i); scanf("%d",&hairetu[i]); }
入力が一回しか行なわれていないことには気づけないもんだろうか。
printf("%d",i); これにはなんの意味が?
もうわかりません #include<stdio.h> int main(void){ int i,j,hairetu[5]; puts("正の整数を5つ入力だゴルァ"); for(i=0;i<5;i++){ scanf("%d",&hairetu[i]); } for(i=0;i<5;i++){ for(j=0;j<hairetu[i];j++){ printf("*"); } printf("\n"); } return(0); }
333 :
デフォルトの名無しさん :03/10/10 01:51
四角形の面積を求めるプログラム誰か書いてみて
334 :
デフォルトの名無しさん :03/10/10 02:14
結局、解答はどんな感じなんでしょうか?
335 :
デフォルトの名無しさん :03/10/10 02:16
>>333 #include <stdio.h>
int main()
{
int teihen,takasa;
printf("底辺の長さは? :");
scanf("%d",&teihen);
printf("高さは? :");
scanf("%d",&takasa);
printf("面積は%dじゃネーノ?\n",teihen*takasa);
return 0;
}
336 :
デフォルトの名無しさん :03/10/10 02:23
337 :
デフォルトの名無しさん :03/10/10 02:50
>>320 #include <stdio.h>
int main()
{
int a[5],i,j;
printf("> ");
scanf("%d,%d,%d,%d,%d",a+0,a+1,a+2,a+3,a+4);
for(i=0;i<5;i++){
for(j=0;j<a[i];j++)
putchar('*');
putchar('\n');
}
return 0;
}
>>320 #include<stdio.h>
int main(void) {
int i, j, hairetu[5];
puts("正の整数を5つ入力だゴルァ");
for(i=0; i<5; i++) scanf("%d",&hairetu[i]);
for(i=0; i<5; i++) {
for(j=0; j<hairetu[i]; j++) putchar('*');
putchar('\n');
}
return(0);
}
>>337 とおおむね同じ。ポインタ習ってないと思うので、自然な形に変えただけ。
>>333 #define chouhoukei(teihen, takasa) ((teihen)*(takasa))
#define daikei(joutei, katei, takasa) (((joutei)+(katei))*(takasa)/2)
バッファオーバーラン対策きぼんぬ
341 :
デフォルトの名無しさん :03/10/10 04:02
>>339 以下の4点から構成される4角形の場合、
そのマクロをどう使うんでつか?
(3,2)(1,24)(12,15)(26,26)
>>342 三角形2つに分割してヘロンの公式で求めるべし
ただし凹四角形も考慮すること
頂点が4つ決まると、 四角形は一意に決まるのですか?
>>345 凹四角形を考慮しちゃうと定まらない希ガスる
やっぱ定まる
俺は定まらない
>>351 △←こんな形の三角形の、各頂点を上から右回りにA,B,Cとする。
これの重心よりすこし下の位置をkとする。
すると、四角形 ABCk と ABkC では面積が異なる。
致命的なバグが・・・ でもどうでもいいよね?
354 :
デフォルトの名無しさん :03/10/10 18:56
356 :
デフォルトの名無しさん :03/10/10 19:08
圧縮してあるので読む気が起きません
ソースの書き方つーとヘッダでusingすんなとか非インラインのメンバ関数の実装を ヘッダに書くなとか、ヘッダにはインクルードガードをつけろとかそういうのか? 意味もなくグローバル変数使ってる時点で真面目に読む気がせんのだが。
file1の中身:This is test program file2の中身: 1 program 2 b 3 ab 4 This 5 i 6 is 7 test ... file1とfile2を比較して、file2にfile1と同じ単語があったら、 ファイル2からその単語と単語前の数字を出力する。 このプログラムを教えてください。
>>360 355は違うが、何が悪いのかさっぱりわからん。
平行四辺形に限定しているってことを言いたいのか?
それなら339もそれと台形に限定しているだろ。
363 :
デフォルトの名無しさん :03/10/10 20:35
四角形の面積は凹四角形を考えるのがポイントだろ たぶん君には言ってもわからないと思うが
ああ、Thisなら4ってことか。スマソ
366 :
デフォルトの名無しさん :03/10/10 20:38
>>333 何を元に四角形を求めるんだ?
それを書かないと答えようがない。
367 :
デフォルトの名無しさん :03/10/10 20:38
・・・と最初から素直に指摘しておくべきだったか。
s/四角形/四角形の面積/
>>358 >>359 以外に、
グローバル関数・変数はなるべくnamespaceで包む
(そもそも今回の場合グローバル変数は使うべきでない)
extern ban;
extern sum;
これはひどすぎる
<<, >>, !=等の前後にスペース入れるべき
コンストラクタはできるだけ初期化子を使って初期化する
Test::Test() : a(0), name("名無し")
{
}
x = x / ban;
は
x /= banにすべき
>>369 > <<, >>, !=等の前後にスペース入れるべき
それは趣味の問題
>>359 すいません、まだ良く分かってないもので。
どこかにファイル分割したときの書き方などが書いてあるサイトがありますでしょうか?
あるいは今のレベルじゃ同じファイルに全部ソースを書いて置いたほうが良いんでしょうか?
外部参照宣言って普通ヘッダーファイルに書くんじゃ(定義はソースファイルに)・・・・
>>369-370 謝ってるばかりですが、申し訳ありません。
まだ始めて2週間ぐらいなもので、ちゃんとした書き方知りませんでした。
あれ、ヘッダーファイルなのか(T_T) 何行もある関数をクラスの中に直接・・・
あーまたちゃんとみていないし・・・ やっぱりクラスの外か。それはいいんだけど、ヘッダーファイルの中に書いちゃいけないよ。
test_c.hの「Test::Test() //コンストラクタ」より下を先頭に#include "test_c.h"を付加して別ファイルに。 extern ban;extern sum;は削除
>>374-376 検索してみてもファイル分割の方法やヘッダーやらの詳しい解説サイトがあまり見当たらないのです。
別ファイルにするというのは後ほどやってみます。
つーか今の状態でextern消したらコンパイル通らないだろ
>>373 プログラミング初めて2週間なら上出来なほうだと思う。
がんがれ。
>>378 test_c.hにextern int sum;が必要だな。
banだけ書いてなぜsumを書かないんだろう・・・
file1の中身:This is test program file2の中身: 1 program 2 b 3 ab 4 This 5 i 6 is 7 test ... file1とfile2を比較して、file2にfile1と同じ単語があったら、 ファイル2からその単語と単語前の数字を出力する。 このプログラムを教えてください。 うるさいかもしれないが、助けてくださいよ。
>>382 #include <iostream>
#include <fstream>
#include <map>
#include <string>
main()
{
using namespace std;
map<string, int> strmap;
ifstream file2("file2");
while(file2)
{
int i;
string s;
file2 >> i;
file2 >> s;
strmap[s] = i;
}
ifstream file1("file1");
string s;
while(file1 >> s)
{
map<string, int>::iterator it = strmap.find(s);
if(it != strmap.end())
{
cout << (*it).first << " " << (*it).second << endl;
}
}
}
>>384 (*it).firstはit->firstじゃだめなの?
>>385 本来そうあるべきだが、
C++準拠度がかなり高いコンパイラじゃないと、
it->firstは通らない。
できれば、Cで書いてほしいですけど、
マンドクセ
思った通りのレスだ。 Cスレにマルチしていたからそう来ると思った。
で、
>>354 はウダウダいってるだけでなんも書いて無いの?
>>333 #include <stdio.h>
#include <math.h>
int main() {
struct {int x, y;} p[4];
int i, s = 0;
for (i = 0; i < 8; i++) {
printf("%d点目の%c座標入れろモルァ: ", i / 2 + 1, 'X' + (i & 1));
fflush(stdout);
if (scanf("%d", &p->x + i) != 1)
return 1;
}
for (i = 0; i < 4; i++)
s += (p[(i + 3) & 3].x - p[(i + 1) & 3].x) * p[i].y;
printf("面積は%f\n", fabs(s / 2.0));
return 0;
}
>>388 file2読み取りのコードだけでこんなになっちまったぜ。
struct node { int id; char *word; };
struct storage { int num_node; struct node *first_node; };
struct storage node_storage = { 0, NULL };
FILE file1, file2;
int file2_size; char *file2_data;
file2 = fopen("file2","r");fseek(file2, 0, SEEK_END);
file2_size = ftell(file2); fseek(file2, 0, SEEK_SET);
file2_data = malloc(file2_size);
fread(file2_data, file2_size, 1, file2);
{ char *tmp, *last; char *next_line;
last = file2_data+file2_size;
for(next_line = tmp = file2_data; tmp < last; ++tmp){
if(*tmp == '\n'){
int id; char *word; char *line;
*tmp='\0'; line = next_line; next_line = tmp +1;
tmp=line; while( isdigit(*tmp) ) ++tmp; if( ! isblank(*tmp) ) continue; *tmp='\0'; id=atoi(*line);++tmp;
while( isblank(*tmp) ) ++tmp; if( *tmp == '\0' ) continue; word = tmp;
{
struct node cur_node;
node_storage.num_node++;
node_storage.first_node = realloc(node_storage.first_node, sizeof(struct node)*node_storage.num_node);
cur_node = node_storage.first_node + node_storage.num_node - 1;
cur_node->id = id; cur_node->word = word;
}
}
}
Cは駄目だな
>>393 × 'X' + (i & 1)
○ (i&1)?'Y':'X'
>>396 どこが間違ってるか分からないんだけど。
'X'に1足したものが'Y'になるという保証はない。 例えばASCII限定ならOKだが。
>>398 そんな環境は他の文字も化けるので、はなから相手にしていませんが。
誰もEBCDICの話なんかしていないと思うが・・・
>>401 EBCDIC以外でASCIIをサブセットとしていない文字コードを挙げてくれ
398じゃないが、 どのコード体系が云々とかいう問題じゃないだろう。 ある文字にある整数を加算した結果が特定の文字になることを期待してはいけない、ってことだろ。 言語としてそれが規定されているわけではないから。
というか三項演算子使った方が分かりやすくなると思うんだが。
というか剰余算使った方が分かりやすくなると思うんだが。
406 :
デフォルトの名無しさん :03/10/11 03:30
も前ら三項演算子とか可読性とか Lisper や Java 厨に影響されすぎ。 C なんだから男らしく "XY"[i&1] と書くべき。
(i&1)["XY"]
>>403 つまりC++では1+1=2とは限らないという事ですか。
>>408 漏れには 403 は (例えば) 'X' + 1 == 'Y' とは限らないって書いてあるようによめる。
同じものが君には「1+1=2とは限らない」と読めるのか。。。
>>409 フォローサンクス。
言いたいことはおっしゃるとおり。
>>408 推測するに、
「文字」ってのはつまるところ「int(C++ではchar)型の整数」なんだから
すなわち
>>403 は
「ある整数にある整数を加算した結果が特定の整数になることを期待してはならない」
と読み替えることができる。
と言いたいわけだな。
違ったらスマン。
俺にはこれ以上うまい説明を考えるのがめんどくさい。
C FAQかC++ FAQあたりにこれに関する議論が確かあったと思うので
それを読んでくれ。以上。
わざわざ説明しなくても勘違いしたのはおそらく408だけ。
>>408 その通りです。
+演算子をオーバーロードすれば
1+1が3にでも11にでもなります。
>>412 演算子をオーバーロードできるのは少なくともひとつの
ユーザー定義型をオペランドに持つときだけなんだなこれが。
415 :
デフォルトの名無しさん :03/10/11 19:36
ヘッダーファイ参上
>>425 そこから何をすればいいのかよく分からない。
Rectangleのメソッドを実装すればいいの?Pointの方は実装しなくて良いの?
本当に何をすればいいのかわからんな。
ヘッダーファイ「ル」が抜けてましたね。失礼しました。 Point, Rectangle 両方実装します。 出題の文章がこれしかないので、推測できる範囲で結構です。 よろしければ、ご回答を元に、C講師の添削した結果を後日書きます。
420 :
名無し@沢村 :03/10/11 22:51
おまいらよ、TSXBINって知ってるか?
これは土屋秀雄というガキがつくったバイナリエディタだが、ただのバイナリエディタではなく、いろいろなファイルをそのファイルのフォーマット解説つきでバイナリ表示&編集できるというなかなかのすぐれものバイナリエディタよ。
で、ファイルを開いたときに、フォーマット解説を表示するためには、そのフォーマットを記述したマクロファイルを定義しなければならないわけだが、最初からおまけでついているものは、BMP、GIF、JPG、ICO、LZHなどだよ。
つまり実際はBMP、GIF、JPG、ICO、LZHファイルに限ってフォーマット解説が見れるわけだな。
おまいらよ、おれはこのTSXBIN用のマクロとして、MIDとMLD用のやつをつくったからちょっと見てみろ?
つまりこのマクロがあると、パソコン用のMIDIファイルと携帯DoCoMo用のMfiファイルがフォーマット解説つきでバイナリ表示できるぞ。
ここ↓からダウンロードしてみろ?
http://hp.vector.co.jp/authors/VA015412/ おまいらよ、これはMIDIシーケンサーを学ぶおまいらにとてもためになるものだから、ちょっと見てみろ!?
あの・・・誰かやってくれませんか?
> よろしければ、ご回答を元に、C講師の添削した結果を後日書きます。 捕捉です。 見たい、という方にはです。 うちの講師も授業中にふらふら他所のクラスに出かけるいいかげんな人なので、 イマイチ信用できません。
421 は私ではありませんので・・・ いま書き込んで気が付きました。 め!
座標の入力と出力だけじゃ0点
>>415 #include <iostream>
using namespace std;
#include "rectangle.h"
Point::Point(double x, double y) : mp_x(x), mp_y(y) {}
Point::Point(const Point& p) : mp_x(p.mp_x), mp_y(p.mp_y) {}
Point::~Point() {}
Point& Point::operator=(const Point& p)
{ mp_x = p.mp_x; mp_y = p.mp_y; return *this; }
ostream& operator<<(ostream& out, const Point& p)
{ return out << "(" << p.mp_x << ", " << p.mp_y << ")"; }
istream& operator>>(istream& in, Point& p)
{ return in >> p.mp_x >> p.mp_y; }
Rectangle::Rectangle(const Point& p1, const Point& p2, const Point& p3, const Point& p4)
: mp_p1(p1), mp_p2(p2), mp_p3(p3), mp_p4(p4) {}
Rectangle::Rectangle(const Rectangle& rect)
: mp_p1(rect.mp_p1), mp_p2(rect.mp_p2), mp_p3(rect.mp_p3), mp_p4(rect.mp_p4) {}
Rectangle::~Rectangle() {}
Rectangle& Rectangle::operator=(const Rectangle& rect)
{ mp_p1 = rect.mp_p1; mp_p2 = rect.mp_p2; mp_p3 = rect.mp_p3; mp_p4 = rect.mp_p4; return *this; }
ostream& operator<<(ostream& out, const Rectangle& rect)
{ return out << "[" << rect.mp_p1 << ", " << rect.mp_p2 << ", " << rect.mp_p3 << ", " << rect.mp_p4 << "]"; }
istream& operator>>(istream& in, Rectangle& rect)
{ return in >> rect.mp_p1 >> rect.mp_p2 >> rect.mp_p3 >> rect.mp_p4; }
427 :
デフォルトの名無しさん :03/10/12 13:39
アプリケーションのADTの壁を破壊してはいけない主な理由は? A. プログラムがRunしない。 B. ADTのインフォメーションはPrivate であるべき。 C. ADTの変更は、アプリケーションプログラムの変更が必要。 D. ADTの変更は、アプリケーションプログラムのリコンパイルが必要。 よろしくお願いします。
428 :
デフォルトの名無しさん :03/10/12 14:17
.cppでキーボードからEnterとかスペースが押されたのは どうやって判別するんですか? 実行例 スペースボタンを押してください (スペースを押すと) スペースを押したね? みたいな・・・
>>427 > アプリケーションのADTの壁を破壊してはいけない主な理由は?
> A. プログラムがRunしない。
×。これが正しいならADTの壁は破壊できないことになる。破壊できる
から、してはいけない理由を問うている。
> B. ADTのインフォメーションはPrivate であるべき。
×。理由になってない。
> C. ADTの変更は、アプリケーションプログラムの変更が必要。
○。アプリケーションがADTの壁を破壊し、ADTの内部構造に依存して
いればそうなる可能性がある。
> D. ADTの変更は、アプリケーションプログラムのリコンパイルが必要。
×。ADTはインタプリタ言語にも存在する。
ADTって何の略? いろいろありすぎて検索してもわからんかった。
>>430 まったく同じ・・・(w
検索しても???だった
private/変更/内部構造 あたりの単語から Abstract Data Type の略と想像。 壁の破壊ってのが良くわからんな・・・ ICollection i; Array a = (Array)i; みたいな事だろうか?
Application Development Tool でも通じるんだよなぁ・・・壁は相変わらず意味不明だけど。
ひとつ言えることはC/C++の宿題ではないということだな。
どうもありがとうございます。 とりあえずそのまま貼ってコンパイルすると、エラーがいくつかでてきますが、 自分で直せそうなところは直してみます。 もしわかんなかったら、またお聞きします。
>>437 ちなみに
>>415 でリンクしているヘッダーファイルの
> ~Rectangel();
はスペルミスだと思う。コンパイルエラーはこのせいではない?
>>436 ということは、誰よりも
>>427 自身がADTって何のことだかわかってないってことですか?
>>439 いや、スレタイはああなっているものの、実際はC/C++に限らず宿題ならやってくれると思ったんだろ。
441 :
デフォルトの名無しさん :03/10/12 22:14
C言語で宜しくお願いします。m(__)m 数値を入力し、その数値が素数ならYes、素数でないならNoと表示するプログラム を作成せよ。
442 :
デフォルトの名無しさん :03/10/12 22:19
>>441 #include <stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
for(i=2;i<n;i++)
if(!(n%i))
return printf("No\n");
return printf("Yes\n");
}
>442 ありがとうございますm(__)m
>>441 #include <stdio.h>
#include <math.h>
int isPrime(int n)
{
int i, m;
if ( n < 2 ) return 0;
if ( n == 2 ) return 1;
if ( n % 2 == 0 ) return 0;
m = sqrt(n);
for ( i = 3; i <= m; i += 2 ) {
if ( n % i == 0 ) return 0;
}
return 1;
}
int main(void)
{
int n = 0;
scanf("%d",&n);
if ( isPrime(n) ) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
#include <stdio.h> int main() { int num; char ans; printf("数字を入力してください\n"); scanf("%d", &num); printf("%dは素数ですか?(y/n)\n", num); scanf(" %c", &ans); if (ans == 'y') printf("%dは素数です\n"); else printf("%dは素数ではありません\n"); return 0; }
> 438 そのとおりです。スペルミスでした。 でも、そこを直しても、エラーが14個でてくるので・・・ でもでも回答いただけてありがたかったです。 ここまで書くのは、たぶん、1、2日はかかるので。 何気に名スレの評判は確かですね。
実数型のfloatとdoubleの変数を宣言して0で初期化しなさい。 それぞれに0.01を1万回加えて、その結果を確かめなさい。 こんな問題です。 一応馬鹿なりに考えて見た結果。 #include<stdio.h> main() { int i; float f; double d; f=0; d=0; for(i=1; i<=10000; ++i){ f=f+0.01; d=d+0.01; } printf("floatは%dです。\n",f); printf("doubleは%dです。\n",d); } こういうことになったんですけど、間違っているのは目に見えているので教えてください。
多分自己解決しました。 変換指定子が間違っていたんですね。。多分
>>447 > でも、そこを直しても、エラーが14個でてくるので・・・
ひょっとしてレイアウトのための全角スペースを消してないとか。
インデントされてみえるところは全部全角スペースだから、そのままでは通らない。
遅くなってすみません。 レスして下さった皆様、有難うございました。m(__)m
454 :
デフォルトの名無しさん :03/10/13 09:40
二つのテキストファイルのそれぞれの先頭からスペースまでの数値同士を演算して 結果を別のファイルに出力し、またスペース以降の数値同士を演算して。。。 といった処理を繰り返すプログラムを作っているのですが、どうにもうまくいきません。 どのようにすればより簡単にできますでしょうか?
#include <iostream> #include <fstream> main() { using namespace std; ifstream ifsa("a.txt"); ifstream ifsb("b.txt"); ofstream ofs("result.txt"); double a, b, out; while(ifsa && ifsb) { ifsa >> a; ifsb >> b; out = a * b; ofs << out << " "; } ofs << endl; }
456 :
デフォルトの名無しさん :03/10/13 10:26
構造体 struct verbform{ char present[10]; char past[10]; }; でデータがstruct verbformverblist[]={{"have","had"}....} と与えられていてこれを番人付き線形探索をするのだ。
すれば?
fstreamでこんなに簡単に使ってできるんですね・・・ まだまだ初心者なもので、知りませんでした。 ところでですね。 【using namespace std;】 と定義していますが、ここの意味がいまいち分かりません( ;^^) これを記述することで、どのような事があるのでしょうか? アドバイス、よろしくお願いします。。
std::ifstreamとかstd::endlとかのstd::を省略できる。
>>458 C++の入門書ぐらい買って読めよ。さもなくば、プログラミングやめろ。
そういうことだったんですか。。 早速、取り掛かってみたいと思います。 レスしていただいたみなさん(460除外)ありがとうございました! m(__)m
462 :
デフォルトの名無しさん :03/10/13 15:43
C言語で電卓を作りたいのですが、 ●数字キーは0〜9 ●小数点、符号反転、OFFキー(.,+/-,OFF) ●演算キー(+,-,*,/,=,AC,CE) ●表示部(Display) このような電卓の作るプログラムを教えて下さい。 反転符号は、数の入力時にどこで押してもok。一回押されるごとに 符号が反転します。 計算は簡単な電卓に見られるように左優先で計算し、 乗除算が加減算を優先することはありません。
とりあえず 数値にしろ反転にしろ、 キーが押されたら反応するってのは 標準Cだけでは無理
>464 できるならやってみな
一番ためになる助言をしてくれた460を除外した454の先も見えたな
getchar() fflush(stdin)
setvbuf(stdin, NULL, _IONBF, 0); getchar();
470 :
デフォルトの名無しさん :03/10/13 16:10
>>463 ボタンは作らなくてもいいんです。
電卓のレイアウトは一切気にしないで、
scanf文で読み込むだけでいいんです。
数の入力もコマンド上でやります。
>470 int main() { int number; while (1) { char s[]; int n; 数字かコマンドを入力(s); switch (s[0]) { case '+': 数字を入力(); number += n; break; case '-': 数字を入力(); number -= n; break; case '*': ...; case '反転': number = -number; break; default: number = atoi(s); } numberを表示(); if (終了) break; } return 0; }
>>473 入門書買えという助言がためにならないと感じるなら末期症状だ
わからないことが出るたびに2chで聞くような対処療法には限界があるぞ
>>475 言いたい事が分かった。俺が間違ってたよ。
10個の整数を格納出来る配列を宣言し其の各要素をキーボードから入力せよ。 そして其の配列中の要素で5以上の物の個数を求めて出力せよ。 C言語で宜しくおながいします・・・。
int data[10]; int i; int count = 0; for (i = 0; i < 10; ++i) { scanf("%d", i個目のデータのアドレス); } for (i = 0; i < 10; ++i) { if (data[i]が5以上?) { count++; } } printf("%d\n", count);
480 :
デフォルトの名無しさん :03/10/13 19:24
添削お願い致しますします。 「標準入力から読み込んだ2つの整数の除算を行い、 その解を小数点以下20桁まで表示するプログラムを作成せよ。 プログラムにおいては、ループをまわして各桁をその都度計算し表示すること。 ただし、計算途中で割りきれた場合は、それ以後の少数値は求めない。 また、割る数に0が入力された場合は計算を行わない。」 っていう問題です。 出来たのは出来たんですが、無駄があるかも知れません。 ちなみに僕はC言語2週間目です。
481 :
デフォルトの名無しさん :03/10/13 19:27
#include <stdio.h> main() { int i, s, x, y; printf("x: "); scanf("%d", &x); printf("y: "); scanf("%d", &y); if (y != 0) printf("x / y = %d", x / y);
482 :
デフォルトの名無しさん :03/10/13 19:27
for (i = 1; i <= 20; i++) { if (y == 0){ printf("割れません"); break; } s = (x - (x / y) * y) * 10; if (s == 0) continue; if (i == 1) printf("."); printf("%d", s / y); x = s; } printf("\n"); }
>>480 仕様を満たしていないので 20/100 点
どちらかの数字が負の場合正しく表示されない。
例:-5/2
yが大きいとき正しく表示されない。
例:1/2000000000 (ただしsizeof(int)==4)
添削と採点の違いってわかるかな?
添削:答案を ただ点数をつけるだけでなく、誤りの点を指摘したり 講評を添えたり して返すこと。 Shin Meikai Kokugo Dictionary, 5th edition (C) Sanseido Co., Ltd. 1972,1974,1981,1989,1997 というわけで俺は問題を指摘してやったわけだが。
あっそ
>>483 ありがとうございます。
>yが大きいとき正しく表示されない。
>例:1/2000000000 (ただしsizeof(int)==4)
の部分はまだ習っていないので分かりませんが、
負の場合にちゃんと出るようにやってみたいと思います。
もしさっきのソースコードで正解だった場合、
無駄、もしくは簡単にできる部分はありますか?
>>487 continueはbreakの方がいいな。
490 :
デフォルトの名無しさん :03/10/13 21:11
>>480 問題の題意をちゃんと把握しているか?
これは要するに、
"藻前らが今まで学校でやって来た「筆算」をエミュレートしてみれ"
と言っているのだと思うぞ。
Cを習い始めて2週間目の課題としては
ちと厳しいかも・・・
491 :
デフォルトの名無しさん :03/10/13 21:50
1.1から20までの整数のうち、偶数の和を求める プログラムをfor文を用いて作りなさい。 2.キーボードから整数を入力させ、1から入力した整数の うち、3の倍数のみを表示するプログラムを作成しなさい。 全然思いつきません(泣)お願いします
492 :
デフォルトの名無しさん :03/10/13 21:57
1000分の1の確率で1(当たり)を返して、 1000分の999の確率で0(はずれ)を返す関数を作ってください。 rand()を使うんだと思うんですが、よくわかりません。
int kansuu(void){ return rand()%1000==0; }
>>492 return ! ( rand() % 1000 );
ただし rand() が線形合同法ならお勧めできない
495 :
デフォルトの名無しさん :03/10/13 22:01
>>491 1.
int i, sum=0;
for(i=2; i<=20; i=2) sum+=i;
printf("%d\n",sum);
2.
int i,max;
scanf("%d",&max);
for(i=1;i<=max;i++) if(i%3==0) printf("%d\n",i);
確かめてないからバグあるかも。
とりあえずメインにぶちこんでコンパイルしてみ。
>>491 #include <iostream>
int Sum(int last,int rate)
{
int ret=0;
for(int i=1; i<=last; ++i){
if(!(i%rate)) ret += i;
}
return ret;
}
int main()
{
using namespace std;
cout<<Sum(20,2)<<endl;
int num;
cout<<"last number :";cin>>val;
cout<<Sum(num,3)<<endl;
return 0;
}
497 :
デフォルトの名無しさん :03/10/14 00:16
字句解析クラスを書いているんですが よくあるPushBack()のようなメソッド(javaのStreamTokenizerにもありますね) どんな実装になっているのでしょう? バックトラックしながらtokenの区切りまで戻しているのでしょうか。 それだとラインコメントなどがあった場合すごく面倒臭いと思いますが・・・。 今はNextToken()の呼び出し毎にトークン位置をスタックに積んでおき、 PushBack()の呼び出し時にpopして読み出し位置を設定してますが、 もっといい実装方法があるんじゃないかと悩んでます。 どんな実装が最適でしょうか?
498 :
デフォルトの名無しさん :03/10/14 00:21
この問題がわかりません #include <stdio.h> int main(){ char* a, *b; char c[] = "123"; a = c; *(c+1) = *a++; b = a++; printf("*a=%c \t *b=%c\n",*a,*b); return 0; }
>>497 PushBack()は、ただフラグを立てるだけ。
NextToken()が呼ばれたときにフラグが立っていれば、
フラグを落として、前回返した値をそのまま返す。
>>499 PushBack();PushBack();
とやっても2個前には戻らないんですね・・・。
じゃ、構文解析器で2個前のtokenを取得したいってな場合は、
どこかにtokenを退避させとくしかないのかな。
2個前のtokenが必要になる事事態が解析方法ミスってますか?(藁
>>501 たいていの言語の文法は、トークンをひとつ先読みできれば
解析できるようにできている(もちろん例外はある)。
497が解析しようとしている文法がLALR(1)やLL(1)に属して
いるのであれば、トークンひとつの先読みで解析できるはずだ。
>>502 だからPushBack()は2個前に戻れるような仕様でなくてもいい訳ですか。
脳みその肥やしになりました。ありがと。
>>498 はなぜそんな無意味なポインタの使い方をするんだ?
ポインタの危険性が分かってないのか。
*(c+1)と書くことにメリットはあるか?c[1]と書けばいいだろうが。
それから*a++;なんてのは煩雑になるからやめろ。
*(c+1) = *a++; は
a++; c[1] = *a;
と書け。
どうしても1行にしたけりゃ c[1]=*(a++);にしろ。
505 :
デフォルトの名無しさん :03/10/14 04:06
Winプログラムで、CreatFont()を使って文字を大きく違うフォントにしたいのですがどうやってやればいいのでしょうか? 文字はMS Pゴシックで論理値を「30」 論値平均幅を「20」であとは全ていじくらない状態で文字を描画します。 あと作成したフォントを元のフォントに戻す方法もお願いします。
>>504 わかってないのはお前じゃねーの?
*(c+1) = *a++; と
a++; c[1] = *a; は
動作が異なるぞ
>>505 状況説明能力をもう少しつけたほうがいいと思う。
> 文字を大きく違うフォント
何と違うのか不明。
> であとは全ていじくらない状態で
俺には一行目と矛盾しているように読める。
大きく違うのにファミリーとサイズ以外はいじらないのか?
いじらないとは何と比べていじらないのか?
> 作成したフォントを元のフォントに戻す
作成したフォントを元に戻すとは削除するということか?日本語がおかしい。
509 :
デフォルトの名無しさん :03/10/14 05:11
再帰関数を使い配列の中の最小値を求める。 void recursiveMinimum (int x[], int size)を関数の宣言にどうぞ。
それでどうやって結果を返すんだよ
>>505 CreateFont(...)でHFONTを作成してからSelectObject(...)でHDCにHFONTをセット。
TextOut(...)か何かで文字を描画すれば作成したフォントで文字を描画できる。
元に戻したい場合はSelectObject(...)の戻り値に以前にHDCに割り当てられていたHFONTが帰ってくるから
それをHDCに対してSelectObject(...)。
ヘルプ嫁。酔ってるので間違ってたらWin32API質問箱の優しいおにーちゃんに聞け。
と言うか検索くらし汁。
>>510 探索結果を利用できないので最適化の結果こうなりますた。
void recursiveMinimum (int x[], int size){}
学校の授業でWin32のプログラミングなんてやるのか? そんな学校やめちまえ。
計算機を作ってください
>>517 M = (Q, Σ, Γ, δ, q_0, B, F)
Q : 状態の有限集合
Γ : テープ記号の有限集合
Σ ⊆ Γ : 入力記号
q_0 ∈ Q : 初期状態
B ∈ Γ - Σ : 空白記号
F ⊆ Q : 受理状態の有限集合
δ : 動作関数
δ : Q × Γ → Q × Γ × {Left, Stop, Right}
テープは両方向無限 読み書き可
チューリングもびっくり
521 :
デフォルトの名無しさん :03/10/15 03:22
#include <stdio.h> int keisan(int*,int*,int*,int); void main(void) {int suu1;int suu2;int kotae;int enzan; printf("四則演算を行います\n"); printf("どの演算子を利用しますか?(+→1:−→2:*→3:÷→4)==>"); rewind(stdin); scanf("%d",&enzan); printf("演算する数を入力してください(1つ目)"); rewind(stdin); scanf("%d",&suu1); printf("演算する数を入力してください(2つ目)"); rewind(stdin); scanf("%d",&suu2); keisan(&suu1,&suu2,&kotae,enzan); printf("答えは『%d』です。",kotae); } int keisan(int* a,int* b,int* c,int d) { if(d==1)c=a+b; if(d==2)c=a-b; if(d==3)c=a*b; if(d==4)c=a/b; return c; } エラーがでてしまいます。メイン関数は一切いじらず、自作関数の部分を自分で作れ って問題なんですが分かりません。&suu1,&suu2を使ってるからポインタだと思うんですが 訂正お願いします
エラーメッセージを張れ
523 :
デフォルトの名無しさん :03/10/15 03:31
error C2110: ポインタにポインタを加えようとしました。 error C2440: '=' : 'int' から 'int *' に変換することはできません。(新しい動作 ; ヘルプを参照) 整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。 error C2296: '*' : 不正な左オペランドです。 error C2297: '*' : 不正な右オペランドです。 error C2296: '/' : 不正な左オペランドです。 error C2297: '/' : 不正な右オペランドです。 error C2440: 'return' : 'int *' から 'int' に変換することはできません。(新しい動作 ; ヘルプを参照) この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。 cl.exe の実行エラー - エラー 7、警告 0
ポインタのさす先の値を使用したり代入したりするときは頭に*をつけれ。 c=a+b; ↓ *c = *a + *b; 他も同じ。
525 :
デフォルトの名無しさん :03/10/15 03:57
さんくす
> rewind(stdin); (^o^;)
>>521 rewind(stdin);
は要らん
シークになんの意味が・・・・ つーかstdinならシークできないことが多いんじゃ・・
rewindはひょっとして出力をフラッシュしようとしてるとか? まぁscanf呼び出した時にフラッシュされるから、どっちにしろいらんけど
入力がパイプだったりすると seek できたりするから、 間違った rewind は入れないほうがいいと思う。
>>521 rewind(stdin)とかfflush(stdin)はANSI-Cでは動作未定義です。
ここでは、PICプログラムでもOKですか? PICはMICROCHIP社製で16LF628 SOICタイプで 開発環境はマイクロチップ社製の MPLAB ICE Universal Emulator v2.60 でライターはPICSTART Plusを使っています。
534 :
デフォルトの名無しさん :03/10/15 17:16
どなたかこの二問やってみてくれませんか(^o^;) 分からないです。 *成績処理プログラムの作成* 番号、名前、得点からなる一クラスの成績データを以下のように処理するプログラムを作成しなさい。 なお、データは各自が作成すること。(10名分以上) (処理) 各生徒の得点を 100〜80点・・・・A 79〜70点・・・・B 69〜60点・・・・C 59〜0点・・・・D のようなランク付けし、1行に1名分のデータを番号、名前、得点、ランクの順にそろえて表示する。 *問題2[成績処理プログラムの作成]* 更に、平均点(少数2桁まで)、最高点最低点を最後に表示するプログラムを作成せよ
535 :
デフォルトの名無しさん :03/10/15 17:50
配列に入れてループで表示や平均点を求める。
失礼いたします。 以下の条件を満たすプログラムを作りたいのですが いろいろぐぐってもよくわからないのです。 ・0以上の整数「x」と「y」を入力 ・関数「plus(x,y)」を使用しxとyの和を求める ・再帰呼び出しの形で書く ・ただし+と-は使えない よろしく、お願いいたします。。。
>>536 unsigned plus( unsigned x, unsigned y ){ return y==0 ? x: plus( x^y, (x&y)<<1 ); }
>>537 この面白そうな解は何?
これ何の問題なん?
しまった・・・ plus(x,y)はint型でなければならないんだった _l ̄l○
>>537 サン ゴメンナサイ... クビツッテキマス
加算と桁上げをbit単位でしてるだけ
>>540 (1) まず、ビット単位で桁上がりがない足し算を考える。
0 + 0 = 0
1 + 0 = 1
0 + 1 = 1
1 + 1 = 0
つまり x ^ y。
(2) 次に、ビット単位で足し算したとき、どのケースで桁上がりおこるかを考える。
0 + 0 = 0
1 + 0 = 0
0 + 1 = 0
1 + 1 = 1
つまり、x & y。
(3) 桁上がりがなくなるまで、(1)を x、(2)を1ビット左にずらしたものを y として、
(1)から繰り返す。
どーでもいいがC++だと標準ライブラリにplusってのあるから、設問自体ダメダメだな。
546 :
デフォルトの名無しさん :03/10/15 21:46
国崎を最高にするプログラムを作って頂きたい
>>546 #include <stdlib.h>
#define N 10
int main(void) {
struct {int num; char name[10]; int score;} r[N] = {{1, "
>>534 ", 0}};
int i, sum, min, max;
for (i = 1; i < N; i++) {
r[i].num = i + 1;
sprintf(r[i].name, ">>%d", i + 1);
r[i].score = rand() % 101;
}
/* 問題1 */
for (i = 0; i < N; i++)
printf("%3d %-10s %3d %c\n", r[i].num, r[i].name, r[i].score,
"DDDDDDCBAA"[r[i].score / 10]);
/* 問題2 */
sum = min = max = r[0].score;
for (i = 1; i < N; i++) {
sum += r[i].score;
if (r[i].score < min) min = r[i].score;
if (r[i].score > max) max = r[i].score;
}
printf("平均 %.2f 最高 %d 最低 %d\n", (double)sum / N, max, min);
return 0;
}
>>548 #include <stdio.h> が抜けた。
>>547 #include <iostream>
main()
{
for(;;std::cout << "クニサキサイコー" << endl;);
}
551 :
デフォルトの名無しさん :03/10/16 02:11
考えても分からないのでどなたか助けてください。 問題:連結リストとして扱われているString文字列で下記の オペレーションを含んだClass Newstringを作る。(String1とString2はNewstringのタイプ) string1.concatenate(string2) String1の最後にString2を結合。 string1.concatenate(ch) String1の最後に一文字のchを結合。 string1.display()スタンダードアウトプットでString1を表示。 string1.length() String1の長さをReturnする。 string1.substring(string2) String2がString1のサブストリングならReturn1、 違えばReturn2 サブストリングの意味が良く分からないのですが、よろしくお願いします。
>>551 サブストリングの意味、部分文字列。
"abcde" のサブストリングというと、 "bcd" とか "de" とか。
サブストリングという言葉が分からないお前も、
部分文字列とか、String2 が String1 に含まれるなら
とか書かないその問題作った奴も両方 DQN。
>>551 string2がstring1の部分文字列かどうか。つまりstring2がstring1に含まれているかどうか。
なお、c/c++は大文字小文字を区別するんだから意味無くキャピタライズするな。
その他の文字列処理関数 char *strncpy(char *s1, const char *s2, size_t n); char *strncat(char *s1, const char *s2, size_t n); int strncmp(const char *s1, const char *s2, size_t n); char *strchr(const char *s1, char c); char strrchr(const char *s1, char c); size_t strspn(const char *s1, const char *s2); size_t strcspn(const char *s1, const char *s2); char *strpbrk(const char *s1, const char *s2); char *strstr(const char *s1, const char *s2); char *strerror(size_t n); char strtok(char *s1, const char *s2); 練習問題 2つの文字列を入力として受け付けて、それらが等しけ ればyesを、等しくなければnoを出力せよ。ただし、文 字列ライブラリを使ってはならない。 文字列を入力として受け付けて、その文字列中にabcと いう文字列が含まれていればyesを含まれていなければ noを出力せよ。ただし、文字列ライブラリを使っては ならない。 例 n ugabcftという文字列が入力された場合→ yes n abcという文字列が入力された場合→ yes n iunhabという文字列が入力された場合→ no お願いします。
>>554 訂正
問題
文字列を入力として受け付けて、その文字列中にabcと
いう文字列が含まれていればyesを含まれていなければ
noを出力せよ。ただし、文字列ライブラリを使っては
ならない。
例
n ugabcftという文字列が入力された場合→ yes
n abcという文字列が入力された場合→ yes
n iunhabという文字列が入力された場合→ no
お願いします。
556 :
デフォルトの名無しさん :03/10/16 04:35
ありがとうございます。 このClass Newstringも作成お願いしたいのですが、 できる方どうぞ。自分でがんばってみたのですが、 出来ません。
557 :
デフォルトの名無しさん :03/10/16 06:59
>>557 strstrにstrcmp使うのは美しくないなぁ。
>>555 int check_getchar(){
const char *target="abc";
const char *tmp, *last;
int input;
tmp=target;
last=target+strlen(target);
while( EOF != (input=getchar()) ) {
if( *tmp == input ) {
if( ++tmp == last ) return 1;
}else{
tmp=target;
}
}
return 0;
}
int main(){
printf("%s\n",check_getchar()?"yes":"no");
return 0;
}
560 :
デフォルトの名無しさん :03/10/16 08:32
ん? 「strcmp使わない」!=「>558のコード」 >558は、検索対象"abc"とストリーム入力に合わせて単純化してある。 strcmp使うと、初期パターンとの照合はさむ余地が無いでしょ。
>>558 aabcで失敗するわ、決まり(strlen ただし、文字列ライブラリを使ってはならない)は守らないわで問題外だな。
>>558 >>560 strcmpじゃなくてstrncmpなんだが。
C++でマインスイーパーは無理なでしょうか? もしくは、スレ主の4年間の勉強ではまだ実力不足ということですか? 起動は x名前 & でも、ディスプレイ上にそれと思わしき単語がでてくるでも可能ですよ。
>561 "aabc"ならint32_tでの比較が速くて良いな。
>>562 xならGPLのマインスイーパがあるのでそれ使ったらどうですか?
[煽ったらやってくれるかなあ・・・]
>>562 >>314 が既にやってくれている。
試しに動かしてみたけど、それなり動いるようだった。
ただし…
>>563 なんたそのANSI非準拠型の汚い型は?
> なんた ( ´,_ゝ`)
>>554 #include <algorithm>
#include <iostream>
using namespace std;
main()
{
char *str;
static const char* abc = "abc";
cin.seekg(0, ios_base::end);
size_t size = cin.tellg();
cin.seekg(0, ios_base::beg);
str = new char[size];
cin.get(str, size);
size_t end = str+size;
cout << search(str, end , abc, abc+3) != end ? "yes" : "no" << endl;
delete[] str;
}
>>562 このスレは自分だったかな?C宿スレの1000まで行ったのを見つけて、
まだ立てられていなかった時、立てた事もあったが。
ただ、本当に1がやるのではない。1代目スレの時は1が中心に解いていた
のかも知れないけど。主旨が多少ずれても、名前を受け継いでいくのは、
2chの名残。
×size_t end = str+size ○char* end = str+size;
>>569 確かにこれなら文字列ライブラリは使われてないな。
>>569 ( ´,_ゝ`)プッ
cin.seekg(0, ios_base::end);
・
・
・
cin.get(str, size);
>>569 ,572
藻前裸アフォだろ。どう見ても動かないだろそれ。
つーかこれで十分だべ。string.hもstringも使ってないし。 #include <algorithm> #include <iostream> namespace { const char* abc = "abc"; const size_t maxSize = 16384; const char* result[] = { "yes", "no" }; } main() { using namespace std; char str[maxSize + 1]; cin.getline(str, maxSize); char* end = str+strlen(str); cout << result[search(str, end , abc, abc+3) != end ? 0 : 1] << endl; }
>>575 詰めが甘いな
× char* end = str+strlen(str);
○ char* end = find(str, str+maxSize, '\0');
577 :
デフォルトの名無しさん :03/10/16 12:59
たったこれだけの事に22レスもかかってやっと完成かよ。このスレレベル低いな。
>>567 ISO/IEC 9899:1999ですがなにか?
>>580 そんな物に対応してるコンパイラはまだ少ないだろ
>>581 現時点では対応していないコンパイラの方が少ない。
何だか知らんが563に腹を立てて延々粘着してる、と
要するにC99が嫌いなんだろ
言っておくが、567でも582でもないぞ。
582じゃなくて581ね・・・
314様すいませんんでした。 大きさは相手側の入力で決まり、 本当のゲームのようにしないとならないのです。。。 説明不足でごめんなさい。 来週の月曜日までにやらない今年も専門の留年が決定しそうです。
あとmineの位置はランダムで、できれば、0:0座標からではなく 1:1でお願いします。
人の留年がかかってるとなると怖くて答えられないぜ
>本当のゲームのようにしないとならないのです。。。 どういう意味?
593 :
デフォルトの名無しさん :03/10/16 18:34
ノートパソコンとPIC間においてのIR通信に関してわからないことがあるんですが、 Cプログラム上でkbhit関数を使い、ノートパソコンのハイパーターミナル 上からPICにキーボード操作での命令を実行し通信しようとしてるのですが、 どうもうまくいきません。何かよい方法ありませんか。
>>593 とりあえず
- ハイパーターミナルの切断状態になっていないことを確認する
- ハイパーターミナルの通信設定が正しいかを確認する
- PIC以外のIR通信のできるものを用意し、通信できるか確認してみる
- 自作ではないIR通信のプログラムをPIC上で動かし、通信できるか確認する
- PICのピンをオシロか何かであたってみて、通信しているか確認する
PIC上で動くプログラムの話をしたいなら制御系スレとかに
いった方がいいぞ。オレもよう知らんし。
わかりました。ありがとうございます
>>589 マウス対応とか、カーソル移動が出来るということ?
それなら、環境を書かないと分からないよ。
あの・・・ そんな難しくしないで ifやforなどで作って欲しかったのですが・・
598 :
デフォルトの名無しさん :03/10/16 22:42
キーボードから入力した文字列を、逆転させて画面に出力しなさい。 #include <stdio.h> void main (void){ char str[256]; char *p1 = str; char *p2 = str; printf ("文字列の入力:"); scanf ("%s", str); printf ("逆から表示する:"); while (*p2) ◆ puts ("です。"); } ◆の部分は、 ; if( ) while( ) putchar( ); を順に使って記述。 初心者な質問ですみません。どうしても条件を使わなくてはならないらしいのでわからずにいます。
++p2; if(p1!=p2) while(p1!=p2) putchar(*--p2);
600 :
デフォルトの名無しさん :03/10/16 22:57
>599さん 即答ありがとうございました。非常に助かりました。
>>597 MineSweeperくらいWebを探せばソースが転がってるだろ?
で、MineSweeperも作れないなら留年するよりやめたほうがいいぞ。
>>601 さん
別にMineSweeperは作れてなくても構わないのですが・・・
604 :
デフォルトの名無しさん :03/10/17 01:24
const int arraysize = 10; int array[arraysize] = {11,0,1,12,-1,4,7,6,9,2}; この配列の最小値を再帰関数で求めるには?
>>604 inline int main(int a, int b){return a < b ? a : b;}
int min(int* xint length)
{
if(length == 1)
return x[0];
if(length == 2)
return min(x[0], x[1]);
int tmp = min(xlength - 1]);
return min(tmp, xlength - 1]);
}
>>604 #include <iostream>
#include <algorithm>
int min(const int *array, int arraysize) {
return (arraysize == 1
? *array : std::min(min(array, arraysize / 2),
min(array + arraysize / 2,
arraysize - arraysize / 2)));
}
int main() {
const int arraysize = 10;
int array[arraysize] = {11,0,1,12,-1,4,7,6,9,2};
std::cout << min(array, arraysize) << std::endl;
return 0;
}
>>604 #include <iostream>
using namespace std;
const int arraysize = 10;
int array[arraysize] = {11,0,1,12,-1,4,7,6,9,2};
int min_element(int i) {
if(i == arraysize-1) {
return array[i];
} else {
int v = min_element(i + 1);
return v > array[i]? array[i] : v;
}
}
int main(int argc, char **argv) {
cout << min_element(0) << endl;
return 0;
}
C++のコードをJavaに書き直すことはできますか?
10個の整数を配列に格納し(初期化)、これらの順序を入れ替えて、 入れ替え前と、入れ替え後の全配列要素の値を出力するプログラム を作りなさい という問題なんですが何方かよろしくお願いします。
順序を入れ替えるってどういう基準でだ。
基準というのが何を指すのかよく分からないです・・ d[0]とd[9]を入れ替えるヒントくらいしか書いてありません・・ 分かりづらくて申し訳ないです
>>611 よ
それだけなら、単純に
int temp;
temp = d[0];
d[0] = d[9];
d[9] = temp;
で入れ替え完了。
考えられるのは、小さい順だよね。
10個の整数は何でもよくて(例 1,2,3,4,5,6,7,8,9,10) for文を使うと聞きました 上の例の数を使うと出力結果が 1,2,3,4,5,6,7,8,9,10 10,9,8,7,6,5,4,3,2,1 となるプログラムなんです ややこしてく申し訳ないです
それじゃ、降順にするのかひっくり返すのか判らん。 お前プログラミング以前に算数と国語の勉強しろ。
>>614 なら前後逆順にするとか書けよ。
その問題出したやつDQNか?
inline void Swap(int& a, int & b){int tmp = a; a = b; b=tmp;}
void Reverse(int array, int len)
{
for(int i=0; i<len/2; ++i) Swap(array[i], array[len-1-i]);
}
>>614 これでええんやない?
#include<iostream>
using namespace std;
void main()
{
int kazu[10];
for(int i=0; i<10; i++)
kazu[i]=i+1;
for(int i=9; i>=0; i--)
cout<<kazu[i]<<" ";
}
間違えた #include<iostream> using namespace std; void main() { int kazu[10]; for(int i=0; i<10; i++) kazu[i]=i+1; for(int i=0; i<10; i++) cout<<(i+1)<<" "; cout<<"\n"; for(int i=9; i>=0; i--) cout<<kazu[i]<<" "; }
以下の2次元配列の合計と平均を計算して表示する プログラムってなんですか?(C言語) int a[3][5] = { {7,2,3,8,8}, {1,9,4,5,3}, {4,3,8,3,6}, };
初心者スレにあったのでコピペしてきた。 以下の配列をバブルソートでソートするプログラムをかきなさい。 #include <stdio.h> void main (void) { int a[10] = {4,6,3,8,3,4,5,7,9,8}; 注意:バブルソートです。他の方法のソートで行わないで下さい。
bubble_sort(a, 10);
>>619 まず日本語を勉強しろ。
#include <stdio.h>
int main () {
int a[3][5] = {{7,2,3,8,8}, {1,9,4,5,3}, {4,3,8,3,6}};
int i, sum;
for (i = sizeof a / sizeof **a, sum = 0; i; sum += a[0][--i])
;
printf("合計: %d 平均: %f\n",
sum, (double)sum / (sizeof a / sizeof **a));
}
623 :
デフォルトの名無しさん :03/10/17 21:52
mallocを使用した動的割り当てができないのでどなたか知恵を貸していただけないでしょうか? UNIXでC言語を使用しておりまして、 文字列のバッファサイズをコマンドラインの引数で指定するのですが、 文字列はmain関数だけでなく、同じプログラム上の別関数にも使用されるため、 グローバル宣言しています。 この際、どのようにすれば引数で文字列のサイズを変更できるのでしょうか? どなたかよろしくお願いします。
624 :
デフォルトの名無しさん :03/10/17 21:53
>624 argvから読み込む場合、 グローバル宣言のときにはバッファサイズを変数で定義してしまうから そこでコンパイルエラーが出てしまうのです(涙 レス違い申し訳ありませんでした。移動して聞いてみます。
>>625 これの意味分かる方解説してもらえませんか?
>>626 さっぱり分からんが、こんな風にしてはまっているのでは。
ローカル
int main(int argc, char **argv) {
long size = strtol(argv[1]);
char buffer[size];
グローバル
long size;
char buffer[size];
int main(int argc, char **argv) {
size = strtol(argv[1]);
int c; while((c=getchar())!=EOF){ if(isprint(c)){ printf("0x%x\n",c); }else if(c!='\n'){ printf("0x%x not ASCII\n",c); } } ↑ enterキーのみの入力は出力したいんですが… もう何時間も悩んでます。
>>627 #include <stdlib.h>していれば最後の行だけでもエラーだな。
>>628 × c!='\n'
○ c=='\n'
>>627 その通りです。
それではだめなのですが、
>>624 さんのリンク先で教えていただけたので、
それでやってみます。
どうもありがとうございました。
20個の整数を入力として受付配列に格納し、その配列中に3と8が両方含まれていれば1を出力し、 どっちか一方が含まれてれば2を出力し、どっちも含まれていない時には3を出力せよ。 C++でおながいします。
>>631 さん
そうするとaを入力してenter押した時enterまで出力されてしまうんです。
>>628 int main(int argc, char **argv)
{
int c;
while((c = getchar()) != EOF) {
if(c == '\n') {
printf("0x%x not ASCII\n",c);
} else {
do {
if(isprint(c)) printf("0x%x\n",c); else printf("0x%x not ASCII\n",c);
c = getchar();
} while(c != EOF && c != '\n');
}
}
return 0;
}
#include <stdio.h> void main(void) { int shiharai ; char waribiki ; printf("支払金額を入力してください:"); scanf("%d",&shiharai); printf("割引券はありますか (Y/N):"); scanf("%c",&waribiki); if(waribiki == 'Y') printf("支払金額は%d円です\n",shiharai -100); else printf("支払金額は%d円です\n",shiharai); } 2個目のscanfが実行してくれないんですが何が悪いですか?
最初のprintfに\nがついてないから 実行中に入力待ちじゃないと勘違いしてるんじゃねーの?
\nつけてやってみてもダメでした
>>633 #include <vector>
#include <iostream>
#include <algorithm>
main()
{
using namespace std;
for(int i=0; i<20; i++)
{
int value;
cin >> value;
vec.push_back(value);
}
int count = 0;
find(vec.begin(), vec.end(), 3) != vec.end() && ++count;
find(vec.begin(), vec.end(), 8) != vec.end() && ++count;
cout << 3 - count << endl;
}
>>637 だからscanf()は使うなとあれほど……
printf("支払金額を入力してください:"); scanf("%d",&shiharai); fflush(stdin); printf("割引券はありますか (Y/N):"); scanf("%c",&waribiki);
>>640 Perlerキタ━━━━━(゚∀゚)━━━━━!!
>>640 の
using namespace std;
の次の行に
vector<int> vec;
追加しといて
まあfflush(stdin)はウンコでこっちが正しいのはFAQだな printf("支払金額を入力してください:"); scanf("%d",&shiharai); getchar(); printf("割引券はありますか (Y/N):"); scanf("%c",&waribiki);
ごみ処理も考えると while( '\n' != getchar() ); の方が適切だろ。
あ〜情けなや…
>>637 printf("支払金額を入力してください:");
scanf("%d",&shiharai);
printf("割引券はありますか (Y/N):");
scanf(" %c",&waribiki);
654 :
デフォルトの名無しさん :03/10/18 03:27
前に質問した問題ですがまた教えてください。 問題:連結リストとして扱われているstring文字列で下記の オペレーションを含んだClass Newstringを作る。 (string1とstring2はNewstringのタイプ) string1.concatenate(string2) string1の最後にstring2を結合。 string1.concatenate(ch) string1の最後に一文字のchを結合。 string1.display()スタンダードアウトプットでstring1を表示。 string1.length() string1の長さをReturnする。 string1.substring(string2) string2がstring1のサブストリングならReturn 1、 違えばReturn 2 先生に質問したところ、「string2のコピーをnode-by-nodeで取り (copy constructorと似た方法)string1のtailをコピーしたリストの 先頭にNextポインターでポイントする。」のがお勧めの方法らしいです。
>>654 #include <iostream>
class Newstring {
public:
Newstring() : head_(0) {}
Newstring(const Newstring &src) : head_(copy(src.head_)) {}
~Newstring() {destroy(head_);}
Newstring &operator =(const Newstring &src)
{ if (&src != this) {node *p = copy(src.head_); destroy(head_); head_ = p;}
return *this;}
void concatenate(const Newstring &string2) {(head_ ? tail(head_)->next : head_) = copy(string2.head_);}
void concatenate(char ch) {(head_ ? tail(head_)->next : head_) = new node(ch);}
void display() const {for (const node *p = head_; p; p = p->next) std::cout << p->ch;}
size_t length() const {size_t n = 0; for (const node *p = head_; p; p = p->next, n++); return n;}
bool substring(const Newstring &string2) const
{ for (const node *p = head_;; p = p->next)
{ const node *r = string2.head_;
for (const node *q = p; r; q = q->next, r = r->next)
{ if (!q) return false; if (r->ch != q->ch) break;}
if (!r) return true;}}
private:
struct node { node *next; char ch; node(char c) : ch(c), next(0) {}};
static void destroy(node *p) {for (node *q; p; q = p->next, delete p, p = q);}
static node *tail(node *p) {if (p) for (; p->next; p = p->next); return p;}
static node *copy(const node *p)
{ if (!p) return 0;
Newstring temp; node *q; temp.head_ = q = new node(p->ch);
for (; p = p->next; q->next = new node(p->ch), q = q->next);
q = temp.head_; temp.head_ = 0; return q;}
node *head_;};
657 :
デフォルトの名無しさん :03/10/18 12:31
↑ 上2つの方々ありがとうございます。 みなさん賢いですね。
658 :
デフォルトの名無しさん :03/10/18 14:29
prog.txtというファイルがあります。 様々な文字列の中に $hoge{'abc'} $hoge{'dfawe'} などの文字列が埋もれています。 この{' '}で囲まれた中身を抽出するプログラムを書きなさい。
659 :
kintyou :03/10/18 14:56
ほかのところでも質問したのですが、ここでも質問させていただきます。 cでデフォルトゲートウェイをaaa.aaa.aaa.aaaから bbb.bbb.bbb.bbbに変更するプログラムを書きたいのですが、 まったくわかりません。 systemからrouteを呼び出せばよいと、アドバイスされたのですが よくわかりませんでした。 詳しくご存知の方よろしくお願いします。
>>659 routeコマンドを直接使ったら変更することができるのですか?
>>658 #include <stdio.h>
#include <string.h>
int main()
{
char t[9][256] = {0};
int c, s = 0;
FILE *fp;
memset(&t[7], 7, sizeof *t * 2);
t[7]['\''] = t[8]['\''] = 8;
t[8]['}'] = 0;
for (c = 0; c < 7; c++)
t[c]["$hoge{'"[c]] = c + 1;
fp = fopen("prog.txt", "r");
if (!fp)
return 1;
while ((c = getc(fp)) != EOF) {
int s2 = t[s][c];
if (s == 8)
putchar(s2 ? '\'' : '\n');
if (s >= 7 && s2 && s2 != 8)
putchar(c);
s = s2;
}
fclose(fp);
return 0;
}
662 :
デフォルトの名無しさん :03/10/18 22:18
「自然数Nを素因数分解するプログラムを作成せよ。Nの与え方は自由。 与え方が分からない人はN=85800でやってみよ。結果の表示方法も自由」 ↑一応両方お願いします。
663 :
デフォルトの名無しさん :03/10/18 22:29
for (x = 2; x * x <= N; x++) { for (y = 0; N % x == 0; n /= x, y++) ; if (y > 1) printf("%d^%d * ", x, y); if (y == 1) printf("%d * ", x); } printf("%d\n", N);
boost::lexical_castって強烈に重くないですか? ループの内側では使いたくない重さだ…
>>664 stringstreamいちいち構築したりしてるから
そりゃatoiとかに比べると圧倒的に重いだろうねぇ
666 :
デフォルトの名無しさん :03/10/19 00:48
『2つの最大40桁の自然数を入力して、その和・差・積を求めるプログラム(ポインタは使わない)』 という課題なんですが、さっぱり分かりません。 配列を用いて計算するということは分かるんですが…。 C言語です。よろしくお願いします。
なんで配列がいるの?
669 :
デフォルトの名無しさん :03/10/19 01:10
doubleでも15桁程度が限界
intたくさん使って固定小数点クラス作れば簡単。
自然数同士の和・差・積に小数は要らないナリ
商なら必要になるかもしれないけどな。見事に含まれていないな。
>>666 足し算
#include <stdio.h>
#define MAXDIGS 40
int adc(int x, int y, int *c) {
int v = x - '0' + y - '0' + *c;
*c = v >= 10 ? (v -= 10, 1) : 0;
return v + '0';
}
void add(const char *x, const char *y) {
char r[MAXDIGS + 2];
int xl = strlen (x), yl = strlen (y), rl = (xl > yl ? xl : yl) + 1, c = 0;
r[rl] = 0;
while (xl > 0 && yl > 0) r[--rl] = adc (x[--xl], y[--yl], &c);
while (xl > 0) r[--rl] = adc (x[--xl], '0', &c);
while (yl > 0) r[--rl] = adc ('0', y[--yl], &c);
if (c) r[--rl] = '1';
printf ("%s\n", &r[rl]);
}
int main(void) {
char x[MAXDIGS + 1], y[MAXDIGS + 1];
printf ("x? ");
fgets (x, sizeof x, stdin);
if (*x) x[strlen (x) - 1] = 0;
printf ("y? ");
fgets (y, sizeof y, stdin);
if (*y) y[strlen (y) - 1] = 0;
add (x, y);
return 0;
}
>>676 足し算、引き算は簡単なわけよ!
掛け算と割り算を教えてよ
680 :
デフォルトの名無しさん :03/10/19 14:51
Cで3次元配列のメモリを確保するにはどうしたらいいですか?
int test[10][10][10];
ポインタのポインタのポインタか 一次元配列で確保して関数とかでインデックスと返すようにする。
malloc使ってfor文で回してやろうと思うのですが、 具体的にどう書いていいかわかりません_| ̄|○
すいません、96の64乗を計算するのに 一番シンプルな手法って どういうのがあるのでしょうか?? powだと溢れちゃいますた。 速さにこだわりはありません。
lisp
96^64=7334304125596190624668832643061791071911921761558623296040973972480495126634460976537700765146565217101386328744001668808441856
>>685 main() {
int i;
double a = 96.0;
for (i = 0; i < 6; i++)
a *= a;
printf("96^64=96^2^6=%g\n", a);
}
>>685 多倍長整数演算クラス作る課題の延長じゃないのか?
先の課題で作ったクラスの名前を MultiByteInteger とでもしとくと、
MultiByteInteger a = 96;
a = a * a;
a = a * a;
a = a * a * a;
cout << a << endl;
MultiByteInteger に operator* と operator<< を定義しとくこと。
教授キタ━━━━━(゚∀゚)━━━━━!!
>>685 まさかとは思うがその後で mod を取ったりしないよな?
>>686 C/C++スレでlispとか答える奴はカス
それならJavaのBigInteger使えと
lispなら1行だけどJavaだとコンパイルも必要だしシンプルじゃないだろ。
>>685 >>689 ぱっと見て,10進で133桁以下115桁以上が確実なわけで666とは関係がなさそう。
近頃の大学ではコレが流行ってるのか?
>>693 LispとJavaの普及率を考えると
最悪Lispは処理系選びからやらねばならん
unixならgclかemacs入ってるでしょ。
>>694 あら、666 と 689 は別件だったのか。
なら、元から多倍長演算に対応してる言語使って計算する方が手っ取り早いよなぁ。
まあ、手ごろな課題でいいんじゃないかな<多倍長の加減乗算。
プログラミングの出来る奴向けに追加課題で
FFT 使った高速畳み込みしろとか、除算まで実装しろとか出せるし。
+,-,*,/,=,C(クリア)を使って電卓を作ってください。 但し、入力は1文字ずつする。 例:1[Enter] 2[Enter] 3[Enter]と入力したら表示は123となる。
つい最近も電卓って課題見た気がする
自然数Xを入力として受け付けて、以下に示すような連続する2自然数の積の和を求める。 ただし X >1を仮定して良い。 1*2 + 2*3 + 3*4 + .....+ (X-1)*X よろしくお願いします。
配列を使わずポインタを使用して 5変数を降順に出力するプログラムを作りたいのですが。入力はscanfで。 配列を使うならば出来るのですが…。 よろしくお願いいたします。
皆さんどうもありがとうございました。 おかげで何とかなりそうです。
自然数を入力として受付け、以下に示す様な連続する 2 自然数の積の和を求めよ。 ただし、x>1と仮定して良い。 1*2+2*3+3*4+ …… +(x-1)*x #include <stdio.h> int main(void) { 「ここの部分をおながいします。」 return(0); }
遅レスすいません、>685です みなさんありがとうございます。 >686 検算に使わせていただきます(^^; >688 カウンタが回ってるのにfor文中でiが使われてないのが 不思議です(^^; 試しに実行してから考えてみます >689 多倍長整数演算クラス作る課題の人とは別なんですけど、 やっぱり多倍長演算出来ないと厳しいみたいですね(^^; >691 ずばり、そのあとでmod取りたいです・・・ >694 流行ってるとは言い切れないですけど、 直前でも似た(?)質問してる方いますね(^^; >697 商と余りまで出すのが最終目的です 週末で多倍長演算と言うをする必要があると思ったので また明日調べてがんばってみます。 みなさんありがとうございます。 またヒントがあればよろしくお願いします。
自レスです。 >カウンタが回ってるのにfor文中でiが使われてないのが >不思議です(^^; とんでもないこと言ってますね、私。。。
平方乗法
>>704 #include <stdio.h>
int main()
{
unsigned long int n;
puts("xは何?");
scanf("%lu",&n);
printf("1*2+2*3+3*4+・・・・+(x-1)*x=%lu\n",((n-1)*n*(n+1))/3);
return 0;
}
>>705 > ずばり、そのあとでmod取りたいです・・・
えーと, mod N が目的なら,計算途中では N^2 未満にしかならないのだが…
x * y mod N = ( x mod N ) * ( y mod N ) mod N を使うべし
mod 取りたいんなら最初からそう書けって。 難易度が全然違うんだから。 709 の内容はプログラムで書くと、 for(int i=0; i<NUM; ++i) x = (x * x ) % N; と for(int i=0; i<NUM; ++i) x = (x * x ); x %= N; が(x の精度を無視して考えるなら)一緒ってことね。
>> 704 c言語あんまり知らないので、こんなもので勘弁・・・ #include <stdio.h> int main(void) { int n, flag = 0; while(1) { printf("整数を入力してください (n > 1) : "); if (fscanf(stdin, "%d", &n)) { if (n > 1) { if (flag == 1) puts("ほんまかいな、まあ一応やってみますけど"); printf("%d\n", n * (n - 1) * (n - 2) / 3); return 0; } puts("真面目にやってください"); flag = 1; continue; } fprintf(stderr, "実家に帰らせてもらいます\n"); break; } return 0; }
>>710 すみません、それは何と言う定理でしょうか?
>>713 X = A + BN, Y = C + DN とおけば、
X * Y = A * C + (BC + AD)*N + BD * N^2 てなわけで自明だと思うが。
一般に、まずは算数してからプログラム書いたほうが効率いいぞ!
文字列を入力として受付け、その文字列中に abc という文字列が含まれていればyesを、 含まれて居なければ no を出力せよ。ただし、文字列ライブラリを使ってはならない。 abcは連続のもののみ。
>>716 まぁそう言ってやるな。頭悪い事は本人が一番分かってるだろうし。
>>716 多分、課題出した人的には標準ライブラリ自体使わずやって欲しい気がする。
まあ、確かに search なら配列に対する操作だから
「文字列ライブラリを・・・」ってのにひっかからないけど。
こういう言葉足らずな課題って多いよなぁ。
>>715 というわけで、search も使うの気が引けるなら、
“Knuth-Morris-Pratt” とか “Boyer-Moore” のアルゴリズムでぐぐれ。
>>718 > “Knuth-Morris-Pratt” とか “Boyer-Moore” のアルゴリズムでぐぐれ。
文字列が長くないとコスト高杉
見難い、かつ醜くてお恥ずかしいのですが… #include <stdio.h> #include <string.h> int main(void) { int item[100]; int a, b, t; char x; for(a=0; a<5; a++) scanf("%d", &item[a]); for(a=1; a<5; ++a) for(b=4; b>=a; --b){ if(item[b-1] < item[b]){ t = item[b-1]; item[b-1] = item[b]; item[b] = t; } } for(t=0; t<5; t++) printf("%d ", item[t]); return 0; } これを配列を使わず、ポインタで…。 ここはこうした方がいいとか全面的にこうした方がいいとか。 入力も繰り返したいんで作り直した方がいいのかもしれないんですが。
配列を使わず、ポインタで?イミワカンネェよ
>>720 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int *item, *pitem, *pitem2;
int a, b, t;
char x;
item = (int*)malloc(sizeof(int)*100);
for(a=0, pitem = item; a<5; a++) scanf("%d", pitem++);
for(a=1; a<5; ++a)
for(b=4, pitem=item+4,pitem2=pitem-1; b>=a; --b, pitem--, pitem2 = pitem-1){
if(*pitem2 < *pitem){
t = *pitem2;
*pitem2 = *pitem;
*pitem = t;
}
}
pitem = item;
for(t=0; t<5; t++) printf("%d ", *pitem++);
free(item);
return 0;
}
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <algorithm> #include <functional> int main(void) { int *item, *pitem, *pitem2; int i; char x; item = (int*)malloc(sizeof(int)*100); for(i=0, pitem = item; i<5; ++i) scanf("%d", pitem++); std::sort(item, item+5, std::greater<int>()); for(i=0, pitem = item; i<5; ++i) printf("%d ", *pitem++); free(item); return 0; }
724 :
デフォルトの名無しさん :03/10/21 01:16
C言語で電卓を作りたいのですが、 入力 5+ 出力 Display:5 Op:+ 入力 4- 出力 Display:9 Op:- 入力 2= 出力 Display:7 Op:= と表示されるような電卓を作りたいのですが、 どのようなプログラムを作ればいいか教えて下さい。 使うキーは数字記号の1〜9と、演算記号の+,-,*,/,=,AC,CE、 それに小数点とOFFキーと符号反転(+/-)キーです。 計算は左優先で乗除が優先されることはありません。 教えて下さい。
725 :
デフォルトの名無しさん :03/10/21 01:50
上の続きですが、 入力は全てキーボードでコマンドプロンプト上でやります。
少数はマンドイので整数のみ。「AC とか CE は一文字の何か」ね。少数対応にするときのポイントは、 ・位取りようの変数を使う ('.' が入力されたら d=0.1、あとは数字キーで acc = acc + (c - '0')*d; d = d/10.0 とかする) ・不動小数点数を使うと誤差の扱いが面倒なので、適当に BCD ライブラリ等を使う #include <stdio.h> int main(int argc, char* argv[]) { int op = '+', acc = 0, operand = 0, c; while ((c = getchar()) != EOF) { switch(c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': operand = operand * 10 + (c - '0'); break; case '+/-': operand = -operand; break; case 'CE': operand = 0; break; case 'AC': operand = acc = 0; operation = e_add; break; case '+': case '-': case '*': case '/': case '=': switch (cp) { case '+': acc = acc + operand; break; case '-': acc = acc - operand; break; case '*': acc = acc * operand; break; case '/': acc = acc / (operand ? operand : 1); break; } operand = 0; op = c; printf("Display:%d Op:%c", acc, op); break; } } return 0; }
727 :
デフォルトの名無しさん :03/10/21 02:47
写真測量で空間後方交会という空中写真から撮影時のカメラの3次元座標と 傾きを求める方法があって、このプログラムをc言語で作らなくては いけなくなったんですが、どなたか分かる方いませんか?
↓まずは画像データの解析から
729 :
デフォルトの名無しさん :03/10/21 07:48
漸化式 Yn+1 = a * (1-yn) * yn これをCで表現するとどのようになるのでしょうか? 書き方説明の仕方が下手ですいません
730 :
デフォルトの名無しさん :03/10/21 07:55
いくらC/C++の文法やライブラリに精通していても 空間後方交会や漸化式の事が解らないとどうにもならない。
>>729 n=0or1の定義がないと書きようが無い
漸化式というのは差分方程式のことでした
>>729 static int y0=???;
static int a=???;
int y(n){ // n:0->n
enum { ERROR = ???? };
int i,y;
if(n<0) return ERROR;
for(i=0,y=y0;i<n;++i) y=a*(1-y)*y;
return y;
}
問1 文字列を入力として受け付けて、その文字列を逆順にしたものを出力せよ。 問2 言葉当てゲームを作る。入力として文字列を受け付けて、あらかじめ定めておいた文字列と等しければBingoと出力して終わる。 異なっていてかつ文字の長さが等しければsame length、 入力された文字列の方が長ければlonger、 入力された文字列の方が短ければshorterと出力する。 Bingo以外の場合は繰り返し入力を受け付ける。 問3 文字列を入力として受け付けて、その文字列の中に含まれる数字の合計を出力せよ。 分かる人いますか?
います
教えて下さい!
>>736 問3
#include<stdio.h>
main()
{
int x,i;
char c[10];
i=0;x=0;
scanf("%s",c);
while(c[i]!='\0'){
if(c[i]>='0' && c[i]<='9')
x++;
i++;
}
printf("%d個\n",x);
}
こんなんでいい?
>>736 #include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
int main()
{
string s;
//// (1)
getline(cin,s);
copy(s.rbegin(),s.rend(),ostreambuf_iterator<char>(cout));cout<<endl;
//// (2) string check("string"); while(1){ cout<<"input・・・・・"; getline(cin,s); if(!check.compare(s)){ cout<<"Bingo"<<endl; break; } else if(check.size() == s.size()) cout<<"Some Length"<<endl; else if(check.size() < s.size()) cout<<"Longer"<<endl; else if(check.size() > s.size()) cout<<"Shorter"<<endl; }
//// (3) getline(cin,s); string::iterator first = s.begin(); int n=0; for(; first != s.end(); ++first ){ if(isdigit(*first))n += (*first - '0'); } cout<<n<<endl; return 0; }
数字の合計って数字の個数の合計じゃないの?
>>734 問1
> 文字列を逆順にしたものを出力せよ。
ということは実際に逆にしなければならないのか。
#include <stdio.h>
#include <string.h>
void reverse(char *);
int main()
{
char s[4096];
fgets(s,sizeof s,stdin);
reverse(s);
puts(s);
return 0;
}
void reverse(char *s)
{
int i=0,j=strlen(s)-1;
char c;
if(s[j]=='\n') j--;
for(;i<j;i++,j--)
c=s[i],s[i]=s[j],s[j]=c;
}
問3は std::cout << std::count_if(s.begin(), s.end(), isdigit) << std::endl; で一発。
>>734 問2
#include <stdio.h>
#include <string.h>
#define s2 "string"
void chomp(char *);
int main()
{
char s1[4096];
size_t s1len,s2len=sizeof s2-1;
while(1){
fgets(s1,sizeof s1,stdin);
chomp(s1);
s1len=strlen(s1);
if(!strcmp(s1,s2)){ printf("Bingo\n"); break;}
else if(s1len==s2len) printf("same length\n");
else if(s1len>s2len) printf("longer\n");
else printf("shorter\n");
}
return 0;
}
void chomp(char *s)
{
if(!*s) return;
s+=strlen(s)-1;
if(*s=='\n') *s='\0';
}
>>734 問3
#include <stdio.h>
#include <ctype.h>
unsigned int count(char *);
int main()
{
char s[4096];
fgets(s,sizeof s,stdin);
printf("%u\n",count(s));
return 0;
}
unsigned int count(char *s)
{
unsigned int n=0U;
for(;*s;s++)
if(isdigit(*s))
n++;
return n;
}
>>746 >unsigned int n=0U;
かっこいいーーー!!
748 :
デフォルトの名無しさん :03/10/21 18:24
1、配列10個を整数で宣言する。 2、その10個の配列に1から20までの数値を適当にランダムに代入して初期化しておく。 3、配列を小さい順に並べ替える。 4、5番目の数値(中央値)を表示する。 以上を、1つ1つ作ってください。 よろしくお願いします。
>>748 日本語が変だけど、
1. 要素数10の int 型の配列を宣言する。
2. その配列の各要素を1から20までの一様乱数で初期化する。
ってこと?
あと、配列の要素数が10(偶数)だから、
厳密には5番目の値は中央値にならないよね。
#include<iostream>
#include<algorithm>
#include<cstdlib>
using namespace std;
inline int random(int min, int max){return (double)rand() / (RND_MAX + 1) * (MAX - MIN + 1) + MIN;}
int main(){
const int N = 10;
const int MIN = 1;
const int MAX = 20;
int array[N]; // 1.
for(int i=0; i<N; ++i) array[i] = random(MIN, MAX); // 2.
sort(array, array + N); // 3.
cout << array[N/2] << endl; // 4.
return 0;
}
組合せ数nCmを求めるプログラムを作成しなさい、組合せ数は以下の3通りの方法で計算できる それぞれに対応した方法で組合せを計算する3つの関数を用いて計算するようにしなさい TnCm={n(n-1)(n-2)・・・(n-m+1)}/(1*2*3*・・・*m) UnCm=nCm-1 * (n-m+1)/m VnCm={1 m=0,m {n-1Cm-1 + n-1Cm 1<=m<=n-1 Tだけはできました。UとVをお願いします、TもおかしいのならTも編集お願いします #include<stdio.h> int Combination(int n,int r); int main(void) { int x,y; scanf("%d %d",&x,&y); printf("%d %d 組み合わせ %d \n",x,y,Combination(x,y)); } int Combination(int n,int r) { int x,y; if(n-r<r){ r=n-r;} for(x=1,y=1;r>0;){ x*=n--; y*=r--; } return (x/y); if(n==r) return 1; }
Vの条件式が分かりにくいんで VnCm={1 m=0,m {n-1Cm-1 + n-1Cm 1<=m<=n-1
752 :
デフォルトの名無しさん :03/10/21 19:33
>>749 >日本語が変だけど、
>1. 要素数10の int 型の配列を宣言する。
>2. その配列の各要素を1から20までの一様乱数で初期化する。
>ってこと?
ありがとうございます。上の通りでお願いします。
753 :
デフォルトの名無しさん :03/10/21 19:49
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めよ。 例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力する。
ヒントください 10進数で入力された値を16進数に変換し 上位2バイトと下位2バイトを入れ替えたものを10進数で出力するプログラム 例: 1234567と入力→16進数では、0012D687→これを D6870012とする→3599171602と出力
>>570 I もそれはあんまりお勧めしない。
↓こういう風に、逐次除算してった方がオーバーフローしにくくなる。
int Combination1(int n, int m)
{
int x = 1;
for(int i=1, j=n; i<=m; ++i, --j)
{
x *= j;
x /= i;
}
return x;
}
で、II と III。 int Combination2(int n, int m) { if(m <= 0) return 1; return Combination2(n, m-1) * (n - m + 1) / m; } int Combination3(int n, int m) { if(m <= 0 || m >= n) return 1; return Combination3(n-1, m-1) + Combination3(n-1, m); }
>>755 ヒント:こんな感じにするとうまくいくかも。
void f( char *t )
{
union { unsigned short s[ 2 ]; unsigned int i; } a;
unsigned short s;
sscanf( t, "%d", &a.i );
s = a.s[ 0 ], a.s[ 0 ] = a.s[ 1 ], a.s[ 1 ] = s;
printf( "%u", a.i );
}
文字列を入力として受け付けて、その文字列中に含まれる数字の合 値を求めよ。 例: a1b23g4 と入力された場合、1+2+3+4 で10 を出力する。 初心者スレの。 わっかりません
わっかりません
761 :
デフォルトの名無しさん :03/10/21 21:22
>759 >わっかりません その投げやりな態度、気にいった! とりあえず今ぱっと思いついたコードをうpしてやる。 それが理解できるかどうかは藻前しだいだがな。 int f( char *s ) { int n[ UCHAR_MAX + 1 ], c, i; memset( n, 0, sizeof( n ) ); while( ( c = *s ++ ) != '\0' ) n[ c ] ++; c = 0; for( i = 0 ; i < 10 ; i ++ ) c += i * n[ "0123456789"[ i ] ]; return c; }
>>755 上位2バイト、下位2バイトを別の4バイトx2領域にコピーして
右シフト&左シフトして必要ビット分をマスクしてORすればどう?
763 :
デフォルトの名無しさん :03/10/21 22:10
>>724 >>726 書き込みありがとうございます。
コンパイルしたのですが、
13:operation が未定義
13:e_add が未定義
15:cp が未定義
15:switch 文の条件が評価できない
とエラーが出てしまいます。
前で定義されてると思うのですが、
どうすればよいのか教えて下さい。
cp は op、e_add は '+' の間違いね。 あとは自分で直して。
765 :
デフォルトの名無しさん :03/10/21 22:32
>>764 char* argv[]はどういう処理に使ってるんですか?
使ってません。
767 :
デフォルトの名無しさん :03/10/21 22:51
例えば"A"という条件があり、それを繰り返し文の中で2回判定させたいです。 判定結果がfalseであれば、繰り返し構文からbreakさせたいです。 if文を使わないでfor文かwhile文のみで、このようなことは可能なのでしょうか? 可能でしたら、方法を伝授してくださいませ。 例> num_aが真ならば{}内を繰り返す。 #include<stdio.h> main(){ int num_a, num_1, num_2; num_a = 100; //繰り返したい { printf("num_aを減らす数を入力せよ@"); scanf("%d", &num_1); num_a -= num_1; <!-ここで1回目の判定--> printf("num_aを減らす数を入力せよA"); scanf("%d", &num_2); num_a -= num_2; <!-ここで2回目の判定--> } exit(0); } あくまで例ですので、「何に使うんだ?」と思われてしまいそうなプログラムですが・・・お願いします。 入れ子構造をとってみたりしたのですが、当然ながら中の繰り返し文を繰り返すだけになってしまいました。
768 :
デフォルトの名無しさん :03/10/21 22:53
>>768 "ifは使わないで作れ"と先生が言っているのです。
>>765 int main(void) または int main (int, char**) は仕様です
>>769 do while も使ってはダメなのか?
772 :
名無しさん@そうだドライブへ行こう :03/10/21 23:05
ifが嫌なら、switch文でやれ。
if (condition) { a; } else { b; } は、 switch (condition) { default: a; break; case 0: b; break; } に置き換え可能。 #但し、break;でどこまでbreakするかはお察しください
#include<stdio.h> main(){ int num_a, num_1, num_2; num_a = 100; for(;;) { printf("num_aを減らす数を入力せよ@"); scanf("%d", &num_1); num_a -= num_1; num_a < 0 && break; printf("num_aを減らす数を入力せよA"); scanf("%d", &num_2); num_a -= num_2; num_a < 0 && break; } exit(0); }
done = 0 while(!done){ printf(); scanf(); done=(判定1の式) ? 0:1; 以下似たようなノリ : : }
>>777 それじゃ二カ所でbreakできませんよ
done = 0; done2 = 0; while(!done){ printf(); scanf(); done=(判定1の式) ? 0:1; while(!done && !done2) 以下似たようなノリ : : } }
最初のループもこれだといいな while(!done && !done2)
判定部分の値を ! (not) してそのまま変数に入れてもいいかも
#include<stdio.h> #include<stdlib.h> #include<setjmp.h> int flag = 0; jmp_buf jumper; int jmp() { flag = 1; longjmp(jumper, 1); return 0; } main(){ int num_a, num_1, num_2, value; num_a = 100; setjmp(jumper); for(;!flag;) { printf("num_aを減らす数を入力せよ@"); scanf("%d", &num_1); num_a -= num_1; num_a < 0 && jmp(); printf("num_aを減らす数を入力せよA"); scanf("%d", &num_2); num_a -= num_2; num_a < 0 && jmp(); } exit(0); }
で、またループに入るのか…
おお、ループには入らないなぁ。
かなりイカレたプログラミングですな
漏れはこうかな。 while(printf() && scanf()==1 && 判定1 && printf() && scanf()==1 && 判定2) ;
int flag; は volatile int flag; にしないとヤバイのですよ。
こうすればvolatileにしなくてよし #include<stdio.h> #include<stdlib.h> #include<setjmp.h> jmp_buf jumper; int jmp() { longjmp(jumper, 1); return 0; } main(){ int num_a, num_1, num_2, flag; num_a = 100; flag = setjmp(jumper); for(;!flag;) { printf("num_aを減らす数を入力せよ@"); scanf("%d", &num_1); num_a -= num_1; num_a < 0 && jmp(); printf("num_aを減らす数を入力せよA"); scanf("%d", &num_2); num_a -= num_2; num_a < 0 && jmp(); } exit(0); }
ふぇぇ、皆様、レスありがとうございます・・・。 ですが、学び始めて間もない漏れにとっては、まだまだ皆様の組んだプログラムが理解できない状態であります・・・情け無いです。 皆様のレスは、テキストで保存しておきます。後に見たときに理解してみせます。 今回は、if文を使ったものを提出することにします。 駄目と言われたとはいえ、提出しないよりはマシだと思いますので。 ありがとうございました。
課題云々を考えなければ、ifを使うのが一番読みやすいのならそれが正解。
このプログラムを関数を用いて実行したいです #include<stdio.h> int main(void) { int term=10,i,total2=50000; double rate=0.5,total=50000; for(i=1;i<=term;i++){ total=total*(1+rate/100); total2=total2*(1+rate/100); printf("double型 %2d年目 %f\n",i,total); printf("int型 %2d年目 %d\n",i,total2); printf("差額 %2d年目 %f\n",i,total-total2); } }
>>793 すでに main 関数を用いてるじゃん。
main関数とは別に関数定義して 計算できるように書き換えろということです
#include<stdio.h> void DQN(void) { int term=10,i,total2=50000; double rate=0.5,total=50000; for(i=1;i<=term;i++){ total=total*(1+rate/100); total2=total2*(1+rate/100); printf("double型 %2d年目 %f\n",i,total); printf("int型 %2d年目 %d\n",i,total2); printf("差額 %2d年目 %f\n",i,total-total2); } } int main(void) { DQN(); }
797 :
すいません :03/10/22 15:42
データ表の右側に各人の合計点、平均点を記入した ファイルをDataB.datという名前で作るプログラムを 作れ。という課題なんですが・・・わかりません。 おしえて下さい
確かにわからんな
実際のデータ表とやらが全く想像できん
〆切がせまってます助けてください。よろしくお願いします。 正の整数 n を読み込み,その平方根の整数部分を求めるプログラムを書け. ヒント) 女の子(めのこ)平方という方法を用いる. 正の整数 a から,1, 3, 5 と順 に奇数だけを引けるだけ引いたとき, 引くことができた奇数の個数が a の平方根の整数部分になる.
>>800 ヒントはヒント、それを使えって条件つけられたわけじゃないんだから無視。
ニュートン法で池。
>>800 int sqrt_int(int n)
{
int i=1,cnt=0;
while((n -= i)>=0){
i += 2;
++cnt;
}
return cnt;
}
>>800 #include <math.h>
#include <iostream>
main()
{
using namespace std;
int n;
cin >> n;
cout << floor(sqrt(n)) << endl;
}
1 = 1 4 = 1+3 9 = 1+3+5 16 = 1+3+5+7 25 = 1+3+5+7+9 : こういうことか?
>>800 #include <stdio.h>
int square_root(int n, int r)
{
n = n - (2 * r + 1);
if(n < 0) return r; else return square_root(n, r + 1);
}
int main(int argc, char **argv)
{
int n;
scanf("%d", &n);
printf("%d^(1/2) = %d\n", n, square_root(n, 0));
return 0;
}
=800 みなさんありがとうございます。 で、なぜかコンパイルできません。 ???
808 :
デフォルトの名無しさん :03/10/22 21:25
入力された数字を二進数にして表示させるプログラムが分かりません。 よろしくお願いします。
>>808 各bitが立った値を配列でもなんでも用意して
ANDとって真だったら0x31を出力すれば?
>>808 あんまない知恵を絞ってたらできたぞ
逆からなのはご愛嬌
#include<iostream>
using namespace std;
void main()
{
int x;
cout<<"xは?";
cin>>x;
cout<<x<<"を二進数で逆からあらわすと\n";
while(x!=0)
{
if((x % 2)==0)
{
x = x / 2;
cout<<0;
}
else
{
x = (x - 1)/2;
cout<<1;
}
}
}
>>807 > で、なぜかコンパイルできません。
全角スペースでインデントされているので、半角スペースに置き換える必要がある。
813 :
すいません :03/10/22 22:29
>799 データ表 学籍番号 英語 数学 国語 理科 社会 1 87 78 89 79 95 2 59 68 70 60 56 : : : : : : : : : : : : 100 55 20 86 64 37 こんな感じです。
>>808 #include <iostream>
#include <list>
using namespace std;
int main(int argc, char **argv)
{
int n;
list<int> l;
cin >> n;
do { l.push_front(n % 2); n /= 2; } while(n > 0);
for(list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it; }
return 0;
}
>>797 #include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char **argv) {
int gakuseki, eigo, suugaku, kokugo, rika, syakai, sum;
ifstream ifs("DataA.dat"); // 入力データファイルはDataA.dat
ofstream ofs("DataB.dat");
string buffer;
getline(ifs, buffer); ofs << buffer << endl; // タイトル行の処理
while(!ifs.eof()) {
ifs >> gakuseki >> eigo >> suugaku >> kokugo >> rika >> syakai;
if(ifs.fail()) break;
sum = eigo + suugaku + kokugo + rika + syakai;
ofs << gakuseki << " " << eigo << " " << suugaku << " " << kokugo << " "
<< rika << " " << syakai << " " << sum << " " << (sum / 5.0) << endl;
}
return 0;
}
817 :
デフォルトの名無しさん :03/10/22 23:32
二進数ありがとうございました!
遅くなりましたが
>>722 、723様有難うございました
ある数列を順に印字していくプログラムなのですが、 その第N項が40桁とか50桁(10進数)になるまで印字し続けるという条件がついています。 そのかなり多い桁数はどうやって扱ったらいいかヒントだけでもよいのでお願いします。
C++なら多倍長整数のライブラリを漁って使う
やっぱり最近多倍長ネタ流行ってる?
>>819 それ、精度については指定されてるん?
精度がどうでもいいなら、普通に double 使えばいいわけで。
822 :
デフォルトの名無しさん :03/10/23 08:12
>>790 > for(;!flag;)
whileって知っていますか?
>822
まともな奴ならそんな所に while を使用していようが for を使用していようが
拘らないものだ。
なぜならば、それは構文規則に則っているし、コンパイル結果・実行結果も同じに
なることが容易に想像がつくから。
こんなところに拘る奴ってのは大概・・・
>>790 が何をやっているのか理解していますか?(w
>>823 しているよ。
num_a < 0 && (longjmp(jumper,1),0);ではなくnum_a < 0 && jmp();としている理由はわからないけど。
#include <stdio.h> #include <stdlib.h> int main(int c,char*p[]){while(*(++p)){int n=atoi(*p),r=0;while((n-=(r*2+1))>=0)++r;printf("%d ",r);}printf("\n");return 0;}
#include <bitset> #include <iostream> int main(){unsigned long n;std::cin>>n;std::cout<<std::bitset<32>(n)<<'\n';return 0;}
#include <stdio.h> #include <netdb.h> int main(int argc,char *argv){ struct hostent *host; struct in_addr addr; char host_name[255]; printf("Host > "); fgets(host_name,sizeof(host_name),stdin); host=gethostbyname(host_name); if(host=NULL){ printf("%s is none\n",hostname); return -1; } printf("IP=%s\n",inet_ntoa(addr)); return 0; } ホストからIPアドレスを表示しようとしたんだけど、コンパイルがmainで躓くのはなんで?
828 :
デフォルトの名無しさん :03/10/23 13:08
>>827 エラーの原因じゃないと思うが、argvの型はchar **
エラーメッセージを書かない奴は逝ってよし。しかもここは質問スレじゃないし。
831 :
デフォルトの名無しさん :03/10/23 14:12
>>782 > for(;!flag;)
whileって知っていますか?
775はmainでexitを使うのか。しかもstdlib.hをインクルードしないで。
mainの問題はコマンドを変えればクリアできたけど、 結果のIPアドレスが0.0.0.4しかでない
>>835 コンパイルで躓くんじゃなかったのか? 実行できるということはコンパイルできているんじゃねーか。
837 :
デフォルトの名無しさん :03/10/23 22:44
問:2から10000までの整数の中の素数を全て表示するプログラムを書きなさい。 という問題で #include <stdio.h> #include <stdlib.h> int main() { int a, b; for(a = 2; a <= 10000; a++){ for(b = 2; b < a; b++){ if(a % b == 0)break; else{ printf("%d \n", a); } } } return 0; } ↑のようにかいたのですが、素数が数が増えるにしたがって、多く出てきてしまいます。 恐らくelseのとこが間違ってると思うんですがどうすればきれいに一つずつ順に素数が表示されるでしょうか? お願いします。
else取っ払ってループの外に出して、外で if (a == b) printf("%d \n", a); しといたら
839 :
デフォルトの名無しさん :03/10/23 23:07
はい、次!
840 :
デフォルトの名無しさん :03/10/23 23:18
>>838 あの〜コンパイルは通るんですが、表示がならないんですけど・・・
841 :
デフォルトの名無しさん :03/10/23 23:24
外ループの外に移したら何もでないだろうなぁ
ループの外ってのは、内側のループの外ってことだぞ
843 :
デフォルトの名無しさん :03/10/23 23:33
>>841-842 無知な私に救いの手を・・・
結局何行目にif (a == b) printf("%d \n", a);
を入れればいいんでしょうか・・・?
>>827 addrに何も代入していないように見えるのだが、コンパイラは何も警告しなかったのかな?
>>843 内側のループより下で外側のループの下限より上。
846 :
デフォルトの名無しさん :03/10/23 23:50
>>845 ダメだった・・・_| ̄|○
ホントに悪いんですがそこの部分書き直してもらえませんか・・・
847 :
inaian :03/10/23 23:54
自然数 n,m を入力して、n に一番近い m の倍数を求める関数 nb(n,m) お願い教えて
848 :
デフォルトの名無しさん :03/10/24 00:03
>>724 >>726 726のプログラムなんですが、
小数入力と、AC、CE、の処理がうまくいきません。
具体的にどうすれば良いのでしょうか?
教えて下さい。
ちなみにACは全てを初期化、CEは現在の入力をキャンセルして
入力が始まる前の状態に戻ることです。
>>847 return n-(n/m)*m<(n/m)*(m+1)-n?n-(n/m)*m:(n/m)*(m+1)-n;
宿題は自分でも理解しようね #include <stdio.h> #include <stdlib.h> int main() { int a, b; for(a = 2; a <= 10000; a++){ for(b = 2; b < a; b++){ if(a % 0 == b)break; } if (a == b) printf("%d \n", a); } return 0; }
854 :
デフォルトの名無しさん :03/10/24 00:29
for(b = 2; b <= a; b++){ if(a % b == 0)break; if (a == b) printf("%d \n", a); }
>>853 あ〜なるほど!!
ホントありがとうございました。
856 :
デフォルトの名無しさん :03/10/24 00:31
for(b = 2; b <= a; b++){ if (a == b) printf("%d \n", a); if(a % b == 0)break; }
859 :
デフォルトの名無しさん :03/10/24 05:07
>>859 while(1)のループのあたりじゃない?
cap26.exe > cat26.log
もしくはmainのはじめにfreopen("cap26.log","w",stdout);
863 :
デフォルトの名無しさん :03/10/24 08:20
>>860 861
返答ありがとうございます。
freopen("cap26.log","w",stdout);とすると
↓のような結果は、logとして出ますが、nだけをテキストにするには、どうしたらよいのでしょうか?
また、テキストファイルに自由に名前をつけて保存し、複数のファイルを作るとしたらどのようにしたらよいのでしょうか?
お願いいたします。
amt.lSampleSize = 1036800
BitmapInfo.bmiHeader.biBitCount = 24
キャプチャを開始します、どれかキーを押して下さい
グラブ hr = 80040227, n = 0.000000
グラブ hr = 0, n = 58.767339
グラブ hr = 0, n = 4.656205
グラブ hr = 0, n = 4.146371
グラブ hr = 0, n = 3.421728
グラブ hr = 0, n = 3.625358
グラブ hr = 0, n = 4.840005
グラブ hr = 0, n = 3.523250
865 :
デフォルトの名無しさん :03/10/24 12:48
文字列を入力として受け付けて、その文字列の中に含まれる数字の合計値を出力せよ
>>761 int n[ UCHAR_MAX + 1 ]={0}とやるだけで0フィルされますね。
geゲゲ。typo。 strerr -> stderr な。
871 :
デフォルトの名無しさん :03/10/24 22:18
次の関数getnumを利用して、3つの実数(double型とする)を読み込み、 それらの実数のうち最大値を表示するプログラムを作成せよ。 void getnum(char *msg,double *num){ printf(msg); scanf("%lf",num); } 実行例 1番目は?:12.34 2番目は?:56.7 3番目は?:890.5 最大値は890.5です よろしくお願いします。
872 :
デフォルトの名無しさん :03/10/24 22:52
2つの整数値をそれぞれキーボードから整数型と実数型の 2通りで読み込みそれぞれに対して四則演算の結果(それぞれ 4通りずつ)を示せ。 お願いします。
ああ、漏れはあふぉなんだろうか。 入力がいくつ入ってくるかわからんし、どっちの言語を使っていいのかもわからん。
説明不足だったかもしれません・・・ キーボードから2つの数字を入力して その2数の四則演算を、整数型と実数型の2通り で表せということです。つまり、4*2で8通りの 答えがでてくるということです。 ちなみに言語はCです。 改めてよろしくお願いします。
>>871 getnumの1行目はprintf("%s", msg);にした方がいい。
msg内に%が含まれているといけないからね。
int main(void)
{
const int times = 3;
double max_value = DBL_MIN;
int i;
for (i = 0; i < times; ++i) {
double num;
char msg[256];
sprintf(msg, "%d> ", i + 1);
getnum(msg, &num);
if (max_value < num)
max_value = num;
}
printf("%f\n", max_value);
return 0;
}
876 :
デフォルトの名無しさん :03/10/25 05:59
問題:2つの数字を入力してもらい、その和を計算して出力するプログラムを書け。 struct number{ int digit; struct number *next; }; digitは桁の値で、nextが次の桁の構造体を指すポインタ。 struct number *input(char *p){ … } void add(struct number *a, struct nunmber *b){ aにbの値を加える。 } void output(struct number *a){ 出力する。 } この辺の関数を使いながら問題を解いてみて下さい。 お願いします。
>>554 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
char ans;
srand(time(0));
getchar();
printf("%s\n正しいですか?(y/n)", rand()&1?"yes":"no");
fflush(stdin);
scanf("%c", &ans);
if (ans == 'n') {
printf("プログラムにバグはつき物です、あきらめましょう\n");
}
}
879 :
デフォルトの名無しさん :03/10/25 07:56
>>878 fflushは出力ストリームに使うもの。
scanfが始めにでてくるCの教本みて思うんだが scanfは初心者には難しくない?規格書をよく 読まないと細かい動きがつかめない、入力エラーの 対処がかなり難しい。 たまたまBASICのINPUT文の機能を似せることが できるだけで初級で教えるには相応しくないと思うのだが…。
>>880 だからscanf()は使うなとあれほど……
最初に出てくるのはputsかprintfだろ。
はじめ 【初め/始め】 (1)はじめること。 ⇔終わり 「仕事―」 (2)はじめたばかりの段階・時。副詞的にも用いる。 「―にお断り申し上げます」「―気がつかなかった」 さいしょ 【最初】 いちばんはじめ。
884 :
デフォルトの名無しさん :03/10/25 12:36
putsはでてこねーよ
886 :
デフォルトの名無しさん :03/10/25 13:38
おれは初心者諸君に言う事に決めた。 最初に習う言語はCからはじめる方が多いようだがこんなのを勉強したって 糞のコーディングしか身につかずやくに立たない。 そこで時間を無駄にする事のないようにおすすめの言語はjavaかC#がええと思う。 C++から始めてもいいけどくれぐれもCの関数ライブラリを使うやり方を覚えないように。
つーか宿題スレだし
>>886 最初に習う言語はLispに決まってるだろ。バ〜カ。
そして、次はアセンブラだ。
そんな事言ったら最初に習うのならHTMLできまり。
891 :
デフォルトの名無しさん :03/10/25 15:02
VC++の6で、10〜20の乱数が出せないんですが… 言語はCです。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int dis; srand((unsigned)time(NULL)); dis=((rand()/(double)RAND_MAX)*10); return(0); } こう書いて、gccでは出来たのですが、VC6++だと警告されます。 他に乱数を出す方法を教えてください。
893 :
デフォルトの名無しさん :03/10/25 15:11
>>892 warning C4244: '=' : 'double ' から 'int ' に変換しました。データが失われているかもしれません。
です。申し訳ないです
>>893 まんまじゃないか。int型にキャストしてないだけ・・・。
dis=(int)((rand()/(double)RAND_MAX)*10);
gccは#include<stdio.h>書かなくてもprintfがちゃんと判断できるくらい
デフォルトだとぬるい文法のコンパイラだから。
>>895 まあ他のコンパイラ言語よりは文法にぬるいけどGCCはさらにぬるい。
>>891 >dis=((rand()/(double)RAND_MAX)*10);
漏れは無駄に括弧が多いのが気になるぞ。
演算子の優先順位くらい理解しとけ!
dis = rand() * 10 / RAND_MAX;
これで良いんでないの? キャストも要らんし。
>>894 単にint型を返す関数と見なしているだけ。
もともとCにはプロトタイプ宣言なんてものはなかったから、今でも宣言せずとも呼ぶことはできる。
dis = rand() * 10 / RAND_MAX + 10; 鬱だ。
>>890 いや、ヒンディー語と中国語を習うのが吉。
>>899 それは単にC言語の仕様。
単純に呼ぶんじゃなくてある程度のstdio,stdlibの関数の引数情報はコンパイラ内でもっている。
gccでも -Wall 付けると小姑みたいにうるさくなるぞ。
警告はどう出そうがコンパイラの自由
>>902 >ある程度のstdio,stdlibの関数の引数情報はコンパイラ内でもっている。
ファイナルアンサー?
907 :
デフォルトの名無しさん :03/10/25 16:06
>>907 なかなかいい問題だな。こんど出題してみよう
ポインタの一番奥が一番最初の桁でいい?
>>876 #include <stdio.h>
#include <malloc.h>
struct number{ int digit; struct number *next; };
struct number *input2(char *p, struct number *a){
struct number *np;
if(*p == '\0') return a;
np = malloc(sizeof(struct number));
np->digit = *p - '0'; np->next = a? a : NULL;
return input2(p + 1, np);
}
struct number *input(char *p) { return input2(p, NULL); }
void output(struct number *a) {
if(!a) return;
output(a->next); printf("%d", a->digit);
}
int to_int(struct number *a) { if(!a) return 0; else return a->digit + to_int(a->next) * 10; }
void add(struct number *a, struct number *b) {
struct number *a_before;
int rv = to_int(a) + to_int(b);
for(a_before = a; rv > 0; rv /= 10, a_before = a, a = a->next) {
if(!a) { a = calloc(1, sizeof(struct number)); a_before->next = a; }
a->digit = rv % 10;
}
}
int main(int argc, char **argv) {
struct number *a;
printf("%s + %s = ", argv[1], argv[2]);
a = input(argv[1]); add(a, input(argv[2])); output(a);
return 0;
}
見にくくてごめん。
>>902 はDQN。
プロトタイプがなけりゃ、どんな引数でも通るわい。
int main(){
fopen(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,11,1,1,1);
return 0;
}
これが通らないコンパイラは標準Cに準拠"していない"。
さらに大概の処理系だと、上のコードはリンカも無事に通る。
(シンボル名に引数情報が含まれていないため)
まかり間違っても、#include <stdio.h> をつけ足すなよ??
#define REPLACEMENT '.' #define CONNECTOR '_' #define LEFT_PAREN '(' #define RIGHT_PAREN ')' int is_stopper(int c) { return (isspace(c) || (c == ')') || (c == '(')); } int read_item(FILE *fp, char *str) { int letter; /* first read in any blankspace and check for EOF */ while(isspace(letter = getc(fp))); if (letter == EOF) return EOF; /* check if parenthesis */ if (letter == '(') return LEFT_PAREN; if (letter == ')') return RIGHT_PAREN; ungetc((char) letter, fp); while(!is_stopper(*str++ = getc(fp))) /* read word in */ if (*(str-1) == CONNECTOR) *(str-1) = REPLACEMENT; /* change '_'to'.'*/ ungetc(*--str, fp); /* went one too far */ *str = '\0'; /* end it nicely */ return OK; } 上の関数の挙動がまるでワカラソ。どなたかご教授おながいします。
たとえば ( abc_def_g ) こんな入力から abc.def.g を取り出す関数か? コメントどおりとしかいえないと思うが。
>>910 さん
ありがとうございます
助かりました!!
コンパイルできません… どうすればいいんでしょうか。
>>914 とりあえず、スペースも( )もない
1Gバイトくらいのファイルを食わせてみると
何かがわかる。
>>917 全角スペースでレイアウトしてるから。分からなければ以下を。
#include <stdio.h>
#include <malloc.h>
struct number{ int digit; struct number *next; };
struct number *input2(char *p, struct number *a){
struct number *np;
if(*p == '\0') return a;
np = malloc(sizeof(struct number));
np->digit = *p - '0'; np->next = a? a : NULL;
return input2(p + 1, np);
}
struct number *input(char *p) { return input2(p, NULL); }
void output(struct number *a) {
if(!a) return;
output(a->next); printf("%d", a->digit);
}
int to_int(struct number *a) { if(!a) return 0; else return a->digit + to_int(a->next) * 10; }
void add(struct number *a, struct number *b) {
struct number *a_before;
int rv = to_int(a) + to_int(b);
for(a_before = a; rv > 0; rv /= 10, a_before = a, a = a->next) {
if(!a) { a = calloc(1, sizeof(struct number)); a_before->next = a; }
a->digit = rv % 10;
}
}
int main(int argc, char **argv) {
struct number *a;
printf("%s + %s = ", argv[1], argv[2]);
a = input(argv[1]); add(a, input(argv[2])); output(a);
return 0;
}
>>919 /usr/lib/libcygwin.a(libcmain.o)(.text+0x81): undefined reference to `WinMain@16
'
collect2: ld returned 1 exit status
こんなエラーがでるんですけど、分からない…
初心者でごめん。
今もっかいやったらコンパイルできました。 たびたびすいません。 ただsegmentation faultになってしまいます。
-mwindows オプション外せ
>>915 ,918さん
つまりこの関数はファイルから読み込んで
EOFもしくは「(」もしくは「)」が来たらそれを返し、
それ以外の単語だったら(空白が来るまで)引数のstrに代入するということ
でしょうか?つーかコメントに書いてあった。鬱・・・
ただ入力ファイルに「_」がひとつも見当たらないのが気
になります。
とある数の階乗を計算して出力するプログラム誰か作って下さいな。
>>921 実行例
$ ./a.exe 123 45
123 + 45 = 168
まったくエラーチェックしてないので、引数を間違えるとすぐcore dumpする。
>>924 こんなんでええのかね?
#include<iostream>
using namespace std;
int main()
{
int a, x=1;
cin>>a;
for(int i=1; i<=a; i++)
x = x * i;
cout<<x;
}
>>923 (914)
その入力ファイルは宿題と一緒に渡された物?
_ が含まれていた場合の挙動に気づくかどうかという
別な課題を課しているか、単に出題者のミスと思われ。
宿題でなく、オープンソースなコードを勉強のために読んでるんじゃない?
>>924 #include <stdio.h>
void main()
{
printf("%ld", f(10));
}
long f(int n)
{
if (n == 0 || n == 1)
return (1L);
else
return (n * f(n -1));
}
>>910 int to_int(struct number *a) { if(!a) return 0; else return a->digit + to_int(a->next) * 10; }
ってオーバーフローしない?
とか input2 の np->next = a? a : NULL; って np->next = a; でいいんじゃないの?
とかあるけど,再帰を使えばこんなに綺麗にかけるんやね
感動した
>>924 n! ってかなり小さい n でオーバーフローしない?
>>927 ,928さん
卒論のためのプログラムを書いていて、その足しになるかと思って
とあるオープンソースプログラムを外国から拾って読んでました。
上の関数の問題は解決しました。協力していただいた皆さん、ありがとうございました。
階乗は結構発散するからせめて100桁ほどの数字が扱えると好ましい
>>931 スタック代わりに再帰を使っている例だな。
感動するのは良いが,こういう本質をちゃんと見抜けよ?
>>935 void add(struct number *a, struct number *b) {
while (b || (a && a->digit >= 10)) {
a->digit += b->digit;
if (a->digit >= 10) {
a->digit -= 10;
if (!a->next) a->next = (struct number *)calloc(1, sizeof(struct number));
(a->next->digit)++;
}
if (!a->next && b->next) a->next = (struct number *)calloc(1, sizeof(struct number));
a = a->next;
b = b->next;
}
}
consっぽいことやってるし,関数プログラマなんかね?
計算アルゴリズムに再帰関数が綺麗だと言っているようじゃ終わりやな。
なんだかよく分からない展開に…。
>>931 さん
ご指摘ありがとうございます。
addについては
>>936 さんのようにやるべきですね。
input2については…なに考えてたんだろう。
なお再帰構造の最適化については、
>>910 さんへの宿題ということで…。
アルゴリズムというか、式を表現するのに再起を使うのは自然 スタック等に展開するのはその先の段階で、 きれいとか言う問題ではなく一番シンプルな基本形って言いたいんじゃないの?
>>941 宿題にするまでもねぇ。
void add(struct number *a, struct number *b){
int result;
int carry;
result = a->digit;
if(b) result += b->digit;
carry = result / 10;
a->digit = result % 10;
if( ( b && b=b->next ) || (carry) ) {
if(!a->next) a->next = calloc(1, sizeof(struct number));
a = a->next;
a->digit += carry;
add2(a,b);
}
return;
}
>>910 のaddの方がややこしいと思うのは気のせいか?
>>936 さんへ。
int i;
for(i=1<<22; i; --i) add(n1,n2);
というコードで何回も足し算させると、すぐに落ちてしまいます。
a,bを読み込んで直行行列を掛けていき R(k)=(<y^4>-5)^2+(<z^4>-5)^2という式のR(k)が最大値を取るときのkを代入した値y,zを出力したいのですが 途中まで書いてみましたがうまくいきませんです、、どなたかご教授願います <>は平均を表します。0<k<90の範囲 #include<stdio.h> #include<math.h> #include<stdlib.h> int i,k; #define n 100 #define pai 3.1415926 int main(void){ double c,c2,c3; double d,d2,d3; double e,f,a[n],b[n],y[n],z[n]; FILE *fp; if(NULL==(fp=fopen("ab.txt","r"))){ printf("\n can not be opened\n"); exit(1); } i=0; while(fscanf(fp,"%lf,%lf",&a[i],&b[i])!=EOF){ i++; } fclose(fp); if(NULL==(fp=fopen("kai.txt","w"))){ printf("\n can not be opened\n"); exit(1); }
for(k=0; k<90; k++){ for(i=0;i<n;i++){ y[i] =cos(pai*k/180)*a[i]+sin(pai*k/180)*b[i]; z[i] =-sin(pai*k/180)*a[i]+cos(pai*k/180)*b[i]; } c=y[i]; d=z[i]; c2 += pow(c,4); d2 += pow(d,4); c3=c2/n; d3=d2/n; e=(c3-5)*(c3-5); f=(d3-5)*(d3-5); fprintf(fp,"k=%d%lf\n",k,e+f); fclose(fp); } return 0; }
>>946 プログラムを見るとなんとなくやりたいことは分かるが、
kとy,zの関係式、平均の定義式をきちんとかけ。
> #define n 100
このパラメータも問題に定義されてないし。
すいません、説明不足でした・・ nは読み込むデータの総数で 平均<>は読み込んだデータを全て足しあわせて総数nで割ります kとy,zとの関係は最大となるkを求めた後 y(k)=cos(pai*k/180)*a[i]+sin(pai*k/180)*b[i] z(k)=-sin(pai*k/180)*a[i]+cos(pai*k/180)*b[i] という式に当てはめて0-100まで順に出力したいのですが
トランプゲームのブラックジャックのプログラムを作ってください。 よろしくお願いします。
>>944 add2はtypoだろうが…
何でループに展開された末尾再帰を末尾再帰に改悪するの?
>>951 数学的観点から見たら展開した方が汚いよ。
>>949 >>947 のメインループを以下のようにしては?
for(k=0; k<90; k++){
for(i=0;i<n;i++){
y[i] =cos(pai*k/180)*a[i]+sin(pai*k/180)*b[i];
z[i] =-sin(pai*k/180)*a[i]+cos(pai*k/180)*b[i];
}
r = R(y, z, n);
if(r > r_max) { r_max = r; k_max = k; }
}
fprintf(fp,"k_max=%d R(k_max)=%lf\n",k_max,r_max);
for(i=0;i<n;i++){
y[i] =cos(pai*k_max/180)*a[i]+sin(pai*k_max/180)*b[i];
z[i] =-sin(pai*k_max/180)*a[i]+cos(pai*k_max/180)*b[i];
fprintf(fp,"y[%d]=%lf z[%d]=%lf",y[i] ,z[i]);
}
ちなみに前もって以下を定義しておく。
double r_max = 0, r;
int k_max;
double avg_pow4(double arr[], int N) {
int i; double result = 0;
for(i = 0; i < N; i++) result += pow(arr[i], 4);
return result / N;
}
double R(double y[], double z[], int N) {
return pow(avg_pow4(y, N) - 5, 2) + pow(avg_pow4(z, N) - 5, 2);
}
>>953 どうも有り難うございましたm(__)m
感謝します!
955 :
デフォルトの名無しさん :03/10/26 19:53
------------------------------------------------------------ テキストファイルの内容をバッファ読み込む関数 int file_load(const char *fname,char *buf) バッファの内容をテキストファイルに読み込む関数 int file_save(const char *fname,char *buf) ファイルオープン・クローズ、および必要なエラー処理は関数無いで行い 戻り値はエラー終了の場合-1、正常終了の場合0とする ------------------------------------------------------------ の作り方がどうしてもわかりません。。。 よろしければご教授おねがいします。
>>955 普通にfopenしてbufにメモリ割り当ててstrcpyすればいいのでわ?
レスありがとうございます。 C言語まだ初めて数ヶ月の初心者でどこをどういじって いいのやらみたいな感じで。。。 厨房同然で申し訳ありませんがが簡単な説明交えてサンプルソースなんか 作って頂けると有り難いです。。。
>>951 それなりのコンパイラなら,最適化かけりゃどっちも同じマシンコードになるはず。
再帰で書いて欲しそうだったから,再帰にしてあげた。
>>956 その引数じゃ何をしたいのかわけワカメ。
, char **pbuf)
でバッファを動的に確保するとか,
, char *buf, size_t buf_size)
で確保済みバッファを渡すとか,
もう少し,意図を明確に。
バッファオーバーフロー上等ってのは勘弁してくれ。
>>959 レスどうもです。
バッファオバーフローとかはまだ習っていない状態です。。
引数はconst char *fname,char *bufしか与えてはいけ
ないらしいです。。
>>960 > 引数はconst char *fname,char *bufしか与えてはいけ
このスレッド最大の難問だな。
>>961 >>959 あ、もうしわけありません。
重要なことがぬけてたっぽいです。。。
「バッファのメモリ確保は関数外で行うものとする」
だそうです。。
>>955 インデントが崩れたら適当に調節してね。
で、main()も要る?
int file_load(const char* fname, char* buf)
{
FILE*fp = fopen(fname, "rt");
intch;
if(fp == NULL) return -1;
while( (ch = fgetc(fp)) != EOF ) {
*buf++ = ch;
};
fclose(fp);
*buf = '\0';
return0;
}
int file_save(const char* fname, char* buf)
{
FILE*fp = fopen(fname, "wt");
if(fp == NULL) return -1;
fwrite(buf, 1, strlen(buf), fp);
fclose(fp);
return0;
}
>>962 #include <stdio.h>
size_t FileSize;
int file_size(const char *fname) {
FILE *fp;
if((fp = fopen(fname, "r")) == NULL) return -1;
fseek(fp, 0L, SEEK_END);
if((FileSize = ftell(fp)) == 0) return -1;
fclose(fp); return 0;
}
int file_load(const char *fname, char *buf) {
FILE *fp;
if((fp = fopen(fname, "r")) == NULL) return -1;
if(fread(buf, 1, FileSize, fp) != FileSize) return -1;
fclose(fp); return 0;
}
int file_save(const char *fname, char *buf) {
FILE *fp;
if((fp = fopen(fname, "w")) == NULL) return -1;
if(fwrite(buf, 1, FileSize, fp) != FileSize) return -1;
fclose(fp); return 0;
}
int main(int argc, char **argv) {
char *buf;
if(argc != 3) return -1;
if(file_size(argv[1]) != 0) return -1;
if(FileSize <= 0) return -1;
buf = (char *)malloc(FileSize);
if(file_load(argv[1], buf) != 0) return -1;
if(file_save(argv[2], buf) != 0) return -1;
return 0;
}
すまん。さっきから名前欄の数字を消し忘れてばかり…。
>>964 ありがとうございます。感謝感激です。
main関数は次の授業でなにか作るらしいので結構です。
これからC言語の勉強がんばります。
ほんとにありがとうございました〜
授業でVC++使ってるんですが、「Tree作ってこい」とのことです。 ( ゚Д゚).。oO(Treeって何?) っていう状態で困ってます(検索しても死ぬほどでてくる)。
>>968 普通ツリーっていったら木構造で、たぶん課題なら二分木だと思われ。
「アルゴリズム 二分気」とかって検索しる!
実はクリスマスツリーを作ってくる宿題に300モナー
っていうかさ、本当に教官が「Tree 作ってこい」と言っただけなんだったら クリスマスツリーの AA 作って提出すりゃいいと思う。 それで単位落とされたら教務課にクレーム出してもいいくらい。 ↑もちろん、その教官が授業中木構造について全く説明してないってのならの話ね。
ツリーツっていうのを食えってことだよ 聞き間違いだよ 埋めるためにほんわかさせてみた
>>968 フラクタル図形で木でも描いたら良いんだろ?
友達に質問メール出してたらさっき返信が帰ってきますた。 ”treeコマンドを作れ”とのことらしいです。 一応treeコマンドがどんなものか検索したら分かりましたので、 これからがんばってみることにします。 (今日は寝れるかな・・・)
友達居んなら来んなよ゚д゚) 、ペッ
WinAPIでそんなんがあったやうな
977 :
デフォルトの名無しさん :03/10/27 13:30
関数テンプレートなのですが これだと エラー E2147 untitled.cpp 6: 引数宣言は 'type' で始められない エラー E2303 untitled.cpp 6: 型名が必要 というエラーが出ますどこが間違っているのでしょうか? #include<iostream> using namespace std; template <typename type> type f(type a, type b); f(type a, tyep b) { return (a + b) * 4; } void main() { int a=9, b=3; double c=3.8, d=5.8; cout<<f(a, b); cout<<f(b, c); cout<<f(c, d); cout<<f(d, a); }
template <typename type> type f(type a, type b) /*; f(type a, tyep b) */
>>978 そこがいらなかったのですか・・・プロトタイプ宣言とごっちゃになってました
ありがとうございました
エラー見たら推測できないなー まーちゃんと返事も書いて礼儀正しいから良しとしますか
任意のウインドウに文字列を送信するって どうやって実現しているのですか? 例えば、顔文字入力支援といったものがありますよね。 クリップボードを経由するやり方があるのでしょうか? 単にクリップボードにコピーするのであれば ・OpenClipboard() ・EmptyClipboard ・SetClipboardData ・CloseClipboard という手順でやったことはあるのですが。 それとも、クリップボードなど経由でず、直接ウインドウの 例えばエディットコントロール等に文字列を送っているのでしょうか? ご存知の方、いらっしゃいましたら教えて下さいませ。
宿題かよ
あれ?
>>984 レスありがとうございます。
推測ですが・・・
クリップボードへコピーした後に、CTRL+V 相当の
指示を対象ウインドウに送るのでしょうか?
だとしたら、それってどうやるんでしょう?
FindWindow() でウインドウハンドル取得して、
メッセージを投げるのでしょうか?
それとも、クリップボードからペーストする別の
機構が用意されているのでしょうか?
>>985 別のスレに行ったほうがいいよ。
スレ違いだし、ここはもう埋め立てるだけだから。
>955 KAIT(´ι_`) Page 2B-3
読みずれー! まっとうなインデントしろよ。 つーか、 string1.concatenate(ch)なんてどこに書いてあるんだよ。 string1.substring(string2)なんてどこに書いてあるんだよ。 お前はどんなmainを書いたんだ? そのmainがどう動作すること期待してて、 実際にはそのmainはどう動いたんだ? それを書け。
>>990 (っていうか「質問」とか「教えて」とかいう状況じゃあなさそうだから、課題の文章を
そのままコピペしてもらったほうがいいんじゃないかな。。。)
>>990 読みづれー!
まっとうな日本語使えよ。
delete [] 配列名; で、なんかエラーが出るので、 配列名 = NULL; こうしてみたのですが、 このやりかたで、メモリ解放できているのでしょうか?
配列? とりあえず開放はされない。 ちゅーか、ソース抜き出して貼れよ。
996 :
デフォルトの名無しさん :03/10/28 16:09
記念カキコ v(^-^=)
error
終幕
1000 :
デフォルトの名無しさん :03/10/28 16:14
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。