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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。