C/C++の宿題をやらせて。おながい。13代目

このエントリーをはてなブックマークに追加
666デフォルトの名無しさん
『2つの最大40桁の自然数を入力して、その和・差・積を求めるプログラム(ポインタは使わない)』
という課題なんですが、さっぱり分かりません。
配列を用いて計算するということは分かるんですが…。

C言語です。よろしくお願いします。
なんで配列がいるの?
>>666
筆算をエミュレートすればいい
669デフォルトの名無しさん:03/10/19 01:10
>>667
たばいちょー
doubleでも15桁程度が限界
intたくさん使って固定小数点クラス作れば簡単。
自然数同士の和・差・積に小数は要らないナリ
>>671
>>666へのレスだとしたら、なんで小数点が必要なんだよ。
商なら必要になるかもしれないけどな。見事に含まれていないな。
>>674
商の多倍長計算は面倒だからな
>>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;
}
677666:03/10/19 12:54
>>676
足し算、引き算は簡単なわけよ!
掛け算と割り算を教えてよ
>>677
偽物は良いから…
>>677
本物は割り算を求めてはいないわけだが
680デフォルトの名無しさん:03/10/19 14:51
Cで3次元配列のメモリを確保するにはどうしたらいいですか?
int test[10][10][10];
ポインタのポインタのポインタか
一次元配列で確保して関数とかでインデックスと返すようにする。
683680:03/10/19 14:55
malloc使ってfor文で回してやろうと思うのですが、
具体的にどう書いていいかわかりません_| ̄|○
>>666
気がついたら,mainだけポインタだらけに(w
まぁ,許せ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=158
すいません、96の64乗を計算するのに
一番シンプルな手法って
どういうのがあるのでしょうか??
powだと溢れちゃいますた。
速さにこだわりはありません。
lisp
687686:03/10/19 18:09
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で。
配列を使うならば出来るのですが…。

よろしくお願いいたします。
>>701
配列を使うほうを書いて見れ
703666:03/10/20 00:57
皆さんどうもありがとうございました。
おかげで何とかなりそうです。
自然数を入力として受付け、以下に示す様な連続する 2 自然数の積の和を求めよ。
ただし、x>1と仮定して良い。

1*2+2*3+3*4+ …… +(x-1)*x


#include <stdio.h>
int main(void) {

「ここの部分をおながいします。」

 return(0);
}
705685:03/10/20 01:21
遅レスすいません、>685です
みなさんありがとうございます。

>686
検算に使わせていただきます(^^;

>688
カウンタが回ってるのにfor文中でiが使われてないのが
不思議です(^^;
試しに実行してから考えてみます

>689
多倍長整数演算クラス作る課題の人とは別なんですけど、
やっぱり多倍長演算出来ないと厳しいみたいですね(^^;

>691
ずばり、そのあとでmod取りたいです・・・

>694
流行ってるとは言い切れないですけど、
直前でも似た(?)質問してる方いますね(^^;

>697
商と余りまで出すのが最終目的です

週末で多倍長演算と言うをする必要があると思ったので
また明日調べてがんばってみます。
みなさんありがとうございます。
またヒントがあればよろしくお願いします。
706685:03/10/20 01:53
自レスです。

>カウンタが回ってるのに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 未満にしかならないのだが…
710709:03/10/20 09:57
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は連続のもののみ。
>>715
>>555
>>575-576
ガイシュツ。
つーか同じ授業で何人も同じ事聞く香具師がいるなんて相当頭悪い学校なんだろうな。
>>716
まぁそう言ってやるな。頭悪い事は本人が一番分かってるだろうし。
>>716
多分、課題出した人的には標準ライブラリ自体使わずやって欲しい気がする。
まあ、確かに search なら配列に対する操作だから
「文字列ライブラリを・・・」ってのにひっかからないけど。

こういう言葉足らずな課題って多いよなぁ。

>>715
というわけで、search も使うの気が引けるなら、
“Knuth-Morris-Pratt” とか “Boyer-Moore” のアルゴリズムでぐぐれ。
>>718
> “Knuth-Morris-Pratt” とか “Boyer-Moore” のアルゴリズムでぐぐれ。
文字列が長くないとコスト高杉
720701:03/10/20 21:50
見難い、かつ醜くてお恥ずかしいのですが…

#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の定義がないと書きようが無い
732729:03/10/21 08:20
漸化式というのは差分方程式のことでした
>>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);
}

こんなんでいい?
>>737
isdigitを使えよ。

>>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;
}
751750:03/10/21 19:31
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 を出力する。
>>753
マルチ氏ね!!!
ヒントください

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 文の条件が評価できない
とエラーが出てしまいます。
前で定義されてると思うのですが、
どうすればよいのか教えて下さい。
764726:03/10/21 22:16
cp は op、e_add は '+' の間違いね。
あとは自分で直して。
765デフォルトの名無しさん:03/10/21 22:32
>>764
char* argv[]はどういう処理に使ってるんですか?

766726:03/10/21 22:44
使ってません。
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
>>767
なんでifを使いたくないの?
769767:03/10/21 22:56
>>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するかはお察しください
774768:03/10/21 23:19
>>769
インラインアセンブラでやれ
#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);
}
>>775
で、それはコンパイルできるのか?
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);
}
で、またループに入るのか…
>>783
flagが変わってるから入らない
おお、ループには入らないなぁ。
かなりイカレたプログラミングですな
漏れはこうかな。

while(printf() && scanf()==1 && 判定1 && printf() && scanf()==1 && 判定2)
;
>>787
>>782とは対照的だな
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);
}
791767:03/10/22 00:50
ふぇぇ、皆様、レスありがとうございます・・・。
ですが、学び始めて間もない漏れにとっては、まだまだ皆様の組んだプログラムが理解できない状態であります・・・情け無いです。
皆様のレスは、テキストで保存しておきます。後に見たときに理解してみせます。

今回は、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 関数を用いてるじゃん。
795793:03/10/22 03:53
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という名前で作るプログラムを
作れ。という課題なんですが・・・わかりません。
おしえて下さい
確かにわからんな
実際のデータ表とやらが全く想像できん
800シュウ:03/10/22 20:12
〆切がせまってます助けてください。よろしくお願いします。


正の整数 n を読み込み,その平方根の整数部分を求めるプログラムを書け.

ヒント)

女の子(めのこ)平方という方法を用いる.
正の整数 a から,1, 3, 5 と順 に奇数だけを引けるだけ引いたとき,
引くことができた奇数の個数が a の平方根の整数部分になる.
>>800
>女の子平方
へぇ〜へぇ〜へぇ〜
>>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;
}
807シュウ:03/10/22 21:18
=800
みなさんありがとうございます。

で、なぜかコンパイルできません。

???
808デフォルトの名無しさん:03/10/22 21:25
入力された数字を二進数にして表示させるプログラムが分かりません。
よろしくお願いします。
>>808
2で割ってきゃいいんじゃねーの?
>>808
各bitが立った値を配列でもなんでも用意して
ANDとって真だったら0x31を出力すれば?

811809:03/10/22 22:25
>>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;
}
>>800
(int)sqrt(n)
>>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 **
エラーメッセージを書かない奴は逝ってよし。しかもここは質問スレじゃないし。
>>824
>>782 != >>790 で、
>>790がforを使ったのは>>782が使っていたからだと
思ったけど。

>>789
ヤバイんだっけ?
問題なさそうに思うけど。
831デフォルトの名無しさん:03/10/23 14:12
>>782
> for(;!flag;)

whileって知っていますか?
832830:03/10/23 14:17
>>831
>>782がforを使ったのは、>>775がforを使っていたからだと
思ったけど。
>>775がwhile(1)を使っていたら、>>782もwhileを使ったと思うよ。
775はmainでexitを使うのか。しかもstdlib.hをインクルードしないで。
>>830
volatileは必要ないね。
835827:03/10/23 17:57
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
ダメだった・・・_| ̄|○
ホントに悪いんですがそこの部分書き直してもらえませんか・・・
847inaian: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/m)*m;
>>847
http://pc2.2ch.net/test/read.cgi/tech/1058630709/

の141で答えてもらってるぞ。
>>847

return n-(n/m)*m<(n/m)*(m+1)-n?n-(n/m)*m:(n/m)*(m+1)-n;
852837:03/10/24 00:23
誰か>>837-838をふまえてプログラム書いておくれ・・・
宿題は自分でも理解しようね
#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);
}
855837:03/10/24 00:30
>>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;
}
>>855
お土産つきだからね。きをつけて。
858837:03/10/24 00:35
>>854,856さんもありがとうございます。
>>857
危うく引っかかるところですたw
859デフォルトの名無しさん:03/10/24 05:07
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
のcap26.cppのプログラム実行結果をテキストに保存するプログラムをください。
どこに実行結果の数値をテキストに書き込む処理を入れれば、
いいのでしょうか?
>>859
while(1)のループのあたりじゃない?
cap26.exe > cat26.log
862861:03/10/24 07:46
もしくは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
>>859
マルチ死ね
865デフォルトの名無しさん:03/10/24 12:48
文字列を入力として受け付けて、その文字列の中に含まれる数字の合計値を出力せよ
>>865
お前、面白い奴だな・・・(w >>761
>>761
int n[ UCHAR_MAX + 1 ]={0}とやるだけで0フィルされますね。
>>863
イラン行はstrerrに吐いとけ。
geゲゲ。typo。
strerr -> stderr な。
>>761って合ってるのか??
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通りずつ)を示せ。

お願いします。
ああ、漏れはあふぉなんだろうか。
入力がいくつ入ってくるかわからんし、どっちの言語を使っていいのかもわからん。
874872:03/10/25 00:16
説明不足だったかもしれません・・・
キーボードから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){

出力する。

}

この辺の関数を使いながら問題を解いてみて下さい。
お願いします。
>>875
いやするべき。鉄則。
>>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はでてこねーよ
885871:03/10/25 13:12
>>875
どうもありがとうございました
886デフォルトの名無しさん:03/10/25 13:38
おれは初心者諸君に言う事に決めた。
最初に習う言語はCからはじめる方が多いようだがこんなのを勉強したって
糞のコーディングしか身につかずやくに立たない。
そこで時間を無駄にする事のないようにおすすめの言語はjavaかC#がええと思う。
C++から始めてもいいけどくれぐれもCの関数ライブラリを使うやり方を覚えないように。
つーか宿題スレだし
>>886
最初に習う言語はLispに決まってるだろ。バ〜カ。
そして、次はアセンブラだ。
>>880
そんな本は 捨 て ろ!!!
そんな事言ったら最初に習うのなら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++だと警告されます。
他に乱数を出す方法を教えてください。
>>891
 何の警告が出るのか書けよ。
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がちゃんと判断できるくらい
 デフォルトだとぬるい文法のコンパイラだから。
>>894
Cってそういうものじゃないのか?
>>894
おぉ、できた。ありがとうございます!
897894:03/10/25 15:27
>>895
まあ他のコンパイラ言語よりは文法にぬるいけどGCCはさらにぬるい。
>>891
>dis=((rand()/(double)RAND_MAX)*10);

漏れは無駄に括弧が多いのが気になるぞ。
演算子の優先順位くらい理解しとけ!

dis = rand() * 10 / RAND_MAX;
これで良いんでないの? キャストも要らんし。
>>894
単にint型を返す関数と見なしているだけ。
もともとCにはプロトタイプ宣言なんてものはなかったから、今でも宣言せずとも呼ぶことはできる。
900898:03/10/25 15:39
dis = rand() * 10 / RAND_MAX + 10;

鬱だ。
>>890
いや、ヒンディー語と中国語を習うのが吉。
902894:03/10/25 15:45
>>899
 それは単にC言語の仕様。
 単純に呼ぶんじゃなくてある程度のstdio,stdlibの関数の引数情報はコンパイラ内でもっている。

gccでも -Wall 付けると小姑みたいにうるさくなるぞ。
警告はどう出そうがコンパイラの自由
>>902
>ある程度のstdio,stdlibの関数の引数情報はコンパイラ内でもっている。

ファイナルアンサー?
907デフォルトの名無しさん:03/10/25 16:06
誰か>>876をおながいします
>>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;
}
911910:03/10/25 17:43
見にくくてごめん。
>>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> をつけ足すなよ??
>>912
(スコア:1, 参考になる)
#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
を取り出す関数か?

コメントどおりとしかいえないと思うが。
916876:03/10/25 21:50
>>910さん
ありがとうございます
助かりました!!
917876:03/10/25 22:01
コンパイルできません…
どうすればいいんでしょうか。
>>914
とりあえず、スペースも( )もない
1Gバイトくらいのファイルを食わせてみると
何かがわかる。
919910:03/10/25 22:23
>>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;
}
920876:03/10/25 22:44
>>919
/usr/lib/libcygwin.a(libcmain.o)(.text+0x81): undefined reference to `WinMain@16
'
collect2: ld returned 1 exit status

こんなエラーがでるんですけど、分からない…
初心者でごめん。
921876:03/10/25 22:47
今もっかいやったらコンパイルできました。
たびたびすいません。
ただsegmentation faultになってしまいます。
-mwindows オプション外せ
923914:03/10/25 23:04
>>915,918さん
つまりこの関数はファイルから読み込んで
EOFもしくは「(」もしくは「)」が来たらそれを返し、
それ以外の単語だったら(空白が来るまで)引数のstrに代入するということ
でしょうか?つーかコメントに書いてあった。鬱・・・
ただ入力ファイルに「_」がひとつも見当たらないのが気
になります。
とある数の階乗を計算して出力するプログラム誰か作って下さいな。
925910:03/10/25 23:07
>>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)
その入力ファイルは宿題と一緒に渡された物?

 _ が含まれていた場合の挙動に気づくかどうかという
別な課題を課しているか、単に出題者のミスと思われ。
928910:03/10/25 23:28
宿題でなく、オープンソースなコードを勉強のために読んでるんじゃない?
929924:03/10/25 23:42
>>926
ありがとん
>>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 でオーバーフローしない?
933914:03/10/26 01:07
>>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っぽいことやってるし,関数プログラマなんかね?
計算アルゴリズムに再帰関数が綺麗だと言っているようじゃ終わりやな。
>>937
>>937 の開発言語は再帰をサポートしていない
>>937は再帰が苦手
941910:03/10/26 13:30
なんだかよく分からない展開に…。

>>931さん
ご指摘ありがとうございます。
addについては>>936さんのようにやるべきですね。
input2については…なに考えてたんだろう。

なお再帰構造の最適化については、>>910さんへの宿題ということで…。
>>937 は再起不能
アルゴリズムというか、式を表現するのに再起を使うのは自然
スタック等に展開するのはその先の段階で、
きれいとか言う問題ではなく一番シンプルな基本形って言いたいんじゃないの?
>>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;
}
948910:03/10/26 17:36
>>946
プログラムを見るとなんとなくやりたいことは分かるが、
kとy,zの関係式、平均の定義式をきちんとかけ。

> #define n 100
このパラメータも問題に定義されてないし。
949946:03/10/26 17:56
すいません、説明不足でした・・
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);
}
954946:03/10/26 19:49
>>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すればいいのでわ?
957955:03/10/26 20:15
レスありがとうございます。
C言語まだ初めて数ヶ月の初心者でどこをどういじって
いいのやらみたいな感じで。。。
厨房同然で申し訳ありませんがが簡単な説明交えてサンプルソースなんか
作って頂けると有り難いです。。。
958944:03/10/26 20:36
>>951
それなりのコンパイラなら,最適化かけりゃどっちも同じマシンコードになるはず。
再帰で書いて欲しそうだったから,再帰にしてあげた。
>>956
その引数じゃ何をしたいのかわけワカメ。
, char **pbuf)
でバッファを動的に確保するとか,
, char *buf, size_t buf_size)
で確保済みバッファを渡すとか,
もう少し,意図を明確に。

バッファオーバーフロー上等ってのは勘弁してくれ。
960955:03/10/26 21:10
>>959
レスどうもです。
バッファオバーフローとかはまだ習っていない状態です。。
引数はconst char *fname,char *bufしか与えてはいけ
ないらしいです。。
>>960
> 引数はconst char *fname,char *bufしか与えてはいけ

このスレッド最大の難問だな。
962955:03/10/26 22:33
>>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;
}
965910:03/10/26 23:16
>>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;
}
すまん。さっきから名前欄の数字を消し忘れてばかり…。
967955:03/10/26 23:25
>>964
ありがとうございます。感謝感激です。
main関数は次の授業でなにか作るらしいので結構です。
これからC言語の勉強がんばります。
ほんとにありがとうございました〜
授業でVC++使ってるんですが、「Tree作ってこい」とのことです。
( ゚Д゚).。oO(Treeって何?) っていう状態で困ってます(検索しても死ぬほどでてくる)。
>>968
普通ツリーっていったら木構造で、たぶん課題なら二分木だと思われ。
「アルゴリズム 二分気」とかって検索しる!
実はクリスマスツリーを作ってくる宿題に300モナー
っていうかさ、本当に教官が「Tree 作ってこい」と言っただけなんだったら
クリスマスツリーの AA 作って提出すりゃいいと思う。
それで単位落とされたら教務課にクレーム出してもいいくらい。

↑もちろん、その教官が授業中木構造について全く説明してないってのならの話ね。
ツリーツっていうのを食えってことだよ
聞き間違いだよ

埋めるためにほんわかさせてみた
>>968
フラクタル図形で木でも描いたら良いんだろ?
974968:03/10/27 00:57
友達に質問メール出してたらさっき返信が帰ってきますた。
”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
そこがいらなかったのですか・・・プロトタイプ宣言とごっちゃになってました
ありがとうございました
エラー見たら推測できないなー
まーちゃんと返事も書いて礼儀正しいから良しとしますか
981sage:03/10/27 15:24
任意のウインドウに文字列を送信するって
どうやって実現しているのですか?

例えば、顔文字入力支援といったものがありますよね。

クリップボードを経由するやり方があるのでしょうか?
単にクリップボードにコピーするのであれば
・OpenClipboard()
・EmptyClipboard
・SetClipboardData
・CloseClipboard
という手順でやったことはあるのですが。

それとも、クリップボードなど経由でず、直接ウインドウの
例えばエディットコントロール等に文字列を送っているのでしょうか?

ご存知の方、いらっしゃいましたら教えて下さいませ。
宿題かよ
あれ?
>>981
クリップボードでしょう
>>984

レスありがとうございます。

推測ですが・・・
クリップボードへコピーした後に、CTRL+V 相当の
指示を対象ウインドウに送るのでしょうか?

だとしたら、それってどうやるんでしょう?
FindWindow() でウインドウハンドル取得して、
メッセージを投げるのでしょうか?

それとも、クリップボードからペーストする別の
機構が用意されているのでしょうか?
>>985
別のスレに行ったほうがいいよ。
スレ違いだし、ここはもう埋め立てるだけだから。
>955 KAIT(´ι_`)
Page 2B-3
>>985
ありがと。
そうします。
989代理人:03/10/28 11:16
昔、教えていただいたClass Newstringについて質問

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=157

これにmainを加えて、ちゃんと機能するか確かめてから宿題再提出になりました。
string1.concatenate(ch)の部分で上手くstring1の後ろにch(一文字)付け加え
出来ません。あと、string1.substring(string2)もディスプレーできません。
分かる人教えてください。
読みずれー!
まっとうなインデントしろよ。
つーか、
string1.concatenate(ch)なんてどこに書いてあるんだよ。
string1.substring(string2)なんてどこに書いてあるんだよ。
お前はどんなmainを書いたんだ?
そのmainがどう動作すること期待してて、
実際にはそのmainはどう動いたんだ?
それを書け。
>>990
(っていうか「質問」とか「教えて」とかいう状況じゃあなさそうだから、課題の文章を
 そのままコピペしてもらったほうがいいんじゃないかな。。。)
>>990
読みづれー!
まっとうな日本語使えよ。
993990:03/10/28 13:10
>>992
すまんこってす
delete [] 配列名;
で、なんかエラーが出るので、
配列名 = NULL;
こうしてみたのですが、
このやりかたで、メモリ解放できているのでしょうか?
配列?
とりあえず開放はされない。
ちゅーか、ソース抜き出して貼れよ。
996デフォルトの名無しさん:03/10/28 16:09
記念カキコ v(^-^=)
997994:03/10/28 16:10
error
終幕
1000デフォルトの名無しさん:03/10/28 16:14
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。