ぼるじょあがC/C++の宿題を片づけますYO! 24代目
(・3・)アルェー 帰ってきたC++房のぼるじょあですYO!
わからない宿題を片づけますYO!
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
2 :
デフォルトの名無しさん :04/06/07 21:46
3 :
デフォルトの名無しさん :04/06/07 21:47
終了
( ̄ー ̄)ニヤリッ
⊂ つヽ (;⌒`;⌒`)
ノ ノ ノ \ \ (`⌒ )
(_ノ、_ノ ` \\ ( ⌒)
彡 \ ヽヽ ( )
ヽ `\从从从从人火
゚,.(´;(´⌒(;・"⌒`);`):';⌒`)`)。
゚,.(´;(´⌒(;・"⌒`);`):';⌒`)`´;(´
>>1 (;・"⌒`);`):';⌒`)`)..
从从从从゚,.(´;(´⌒(;・"⌒`);`):';⌒`゚,.(´;(´⌒(;・"⌒`);`):';⌒`)`)。.
゚,.(´;(´⌒(;・"⌒`);`):';⌒`)`)。.゚,.(´;(´⌒(;・"⌒`);`';⌒`)`)。.゚,.(´;(´⌒(;⌒`);`):';⌒`)`)。.
l || ___ ||
l\ l
l |
l ___l
くそー。ぼるじょあにならんように早めにスレ立ててたのに。
7 :
デフォルトの名無しさん :04/06/07 23:02
8 :
デフォルトの名無しさん :04/06/07 23:52
早速質問です。 {50.0, 75.0, 62.0, 65.5, 80.0, 95.0, 90.5, 87.0, 80.0, 99.5} この10個のデータを配列に入れ、main関数の中で平均と分散を求めるプログラムを、 ポインタを用いて画面に出力せよ。平均、分散の式は以下のこと。 _ 1 n 1 n _ 2 x=− x σ=− (x−x) n i=1 i n i=1 i です。平均分散の式わかりにくいかと思いますがわかる方回答よろしくお願いします・・
式がどうしてもずれてしまう・・・とりあえずフィーリングでおねがいします(泣)
10 :
デフォルトの名無しさん :04/06/07 23:54
まあ分かる人は式を提示されなくても分かるでしょうね。
>>8 #include <stdio.h>
int main()
{
static double data[10] = {50.0, 75.0, 62.0, 65.5, 80.0, 95.0, 90.5, 87.0, 80.0, 99.5};
double sum, avg, var;
double* p;
sum = 0.0;
for( p = data ; p != data+10 ; ++ p ) { sum += *p; }
avg = sum / 10;
var = 0.0;
for( p = data ; p != data+10 ; ++ p ) { var += (*p - avg) * (*p - avg); }
var /= 10;
printf( "平均=%f\n分散=%f\n", avg, var );
return 0;
}
問題文には「プログラムを画面に出力せよ」と書いてあるようだけど、
その辺はフィーリングで解釈してみました(笑)
13 :
デフォルトの名無しさん :04/06/08 06:49
保守
14 :
デフォルトの名無しさん :04/06/08 14:20
キーボードから5人分の年齢身長および体重を繰り返し構文を用いて年齢は1次元配列(age)身長と体重は2次元配列(date) に読み込み以下の二つの条件を同時に満足するもののデータ(出席番号・年齢・身長・体重)と人数を画面に表示するプログラム を作成せよ。 条件 1 身長が全員の平均値よりも高い。 2 体重が全員の平均値以下である。 と言う問題なんですが厨房のオレにはさっぱりで 数値などは自由で良いみたいなので模範解答みたいのをお願いします。 よろしくお願いします。
変数の型も自由です
(´ι _` )アッソ
17 :
デフォルトの名無しさん :04/06/08 14:47
マルチしてしまってすみません。
>>14 #define SUTADIO <stdio.h>
#include SUTADIO
#define mein main
#define mosi if
#define boid void
#define faibu 5
#define wan 1
#define tuu 2
boid mein(){
float caunto;
float age[faibu];
float date[faibu][tuu];
int tincyo_heikin;
int taijuuu_heikin;
for(caunto=0; caunto<faibu; caunto=caunto=caunto+=wan){
printf("年齢 身長 体重? ");
scanf("%f %f %f",&age[(int)(char)(int)caunto],&date[(int)(char)(int)caunto][0],&date[(int)(char)(int)caunto][1]);
}
tincyo_heikin=taijuuu_heikin=tincyo_heikin=taijuuu_heikin=0;
for(caunto=0; caunto<faibu; caunto=caunto=caunto+=wan){
taijuuu_heikin+=date[(int)(char)(int)caunto][1];
tincyo_heikin+=date[(int)(char)(int)caunto][0];
}
taijuuu_heikin=tincyo_heikin=taijuuu_heikin/faibu;
tincyo_heikin=tincyo_heikin=tincyo_heikin/faibu;
for(caunto=0; caunto<faibu; caunto=caunto=caunto+=wan){
mosi(tincyo_heikin<date[(int)(char)(int)caunto][0] && taijuuu_heikin>date[(int)(char)(int)caunto][1]){
printf("年齢%f 身長%f 体重%f\n",*&age[(int)(char)(int)caunto],*&date[(int)(char)(int)caunto][0],*&date[(int)(char)(int)caunto][1]);
}}}
よかったな心優しい人がいて
そこまでするかw
単一パーセプトロンを使ったやつなんですけど…
初期値を変えて学習を行ったときの学習回数と正答率の関係を求めよ。
但し、初期値は非常に小さな値、大きな値に変化させ、学習回数は
各初期値に対して100回とする。
学習パターンは乱数を使って生成する。
次のパターンを認識するパーセプトロンを構成せよ。
http://page.freett.com/sabotenga/c.GIF 重みの更新式:Wi(t+1)=Wi(t)+c*(Te(t)-y(t))*xi(t)
開始
|
ループ1
学習回数だけ繰り返す
|
入力と教師出力を与える
|
出力を計算
|
重みを更新
|
ループ1
|
終了
どうかよろしくお願いします。
パターン図の境界線上はどっち? こういうのがわからんから,図より式で示して欲しい。
printf関数を用いて,整数「255」を8進数,10進数整数,16進数で, 実数「255.0」を浮動小数点,指数形式で各1行ずつ,合計5行に出力するプログラムを作りなさい。 なんですが、 #include<stdio.h> void main(void) { printf("%o\n", 255); printf("%d\n", 255); printf("%x\n", 255); printf("%f\n", 255.0); printf("%e\n", 255.0); } でよろしいでしょうか?
>>22 X2≦X1+1⇒y=1
X2>X1+1⇒y=0
こんな感じでよろしいでしょうか?
遅くなりましたが
>>11 さんありがとうございました!
できたので、おkです
次スレは、ここですか?
前スレ(?)の最後のほうもパーセプトロンなわけだが
>>22 からコード書くまでの間に,飯食って,酒呑んできた。
その間に起こったことなど知らん。
すみません。
こっちには人がいないと思い前スレにも書いてしまいました…
>>28 error C2374: 'i' : 再定義されています。2 回以上初期化されています。
: 'i' の宣言を確認してください。
error C2065: 'lround' : 定義されていない識別子です。
cl.exe の実行エラー
と出るのですが、どうすればよいでしょうか?
34 :
デフォルトの名無しさん :04/06/09 10:11
問1 文字列"Osaka1Electro2Communication3University4"を "test.txt"に書き込むプログラムを作成せよ 問2 ファイル"test.txt"から文字列を読み込み並びを逆にしてファイル"sample.tet" に出力するプログラムを作成せよ。(test.texは問1のを使用すること) この2つ御願いいたします
35 :
デフォルトの名無しさん :04/06/09 10:22
三角形を表現する構造体triangleを定義して、三角形の面積を計算する関数 areaを作成しなさい。なおmain関数ではこの関数が正しく働いていることを 示すようなプログラムを書きなさい。 という問題なのですが、ど素人の自分にはどうしても分からなくて・・・ どうかよろしくお願いします。
36 :
デフォルトの名無しさん :04/06/09 11:36
* 最初に起動すると 0.gif 0.gif 0.gif 0.gif 0.gif 1.gif と表示して終了します。 次に起動すると 0.gif 0.gif 0.gif 0.gif 0.gif 2.gif と表示して終了します。
37 :
デフォルトの名無しさん :04/06/09 11:36
* 次に起動すると 0.gif 0.gif 0.gif 0.gif 0.gif 3.gif と表示して終了します。 * 10回めに起動すると 0.gif 0.gif 0.gif 0.gif 1.gif 0.gif と表示して終了するプログラムの作り方を教えろ禿
アクセスカウンターか?
#include <stdio.h> main(){ FILE *f; int count; f = fopen("data","r"); if( fscanf(f,"%d", &count) == EOF ) count=0; fclose(f); f = fopen("data", "w"); fprintf(f, "%d", ++count); fclose(f); print_count(count, 7); } print_count(int c, int i){ if( i == 0 ) return; print_count(c/10, --i); printf("%d.gif\n", c%10); }
40 :
デフォルトの名無しさん :04/06/09 13:03
セグメンテーション違反とかいうのがでてしまいます
41 :
デフォルトの名無しさん :04/06/09 13:27
できましたーーーーーーー!!!!!!!!!!!!
42 :
デフォルトの名無しさん :04/06/09 14:03
できましたーーーーーーーー
>>36-37 #include <stdio.h>
int main( void )
{
FILE *iFp;
char iStr[32] = {'\0'};
int iCount = 0;
int i;
iFp = fopen( "count.txt", "r" );
if( iFp )
{
fscanf( iFp, "%d", &iCount );
fclose( iFp );
}
iCount++;
sprintf( iStr, "%06d", iCount );
for( i=0; iStr[i]; i++ )
{
printf( "%c.gif\n", iStr[i] );
}
iFp = fopen( "count.txt", "w" );
if( iFp )
{
fprintf( iFp, "%d", iCount );
fclose( iFp );
}
return 0;
}
44 :
デフォルトの名無しさん :04/06/09 15:10
45 :
デフォルトの名無しさん :04/06/09 15:16
MFCで1次元配列の拡大処理を作成しているのですが、うまくいきません。 ・1次元で7文字7行入力。 ↓ ・表示を押すと、入力した7*7が表示ボックスに表示される。 ↓(ここまではできました) ・縦・横の倍率を指定して拡大ボタンを押す ↓ ・表示ボックスから文字列を全部取ってきて、拡大処理。 ↓ ・拡大処理結果をまた表示ボックスへ。 っていう処理なんですけど… 初心者なんでぜんぜんわからないんです;; 例>> 12345 123 12 って表示してあった場合、縦・横を2倍と入力すると、 1122334455 1122334455 112233 112233 1122 1122 ってな感じになるんですけど。。。。。。 メモリの確保も使わなくちゃいけなくて… わからなくて困ってます。。。。
>>45 藻前の言う「拡大」が、
どういう事なのか理解に苦しむ。
47 :
デフォルトの名無しさん :04/06/09 15:43
例えば 123456って打ってあって、 縦1倍横2倍に設定したら、 112233445566ってなる。
48 :
デフォルトの名無しさん :04/06/09 18:20
任意中の文字列中の特定文字列が先頭から何番目にあるかを調べるプログラム 先頭からn番目よりm個の特定文字列を取り出すプログラム 任意の文字列を入れ替えるプログラム この三つが宿題で出されてるんですが、さっぱりの状態です。 どうかどなたか教えてくれないでしょうか
問1は自力でなんとかできました。問2をお願いしますだ
グローバルスコープの変数はどこで定義すればよいのか教えて下さい。
>>48 の一つ目
int search(const char *str1, const char *str2){
int n = 0, ret;
const char *cp;
cp = str2;
while(*str1){
n++;
if( *str1 == *str2 ){
ret = n;
while(*str1 == *str2){
str1++; str2++; n++;
}
if(*str2 == '\0') return ret;
str2 = cp;
}
str1++;
}
return 0;
}
>>35 #include <stdio.h>
struct triangle
{
double x1, y1;
double x2, y2;
double x3, y3;
};
double area( const triangle& t )
{
double vx1 = t.x1 - t.x3;
double vy1 = t.y1 - t.y3;
double vx2 = t.x2 - t.x3;
double vy2 = t.y2 - t.y3;
return (vx1 * vy2 - vy1 * vx2) / 2;
}
int main()
{
triangle t;
t.x1 = 0; t.y1 = 0;
t.x2 = 1; t.y2 = 0;
t.x3 = 0; t.y3 = 1;
printf( "%f", area(t) );
return 0;
}
>>45 どの部分を作って欲しいのかわからん。
1次元で7文字7行とは、どういうデータ構造を言っているのかわからん。
表示ボックスとは何なのかわからん。
表示ボックスなるものから文字列を取り出さなければならないのなら、
そのアクセス方法もわからん。
倍率の値もやはり、どこかから取り出さなければならないのか、
それともint型等のデータで与えられているのか、わからん。
扱う文字列は全角なのか半角なのか、それともどちらでもいいのかわからん。
訂正 return fabs(vx1 * vy2 - vy1 * vx2) / 2; #include <math.h> も追加
デフォルトの名無しさん 有難うございました。
60 :
デフォルトの名無しさん :04/06/09 22:45
>>45 >>57 がいうようにようわからんから参考程度
#include <iostream>
#include <string>
using namespace std ;
int main()
{
const char org_str[] = "12345" ;//\n123\n12\n" ;
const char* end_p = &org_str[sizeof( org_str )] ;
int v = 2 ;//倍率縦
int h = 2 ;//倍率横
string new_str ;
string buf ;
for( const char* p = org_str ; p <= end_p ; ++p ){
switch( *p ){
case '\r': case '\n': case '\0':
buf += '\n' ;
for( int j = 0 ; j < v ; j++ ) new_str += buf ;
buf.clear() ;
break ;
default:
for( int j = 0 ; j < h ; j++ ) buf += *p;
}
}
cout << new_str ;
return 0;
}
void strcpy(char *a, char *b) { int i; for (i = 0; b[i] != '\0'; i++) a[i] = b[i]; } void strncpy(char *t, char *s, int n) { while (n > 0 && *s != '\0') { *t = *s; t++; s++; n--; } } ↑の2つコードの間違いを指摘し修正しろというのなんですがどこが間違ってるのでしょうか?
あと、関数名からするとCの標準ライブラリの仕様と合致してないとか?
void strcpy(char *a, char *b) { int i; for (i = 0; b[i] != '\0'; i++) a[i] = b[i]; a[i] = '\0'; }
void strcpy(char *a, char *b) { int i; for (i = 0; b[i] != '\0'; i++) { a[i] = b[i]; a[i] = '\0'; } }
________∩_∩ / ノ ヽ ( ノ⊂ ̄))) ̄⊃ /|ヽ (_ノ ._ ̄ 0'ヽ 0' / |ノ .) (_) ヽ i ( むしゃむしゃしていた。 ∋ノ | /――、__ ./(∩∩) 草なら何でもよかった。 / /| ヽ__ノ | / ./ 今は反芻している。 | ( | ( ’’’ | ( / |__ヽ.L_ヽ Lヽ_ヽ ''" ""''"" "'''''" ""''"" ''" ""''"" ''" ""''"" ''" ""''"" "'''.
>>61 下の方のはコレでいいのかな・・・・・・
void strncpy(char *t, char *s, int n)
{
while (n > 0 && *s != '\0') {
*t = *s;
t++;
s++;
n--;
}
while (n--) *t++ = '\0'; /* sの長さがnより短ければヌル・・・で埋める */
}
ヌルポ
nが負の値の時に死にますな。
>>61 間違いは
>>62 の通りだと思う。
void strncpy(char *t, char *s, int n)
{
for (;n > 0 && *s != '\0';n--)
*t++ = *s++;
*t = '\0';
}
コンパイラは通してないけど、多分大丈夫。
>>70 おいらへのレスかな?
>while (n--) *t++ = '\0';
条件式って「真:0以外、偽:0」で評価されるから、nが0になったら抜けるから負にならないでしょ?
>>72 関数の引数に指定されたnが最初から負の値の場合だと思われ。
とはいえそこまで考える必要があるのかどうか。
>>74 nをint型にして条件式でn > 0としてるから考える必要ありそうだね。
いや、どのみち領域外の値を指定したらダメなのは同じだから、呼び出し側の責任かなあ、と。
78 :
デフォルトの名無しさん :04/06/10 04:03
#include<stdio.h> void convertToUppercase(char*); int main() { char string[]="characters"; printf("変換前の文字列は:%s\n",string); convertToUppercase(string); printf("変換後の文字列は:%s\n",string); return 0; } void convertToUppercase(char*s) { while(*s!='\0'){ if(*s>='a'&&*s<='z') *s-=32; ++s; } } このプログラムを改造してアルファベットの大文字を小文字に変更するプログラムを作成してください。
79 :
ぼるじょあ ◆yBEncckFOU :04/06/10 05:55
>>78 #include <stdio.h>
#include <ctype.h>
void convertToUppercase(char*);
int main()
{
char string[]="characters";
printf("変換前の文字列は:%s\n",string);
convertToUppercase(string);
printf("変換後の文字列は:%s\n",string);
return 0;
}
void convertToUppercase(char*s)
{
for(;*s!='\0';s++)
*s=toupper(*s);
}
80 :
ぼるじょあ@79 ◆yBEncckFOU :04/06/10 05:57
(・3・)アルェー これじゃ逆だね。 #include <stdio.h> #include <ctype.h> void convertToLowercase(char*); int main() { char string[]="FUCKASSHOLE"; printf("変換前の文字列は:%s\n",string); convertToUppercase(string); printf("変換後の文字列は:%s\n",string); return 0; } void convertToLowercase(char*s) { for(;*s!='\0';s++) *s=tolower(*s); }
if(*s>='A'&&*s<='Z') *s+=32;
82 :
デフォルトの名無しさん :04/06/10 09:15
現在、Linuxを使ってプログラムを使ってプログラムを作っているのですが、 gettimeofdayを使って現在の西暦を出したいんですが、使い方がよくわかりません。 宜しく、お願いします。
83 :
デフォルトの名無しさん :04/06/10 09:48
独学者です。そして素人です。 前に3つのさいころがどうのこうのってあったので、2つのでやってみたいと思ったのですが、 全くわかりません・・・。 2つのさいころの和の平均値を求めたいのですが どのようにしたらよろしいでしょうか? 配列とかわからないので、おべんきょしたいのです。 お願い致します。
>>82-83 できれば宿題に限定していただけるとありがたいのですが。
>>82 そんなもんを使わんでも、timeとか使った方が手軽じゃないかと思いますが。
>>83 おべんきょしたいなら、何か入門書を一冊片づけるのが早いかと思いますが。
>>82 現在の西暦を出すだけならtime()とlocaltime()でできるだろ。
#文字列の加工はstrftime()でいいし。
>84 そですか・・・ 板汚しすみません。 お勧めの一冊はございますか? 板違いsage
87 :
デフォルトの名無しさん :04/06/10 11:16
88 :
デフォルトの名無しさん :04/06/10 12:28
C++の関数の問題ですがお願いします。 1. 要素数がnであるint型配列xから、値がkである要素の添え字を返却する関数 int search (int x[] ,int n, int k) {/*........*/}を作成せよ。 値がkである要素が存在しなければ-1を返却するものとし、そのような要素が複数 の場合は先頭側の最も小さい添え字を返却すること。 2. 異なるn個の整数からr個の整数を取り出す組み合わせの数nCrを求める関数。 int combination(int n, int r){/*......*/} を作成せよ。なお、nCrは以下のように定義する。 nCr= n-1 C r-1 + n-1 C r (ただしnC0= nCn = 1, nC1 = n) 上の式は見にくいかもしれませんが、数学のcombinationのことです。
2番やってみた。Cで。 #include <stdio.h> #include <stdlib.h> int ft(int n) { if (n > 0) return (n * ft(n - 1)); else return (1); } int ncr(int n, int r) { return (ft(n) / (ft(r) * ft(n - r))); } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, "usage %s n r\n", argv[0]); return (0); } printf("%d\n", ncr(atoi(argv[1]), atoi(argv[2]))); return (0); }
90 :
デフォルトの名無しさん :04/06/10 13:16
c++でないとだめなんですよね。すいません。
91 :
デフォルトの名無しさん :04/06/10 13:17
>>90 #include <cstdio>
#include <cstdlib>
using namespace std;
int ft(int n)
{
if (n > 0)
return n * ft(n - 1);
else
return 1;
}
int ncr(int n, int r)
{
return ft(n) / (ft(r) * ft(n - r));
}
int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, "usage %s n r\n", argv[0]);
return 0;
}
printf("%d\n", ncr(atoi(argv[1]), atoi(argv[2])));
return 0;
}
1番を無理矢理再帰で求めようとしたけど面倒だから止めた
>>88 1.
int search(int x[],int n,int k) {
for(int i = 0;i < n; i++) if(x[i] == k) return i;
return -1;
}
ってかC++なら参照つかうとか、、、
しつこくてすみません。 気になって2つのさいころの和と確率分布、期待値を求めてみたのですが、 ミスがありまして・・・ 手解きを受けたいのですが こちらでもよろしいでしょうか?
うまく動かなかったら、その原因のことをミスというのですよ
#include <stdio.h> int main(void){ int a, b, c, dice[6][6]; float i[12], j[13], k[13]; for(c = 1; c <= 11; c++) i[c] = 0.0; for(a = 0; a <= 5; a++) {for(b = 0; b <= 5; b++) {dice[a][b] = a + b + 2; for(c = 1; c <= 11; c++) {if(dice[a][b] == c + 1) i[c]++; } } } for(c = 1; c <= 11; c++) printf("%2dの時の確率は%f\n", c + 1, i[c] / 36); printf("んで\n"); for(c = 1; c <= 11; c++) { j[c] = i[c+1]*c / 36; k[1] = j[1]; k[c + 1] = k[c] + j[c + 1]; } printf("期待値は%f\n", k[11]); return 0; }
で打ってみました。 よろしくお願いします。
99 :
デフォルトの名無しさん :04/06/10 14:01
スレ違いかもしれんが、誰か俺のかわりにアセンブリ言語のプログラム 作ってもらえないか? またはそういう掲示板を教えてくれ 頼む
101 :
きょんちゃん :04/06/10 14:10
すいません この問題お願いします。アルファベット以外の文字を入れたときには へんかんしないような、プログラムです。判断するプログラムCASLください
102 :
きょんちゃん :04/06/10 14:11
すいません この問題お願いします。アルファベット以外の文字を入れたときには へんかんしないような、プログラムです。判断するプログラムCASLください
103 :
デフォルトの名無しさん :04/06/10 14:12
104 :
きょんちゃん :04/06/10 14:14
ごめんなさい!はじめて 2ちゃんねるにかきこんでいます!
#include <stdio.h> int main(int args, char **argc) { int a, b, c; int i[13], s; for(c = 2; c <= 12; c++) i[c] = 0; for(a = 1; a <= 6; a++) { for(b = 1; b <= 6; b++) { i[a + b]++; } } for(c = 2; c <= 12; c++) printf("%2dの時の確率は%1.5f\n", c, ((float)i[c])/36.0); printf("んで\n"); s = 0; for(c = 2; c <= 12; c++) s += i[c]*c; printf("期待値は%2.5f\n", ((float)s)/36.0); return 0; } 冗長だなぁ。と思ってすこし縮めた。 添え字だなんだで混乱するときは、添え字のほうは後回し。目のほうを表すよう優先した。 プログラムは目的があってつくってるんだから、 変数の値も目的に合わせたほうがいいんじゃないかな、と俺は思ふ。 メモリの節約とか「添え字 0, 1 が使われないのは気持悪い」とかは、あとから考えな。
106 :
デフォルトの名無しさん :04/06/10 14:22
>>105 floatにキャストしても、36.0じゃ結局doubleにされるぞ。
あ、素人だってばれた
>105 ありがとうございます。 ちょっとまだ私には高度すぎるようですので、一から出直してまいります。 ついでで申し訳ないのですが、何故私のでは期待値がNaNと出てしまうのでしょうか?
俺のではとんでもなくでかい値が出たよ まぁ単純に計算方法が間違ってんでしょう j のうち、初期化されてない部分を足し算してない? それとか なんでこんなまわりくどいことしてるか分からんから これ以上レクチャーしにくいが
ありがとうございました。
111 :
デフォルトの名無しさん :04/06/10 14:49
ほぉ 分かりました。ありがとうございました。 スレ汚し失礼いたしました
遅れましたが、答えてくださった方ありがとうございますた
以下は、標準入力から入力した文字列を逆順にして表示するプログラムの一部である. 関数 reverse の定義を追加し,プログラムを完成させよ. なお,入力される文字列の長さ(文字数)は任意であるが, 99文字以内であることが保証されているものとする. /* reverse.c: reverse a given string */ #include <stdio.h> #include <string.h> void reverse(char *);/* プロトタイプ宣言 */ int main(void) { char str[100]; scanf("%s", str); reverse(str); printf("%s\n", str); return (0); } どうかお願いします。
114 :
デフォルトの名無しさん :04/06/10 15:59
電卓のシュミレーターをC言語で希望 ・扱う数値は整数値でよい(実数ならもっといい) ・数値と演算子の区切りは改行(リターンキー)でよい ・対話的に使えるものとするー終了は数値の代わりに一文字 の入力をすればよい ・演算は加減乗除のみ(ほかのがあってもよい) ・演算子の優先順位は考慮しなくてもよい ・括弧は扱えなくてもよい ・メモリ機能は扱えなくてよい
文字配列nameにキー入力で"Hello"の文字列を代入し、その後、一文字ずつ取り出して 表示させよ。表示には、putcharを用い、文字列の長さは事前にわからないものとし、プログラムの中で調べること。 (先頭1文字ずつ表示し、null文字が見つかったら表示を中止する) お助けくださいorz/
117 :
デフォルトの名無しさん :04/06/10 16:38
>>113 #include <stdio.h>
#include <string.h>
void reverse(char *);/* プロトタイプ宣言 */
int main(void)
{
char str[100];
scanf("%100s", str);
reverse(str);
printf("%s\n", str);
return 0;
}
void reverse(char *s){
int len, t, i;
len = strlen(s) - 1;
for (i = 0; i < len / 2; i++){
t = s[i]; s[i] = s[len - i]; s[len - i] = t;
}
}
119 :
デフォルトの名無しさん :04/06/10 16:50
>>115 #include <stdio.h>
#include <string.h>
#define N 16
int main(void){
int i, ch;
char name[N];
scanf("%16s", name); /*fgets(buf, sizeof buf, stdin)*/
for (i = 0; name[i] != '\0' && i < N;i++) putchar(name[i]);
return 0;
}
多分scanfを使うんだろうけど コメントのところにミスがあったので一応修正。 buf→name あとfgetsの場合は改行も読み込むので、0に変えるなどをするべき。
%100s→%99sに訂正。
>>119-120 ありがとうございました。
言われてみたので問題をよく見ると本当に書き損ねてました・・・スイマセン
Cで1次元配列の5つの要素にランダムに5つの数字を格納するには、 どうしたら良いでしょうか?
>>123 そのランダムにいれる数字はどんな値にしたいの?
全部ばらばらなのか
1〜5、0〜4、または適当な5つの決められた数字をかぶりのないように入れたいのか
>>124 ランダムつったらランダムなんだよボケー!!
>>125 配列を持ち出してきたからシャッフルのことも考えたんだろ、
つねに質問者が問題に沿った書き方をするとは限らないから
一応聞いてるだけだろ、氏ね。
1〜5の数字を全部つかいきる感じです。 かぶりなしってことです
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 5 int main(void){ int s[N], change_index, temp, i; srand((unsigned)time(NULL)); for (i = 0; i < N; i++) s[i] = i + 1; for (i = 0; i < N; i++){ change_index = (double)rand() / (RAND_MAX + 1) * N; temp = s[change_index]; s[change_index] = s[i]; s[i] = temp; } for (i = 0; i < N; i++){ printf("s[%d]=%d\n",i , s[i]); } return 0; } //randのとこは解らなければ change_index = rand() % 5;で
最後のコメント一応訂正。 change_index = rand() % N;
>>130 RAND_MAX の値によってはオーバーフローするから、
(RAND_MAX + 1) の部分は ((double)RAND_MAX + 1) にしないといけない。
>>130 ありがとうございます。
defineをつかわないで直接5でも問題ないですか?
>>132 >(RAND_MAX + 1) の部分は ((double)RAND_MAX + 1) にしないといけない
実は(RAND_MAX + 1)が定数項(コンパイル時にケテーイ)だから,いらない罠。
まぁ,教える分にはエエけどね。
>>135 コンパイル時にオーバーフローするのがわかるからと言って付けなくてもよい理由にはなりませんが?
137 :
デフォルトの名無しさん :04/06/10 21:30
学校で課題が出たのですが考えても分かりませんでした・・。教えてください。 課題; 漸化式a=0, a1=1, an=an-1+an-2 (n≧2) a1の1やanのn、n-1,n-2は下付き文字ですが変換できませんでした。 によって定義される数列をフィボナッチ数列と言う。サイズ20の整数型配列fib[] を宣言し、fib[0],fib[1],・・・,fib[19]にフィボナッチ数a0,a1,・・・,a19を求めよ。 また、この値をprintf()関数を使って出力せよ。
途中まで手をつけたものを書いときます。(間違ってるかも) #include <stdio.h> int main(void) { int i; int fib[20]; for(i=0;i<20;i++) fib[i]= for(i=0;i<20;i++) printf("fib[%d]=%d\n",i,fib[i]); return(0); }
>>137 #include <stdio.h>
int main(void){
int fib[20], i;
fib[0] = 0; fib[1] = 1;
for (i = 2; i < 20; i++){
fib[i] = fib[i-1] + fib[i-2];
}
for (i = 0; i <20; i++){
printf("fib[%d]=%d\n", i, fib[i]);
}
return 0;
}
>>139 ありがとうございます!早速やってみます!
出来ました(T T)
>>139 さん有難う御座いました!
ログを読んでいたら間違い(正確には、指定された通りの解凍ではない解)を見つけたんで揚げ足取りをしてみる。
>>88 ,89,90
#include <iostream>
using namespace std;
int combination(int n, int r)
{
if(n < r) return -1; // エラー
if(n == r || r == 0) return 1;
if(r == 1) return n; // 本当は不必要
return combination(n - 1, r - 1) + combination(n - 1, r);
}
int main(void)
{
int n = 10, r = 2;
cout << n << "C" << r << " = " << combination(n, r) << endl;
return 0;
}
あとで
>>94 ,96,105もやってみる。バグったままだよね?
>>137 あえて嫌がらせでこんなのも
#include <stdio.h>
int fib(int n);
int main(void)
{
int a,i;
printf("何項目まで求めるか入力してください\n");
scanf("%d",&a);
for(i=1;i<=a;i++){
printf("%d\n",fib(i));
}
return 0;
}
int fib(int n)
{
if(n==1||n==2){
return 1;
}else{
return fib(n-1)+fib(n-2);
}
}
>137 #include<cstdio> using namespace std; template<int N> struct Fib { enum { n = Fib<N-1>::n + Fib<N-2>::n }; }; template<> struct Fib<0>{ enum { n = 0 }; }; template<> struct Fib<1>{ enum { n = 1 }; }; int main(){ int i; int fib[] = { Fib<0>::n, Fib<1>::n, Fib<2>::n, Fib<3>::n, Fib<4>::n, Fib<5>::n, Fib<6>::n, Fib<7>::n, Fib<8>::n, Fib<9>::n, Fib<10>::n, Fib<11>::n, Fib<12>::n, Fib<13>::n, Fib<14>::n, Fib<15>::n, Fib<16>::n, Fib<17>::n, Fib<18>::n, Fib<19>::n }; for( i=0; i < 20; ++i ) printf( "fib[%d]=%d\n", i, fib[i] ); }
>>105 は、パッと見、エラーもなくて、コンパイルしても大丈夫だったんでそのまま。
あとは
>>114 のマルチか。暇ならやろうかな。
>>144-145 有難う御座います。でもあまり難しいの提出したら、先生にC言語に詳しい奴だと
勘違いされそうなので(^^;)
148 :
デフォルトの名無しさん :04/06/10 22:10
Cです。よろしくお願いします。 8進数y=037427を右側に3ビット分シフトし、捨てられたビットを8進数x=0の左側から順につめて、 y=03742,x=0160000となるようにしなさい。
>>148 仮定:xは16bit
#include<stdio.h>
void hoge( unsigned short *y, unsigned short *x ) {
unsigned long z = ( *y<<16 );
z >>= 3;
*y = (z
>>16 );
*x = z&0xffff;
}
int main(){
unsigned short x, y=037427;
hoge( &y, &x );
printf( "y=0%o, x=0%o\n", y, x );
return 0;
}
>>83 ==
>>97 >j[c] = i[c + 1] * c / 36.;
>k[1] = j[1];
>k[c + 1] = k[c] + j[c + 1];
この部分が問題。
j[1]代入→j[2]参照→j[2]代入→j[3]参照→…
なんて繰り返し,つまり値を代入する前に参照しているのが悪い。
プログラム全体に無駄な操作が多いのが間違える原因だろうな。
>for(c = 1; c <= 11; c++)
>{if(dice[a][b] == c + 1)
>i[c]++;
>}
↓
i[dice[a][b]-1]++;
さらにその上の
dice[a][b] = a + b + 2;
と統合すれば
>dice[a][b] = a + b + 2;
>for(c = 1; c <= 11; c++)
>{if(dice[a][b] == c + 1)
>i[c]++;
>}
↓
i[a+b+1]++;
>>148 #include <stdio.h>
void shift_right( unsigned short* y, unsigned short* x )
{
unsigned char bit = *y & 1;
*x >>= 1;
*x |= *y << 15;
*y >>= 1;
}
int main()
{
unsigned short x = 0;
unsigned short y = 037427;
int i;
for( i = 0 ; i <= 3 ; i ++ )
{
printf( "y=%o\tx=%o\n", y, x );
shift_right( &y, &x );
}
return 0;
}
153 :
デフォルトの名無しさん :04/06/10 22:49
@ マイナスの数が入力されるまでの入力データを使って平均値を求め、 個々のデータと平均値の差の二乗和の平均値を表示するプログラム(ただしデータは一回だけしか入力できない) 例 入力データが1,2,4,1なら、平均値は2なので平均値との差の二乗和は(-1)^2+0+2^2+(-1)^2=6となる。 A rand()/32768.0としてn個の乱数を作成し、その度数分布をつくるプログラム ただし、度数分布のクラスの数は10とする ぜんぜんわかりません。c言語です。よろしくおねがいします。
>>153 @
#include <stdio.h>
#define N 10
int main()
{
float data[N], sum = 0.0, avg;
float nvar = 0.0;
int num = 0, i;
while(1) {
printf( "%d番目の値は?", num+1 );
scanf( "%f", &data[num] );
if ( data[num] < 0.0 )
break;
sum += data[num];
num ++;
if ( num == N ) {
printf( "バッファが足りないので、入力を打ち切りますorz\n" );
break;
}
}
avg = sum/num;
for( i = 0 ; i < num ; i ++ ) nvar += (data[i] - avg) * (data[i] - avg);
printf( "データ数=%d\n", num );
printf( "平均値=%f\n", avg );
printf( "平均値との差の二乗和=%f\n", nvar );
return 0;
}
>>153 @ 入力データx_i(i=1..n)の平均をX、(x_n)^2の平均をXと書くと
(1/n)Σ(x_i-X)^2 = X-X^2
と変形できることを利用する。高校数学の分散を思い出せ。
#include <stdio.h>
int main(void)
{
int data, i;
double avg, avg2;
avg = avg2 = 0.0;
for(i = 0; ; i++) {
scanf("%d", &data);
if(data < 0) break;
avg += data;
avg2 += data * data;
}
avg /= i;
avg2 /= i;
printf("平均は%f\n分散は%f\n", avg, avg2 - avg * avg);
return 0;
}
157 :
デフォルトの名無しさん :04/06/10 23:24
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void){ int n, i, j, a[10] = {0,}; double t; srand((unsigned)time(NULL)); printf("n >>"); scanf("%d", &n); for (i = 0; i < n; i++){ t = rand() / 32768.0; for (j = 0; j < 10; j++){ if (t < 0.1 * (j + 1)){ a[j]++; break; } } } for (i = 0; i < 10; i++){ printf("\n%.1f〜%.1f", i*0.1, (i+1)*0.1); for (j = 0; j < a[i]; j++){ putchar('*'); } } return 0; }
158 :
デフォルトの名無しさん :04/06/10 23:30
文字列を置換する関数を作りたいのですが
>158 日記は自分のメモ帳にでも書いておけ。
そんなもんわざわざ作るな、ぼけ
すみません。 作り方をおしえてください。
少し前にでていたフィボナッチ数列ですが、どうか教えて下さい。 1.フィボナッチ数列の1項から10項までを表示するプログラムを作りなさい。 フィボナッチ数列は第1,2項が共に1で、第n項はn-2項とn-1項で求める。 2.整数nを入力し、1項からn項までのフィボナッチ数列を表示するプログラム を作りなさい。また1行に表示するのは5項までとする。 学習範囲から言ってcontinueかbreakかreturnを使って作るのだと思うのですが よく分かりません。ちなみにまだ関数までいっていません(void mainのみ)。 どなたかよろしくお願いします。
どうもありがとうございます!!
>>162 (1)一時的な変数を確保
(2)パターンに一致するものを検索する
(3)見つかったら最終位置から一致する以前の文字列+置換後の文字列を一時変数に追加
(4)終端についていなければ(1)へ
(5)ぬるp・・・NULLを入れる
(6)元の変数に代入する
意図的に無駄なことをしています。自分で無駄を省きましょう
>>163 無理矢理break;を使って作った。
#include <stdio.h>
int main(void)
{
int a, b, c, i;
printf("F[ 1] = 1\nF[ 2] = 1\n");
b = 1;
c = 1;
for(i = 3; ; i++) {
if(i > 10) break;
a = b;
b = c;
c = a + b;
printf("F[%2d] = %d\n", i, c);
}
return 0;
}
2は面倒なので略。もしこれを改造するつもりなら、nが1の時の表示に注意。
>>163 breakもcontinueも使って無いけど。
#include <stdio.h>
#include <stdlib.h>
int main(){
int n,v1,v2,tmp,col;
printf(">"); scanf("%d",&n);
if(n<1){printf("error.\n"); exit(0);}
v1=0; v2=1; col=0;
while(n>0){
printf("%d ",v2);
tmp=v1; v1=v2; v2+=tmp; n--; col++;
if(col>4){printf("\n"); col=0;}
}
return 0;
}
>>166 >>167 さん
早速の御回答ありがとうございます。
まだ#include<stdio.h> voidmain(void)から始まる書き方しかやっていなくて、
int main()などは習っていないのです。でも、早速参考にさせて頂きます。
夜中にどうもありがとうございました。非常に助かりました。
169 :
デフォルトの名無しさん :04/06/11 12:17
{問 1} int a[8]; のように配列の宣言をしたとき、 配列 a はコンピュータのメモリにどのように割り当てられるか説明しなさい。 {問 2} 文字列を記憶するには char型配列を使用する。 char s[] = "Practice"; としたとき、配列 s の各要素はどのような値(文字)になっているか説明しなさい。 お願いします
>>169 問1 問題を出した人間に文句を言う
問2 s[0] = 'P',s[1] = 'r' (中略) s[7] = 'e' , s[8] = '\0'
>>170 お早い回答ありがとうございます。
問1 そうですね。変な問題ばっか出しやがって。
問2 やっぱそうか
これを作ってください↓ 長いので2回に分けます。 サフィックス記法(逆ポーラント記法)は数式の記法の1つで,一般の記法との対応は下表の通りである.ただし,ここでは簡単のため,数式には加算(+)と乗算(*)しか含まれていないものとする. 一般記法 サフィックス記法 (数式A)+(数式B) (Aのサフィックス記法)(Bのサフィックス記法)+ (数式A)*(数式B) (Aのサフィックス記法)(Bのサフィックス記法)* 例えば,以下のような変換ができる. 一般記法 サフィックス記法 a+b ab+ a*b ab* a+b*c abc*+ a*b+c ab*c+ (a+b)*c ab+c* (a+b)*(c+d) ab+cd+*
続き↓ サフィックス記法が求まると,カッコのある任意の数式を順序よく計算できる.つまり,読み込んだ文字に従って次のようにスタックに入れながら計算することで値を求めることができる. 文字 操作 数(変数) スタックにpush 演算子(+,*) スタックから2つpopしてその演算を行い,結果をpush 次の数式をサフィックス記法に直せ.(解答は以下で作成するプログラム先頭部分にコメント文として含めよ) a*(b+c) ((a+b*c)+d)*e ((a+b)*(c+d))+e*f サフィックス記法により記述された数式(変数の値は自然数1桁とする.例えばa=2,b=3,c=4,d=5,e=6,f=7として, 「234+*」とせよ)をキーボードから入力し,スタックを用いて数式の値を計算するプログラムsuffix.cを作成せよ. 動作確認は上記の3式について数値を入れて行い,答が一致することを確かめよ(例えば通常の数式「2*(3+4)」の値と サフィックス記法の式「234+*」をプログラムで計算させた値が一致することを確認せよ).
ダルー
お願いしますm(__)m
C言語なんですが 空白で区切って入力した1行(正整数並びの文字列)を項に分解して i番目の項を配列X[i]に累計しながら格納していく(Xの要素数は10) 要素数より多い入力は11項目以降を棄却 入力の終了は改行のみの入力で判定 入力にはfgets、整数並びの文字列の項の分解にはisspace、isdigitで判定 して行い、文字列の数値化にはatoi()を使えというのなんですが ご教授お願いします
>>177 わざわざatoi使ってるくせに,平気でスタック破壊する。
そんなところがステキ♪
ダルー え?どこ?
二回に分けます 練習問題 /* xの階乗を計算する */ #include <stdio.h> float kaijo( int ); /* 関数のプロトタイプ宣言 */ main() { int x; printf("x = "); scanf("%d", &x); printf("%d! = %.0f\n", x,kaijo(x)); } /* 階乗を計算する関数 */ float kaijo( int n ) { int i; float v = 1.0; for(i = 1; i <= n; i++){ v = v * i ; } return v ; }
続き 課題 sin x は、マクローリン展開によって次のように表せられる。 x^3 x^5 x^(2n+1) sinx = x - --- + --- -・・・+(-1)^n------- +・・・ 3! 5! (2n+1)! ただし、コンピュータでの計算では第 n 項までとする。 この式と練習問題の kaijo 関数を組み合わせて sin x の値を計算する関数 float mysin( float x ) を作成せよ。 このとき、項の数 n はプログラム内で適当な値を代入する。 また、キーボードから実数値 x を入力して、 mysin(x) の値と数学関数 sin(x) の値を表示する処理を main 関数の中に作成せよ。 練習問題をいじって課題を完成させたいです。結構悩んでます。 お願いします
すいません 修正です x^3 x^5 x^(2n+1) sinx = x - --- + --- -・・・+(-1)^n------- +・・・ 3! 5! (2n+1)!
なんかうまく表示できません \[\sin x = x-\frac{x^3}{3!}+\frac{x^5}{5!}-\cdots+(-1)^n\frac{x^{2n+1}}{(2n+1)!}+\cdots\] Tex用の展開式 何度もすみません
16進DUMPを読み込みJIS コードを用いた文字を出力するプログラムを作成せよ 入力例:[dump.txt] B7 82 B5 8D 9E 82 DD 2C 0D 0A 25 83 52 83 7D 83 93 83 68 82 DC 82 BD 82 CD 83 74 83 40 83 43 83 8B 96 BC 82 AA 88 E1 82 A2 82 DC 82 B7 2E 0D 0A 出力例:[binary.txt] キし込み,..%コマン ドまたはファイル 名が違います...
185 :
デフォルトの名無しさん :04/06/11 17:23
>>180 float mysin(float x){
int i, n = 2; /*nは適当*/
float t, sum = 0.0;
for (i = 0; i <= n; i++){
t = pow(x, 2*i+1) / kaijo(2*i+1);
if (i%2 == 1) t *= -1;
sum += t;
}
return sum;
}
>>185 なんかわかりません。ちなみにここまでできてます。
#include <stdio.h>
#include <math.h>
float kaijo( int );
float mysin(floatx);
main()
{
int x;
printf("x = ");
scanf("%d", &x);
printf("%d ")
printf("%d ")
printf("%d! = %.0f\n", x,kaijo(x));
float mysin (floatx)
{
n = 5;
v = 0
for(i=0 ,i<=n i++){
v = v +(-1)*
}
x =sin(i)
}
return x
}
float kaijo( int n ) { int i; float v = 1.0; for(i = 1; i <= n; i++){ v = v * i ; } return v ; }
188 :
デフォルトの名無しさん :04/06/11 18:02
なんかわかりませんじゃねーよ。
>>188 すいません.
プログラムの意味がわからないってことです。
185のプログラムはどっかいれるんでしょうか?
>>184 すいません。
元の16進ダンプはJISコードの値範囲を逸脱していますが,何か?
すいません。 生きててすいません。
192 :
デフォルトの名無しさん :04/06/11 19:08
すいません。 すみませんというべきでした。
>>176 (・3・)アルェー 出題者の言語能力は相当低いですYO!
日本語の出来ていない人と付き合うのは大変ですね。同情するYO!
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
char buf[1024];
int x [10];
memset(x,sizeof(x),0);
while( fgets(buf,sizeof(buf),stdin) ){
char *p = buf;
char *start;
int i;
if( buf[0] = '\n' ) break;
if( buf[strlen(buf)-1] != '\n' ) exit(EXIT_FAILURE);
for(i=0;i<10;++i){ start = p; while(isdigit(*p++)); *p++='\0';
x[i]+=atoi(start); while(isspace(*p++));}
}
}
あ,マズー(・3・) memset(x,sizeof(x),0); ↓ memset(x,0,sizeof(x));
195 :
デフォルトの名無しさん :04/06/11 20:32
>>193 int x [10]={0};で十分だろ。
>177 ありがとうございます。 今後ともよろしくお願いしますm(__)m
198 :
最小値をとる配列要素の番号わかりません :04/06/11 22:26
平均= 60.46 標準偏差= 22.80 最小値= 5 最小値をとる配列要素の番号= 50 最大値= 99 最大値をとる配列要素の番号= 50 0- 9 |** 2 10-19 |* 1 20-29 |*** 3 30-39 |** 2 40-49 |****** 6 50-59 |********** 10 60-69 |******** 8 70-79 |******* 7 80-89 |****** 6 90-99 |***** 5 続行するには何かキーを押してください .
#include <stdio.h> #define NUM 50 int a[NUM] = { 99,45,89,62,61,93,55,78,56,26, 81,49,99,77,38,73,54,20,62,59, 63,59,63,93,74,37,71,49,48,56, 5,47,82,83,85,17,74,56,69,50, 51,82,24,99,66,65,73,53,48, 5}; void main(void) { double average , std_v ; int i , j , k , histo[10] ={0} , min , max , s , ss ,min_suffix = 0,max_suffix = 0; for (i=0; i<NUM; i++) { s+=a[i]; ss+=a[i]*a[i]; histo[a[i]/10]++; if(a[i]<min) min=a[i] ; if(a[i]>max) max=a[i] ; }
200 :
199に ◆3VUXqvbfSY :04/06/11 22:30
min_suffix = 0; max_suffix = 0; for (j=0; j<NUM; j++) { if (a[j] < a[min_suffix]) min_suffix = j; if (a[j] > a[max_suffix]) max_suffix = j; } average=(double)s/NUM; std_v=sqrt((double)ss/NUM - average*average); printf("平均=%6.2f\n",average); printf("標準偏差=%6.2f\n\n",std_v); printf("最小値=%3d\n",min); printf("最小値をとる配列要素の番号=%13d\n\n",j); printf("最大値=%3d\n",max); printf("最大値をとる配列要素の番号=%13d\n\n",j); for (k=0; k<10; k++) { printf("%2d-%2d |", k*10, k*10+9); for (i=1; i<=histo[k]; i++) printf("*"); printf(" %d\n", histo[k]); } } どこがまちがってるのか教えてください
201 :
198〜200 :04/06/11 22:33
#include<math.h>が抜けてました 最小値をとる配列要素の番号 最大値をとる配列要素の番号 がなぜか50 になってしまいます。 教えてください
電卓のシュミレーターをC言語 ・扱う数値は整数値でよい(実数ならもっといい) ・数値と演算子の区切りは改行(リターンキー)でよい ・対話的に使えるものとするー終了は数値の代わりに一文字 の入力をすればよい ・演算は加減乗除のみ(ほかのがあってもよい) ・演算子の優先順位は考慮しなくてもよい ・括弧は扱えなくてもよい ・メモリ機能は扱えなくてよい マルチで非常にすいませんでした。 本当に困ってます。助けてーm(><)m
>>201 釣り?
>printf("最小値をとる配列要素の番号=%13d\n\n",j);
jを表示したら、そりゃぁ50だろうよ。
205 :
デフォルトの名無しさん :04/06/11 22:46
min と max をmin=a[0] , max=a[0]かなんかで初期化して printf("最小値をとる配列要素の番号=%13d\n\n",min_suffix); printf("最大値=%3d\n",max); printf("最大値をとる配列要素の番号=%13d\n\n",max_suffix);
printf("最小値=%3d\n",min); printf("最小値をとる配列要素の番号=%13d\n\n",min_suffix); printf("最大値=%3d\n",max); printf("最大値をとる配列要素の番号=%13d\n\n",max_suffix); でつね
207 :
198〜200 :04/06/11 22:47
min_suffix = 0; max_suffix = 0; for (j=0; j<NUM; j++) { if (a[j] < a[min_suffix]) min_suffix = j; if (a[j] > a[max_suffix]) max_suffix = j; } で最小値、最大値を与える配列要素の番号をだそうと おもったのですが…
209 :
デフォルトの名無しさん :04/06/11 22:51
sとかssも初期化しとかないとだめだろ。 たまたま0で初期化されたかもしれんが。
210 :
デフォルトの名無しさん :04/06/11 22:54
プリプロセッサをツールとして使用してるんだけど、 はき出されるソース中に、ソースの名前と、行番号を残したい で、こんなマクロつくったんだけど、ダメですた。 #define __LLL // __FILE__ __LINE__ こんな風になってほしんだけど // "test.c" 10 マクロで指定した"//"がコメントと認識されちまって、その後に続く、 "__FILE__ __LINE__"もコメントとして認識されちゃう。 何か回避方法ないすか? とりあえず、後処理で、sed通すとかは無しの方向で
211 :
198〜200 :04/06/11 22:59
>209 s=0; ss=0;忘れてました >204〜208ありがとうございます 最小値をとる配列要素の番号が複数になる時どうすればいいんですか?
198はJavaスレに誤爆しておいて放置するのは、いくない。
すみませんm(__)m
>>214 bcc と g++ でならコンパイルとおるし、実行も出来る。
ファイル名が全角文字なのがいけないんじゃないか?
>>216 全角文字を入れずにやってみましたがだめでした。
visualC++では無理なのか。。。。
VC6も7.1もビルドできるけどなぁ。 そういや漏れも昔この内部エラーとかいうの出た。 どうやったか忘れたけど、とりあえずリビルドしてみた。 ビルドフォルダ削除してみてみ。
>>218 ビルドフォルダってのはdebugって名前のフォルダですかね。
削除してビルドしたりリビルドしたりクリーンを実行したりしましたがだめでした。。。
何がいけないというのですか。。。。visualC++先生。。。
>>214 おれもよく見たよ。VCに処理できないようなコードを書くと死んでわびてくれる。
んで、こういうときは仕方がないので少しづつコメントアウトしながら問題の記述を特定するしかない。
というわけでがんばれ。
なお、おれの勘ではコンストラクタの引数にデフォルト値があるのと
operator+の片方がintになってるののとで、
関数オーバーロードの解決に失敗しているくさい。
試しにコンストラクタの引数にデフォルト与えるのやめてみたら
221 :
デフォルトの名無しさん :04/06/12 02:37
生徒の名前、テストの点数が順番にスペースを空けながら並べてあるファイルを 読み込み、構造体オブジェクトを動的な記憶域を確保し、そこに格納する。 (1)データを読み込んだ記憶域から、スタックにデータをプッシュしたり、ポップ したりする。 (2)データを読み込んだ記憶域から、キューにデータをエンキューしたり、デキュー したりする。 2つもあって申し訳ないですが、どうかよろしくお願いいたします。
すみません。書き忘れました。 言語はC言語です。あと、ファイルはtxtファイルです。 よろしくお願いいたします。
>>221 キューやスタックも作れってこと?
それとも過去の課題で作ったのを使ったりするのかな…
レスありがとうございます。 キューやスタックは、数字一つをプッシュしたりするのならあるのですが、 今回は、構造体になってたり文字が含まれていたりしてるので、よろしけ れば、キューやスタックもお作り願いたいのですが。。。
そこで、STL ですよ。
227 :
デフォルトの名無しさん :04/06/12 06:49
すいません わからないので こーどを かいてください おねがいします
>>221 >お作り願いたいのですが。。。
キミの場合,プログラムは人に任せて,
まずは,日本語の勉強をしたほうがよさそうだね。
>>225 そんなキューやスタックでも書いて、流用して貰えば
人に頼んだことがばれにくくなって( ゚Д゚)ウマー
>>210 #define __LLL /##/ __FILE__ __LINE__
これはどうだ
233 :
デフォルトの名無しさん :04/06/12 11:50
名前(文字型配列)、年齢(整数型)、体重(実数型)のデータをメンバにもつ構造体aにデータをキー入力し、その後aにはいっているデータを同じ型を持つ構造体bに代入し最後にaとbの両方のデータを出力せよ
234 :
デフォルトの名無しさん :04/06/12 12:12
>>233 #include <stdio.h>
int main()
{
struct{char n[4000]; int a; double w;} a,b;
printf("名前 > ");
fgets(a.n,sizeof a.n,stdin);
printf("年齢 > ");
scanf("%d",&a.a);
printf("体重 > ");
scanf("%lf",&a.w);
b=a;
printf("%s%s\n%d\n%d\n\n%f\n%f\n",a.n,b.n,a.a,b.a,a.w,b.w);
return 0;
}
>>232 本当にありがとうございました!!助かりました!!
あれ?すんなりコンパイルできちゃったの?? クヤチー!!
>>203 #include <stdio.h>
int main(){char a[99],b[99],*e="+-*/",*f;int s=0,c;float m=0,n;while(1){printf(
"%f :",m);fgets(a,99,stdin)?0:exit(0);if(sscanf(a,"%s",b)>0){if(sscanf(b,"%f",
&n)>0){m=s?c?c-1?c-2?m/n:m*n:m-n:m+n:n;s=0;continue;}else{if(!b[1] && (f=strchr
(e,*b))){s=1;c=f-e;continue;}}}*a-'q'?0:exit(0);puts("Input errror (type 'q' t"
"o exit)");}}
使用例
0.000000 :1
1.000000 :25
25.000000 :/
25.000000 :9
2.777778 :+
2.777778 :3
5.777778 :-
5.777778 :7
-1.222222 :*
-1.222222 :5
-6.111112 :/5
Input errror (type 'q' to exit)
-6.111112 :
Input errror (type 'q' to exit)
-6.111112 :q
238 :
すみませんが :04/06/12 15:16
ジョイパッドを使えるようにしろという課題をだされたのですが ダイレクトXを使えば自分でもできますが、C++のAPIを使って やれとのことでよくわかりません。教えてもらえますか?
C++のAPIじゃなくてWin32のAPIだろ? joyGetPosExとかいうカビ生えた関数使うんだったっけ
>>232 >めんどくせぇから,
めんどくせぇなら、レスするな。
自分の無能を隠すのに下らない言い訳するなよ。
そんなものは世の中の害にこそなれど、役には立たない。
↑より役に立つことは間違いない!
長井秀和きらい
#include <stdio.h> void main (void) { char s,e; printf("開始文字を入力==>"); scanf("%c",&s); printf("終了文字を入力==>"); scanf("%c",&e); printf("\n開始文字%c\n終了文字%c",s,e); return; } どうやって入力すれば良いのでしょうか? これだと一回目で終わってしまいます。
printf("開始文字 終了文字を入力==>"); scanf("%c %c",&s,&e);
どなたか
>>184 分かる方いませんか?
JISじゃなくShift-JISでお願いします。
>>244 ご回答有難う御座います。
ただ課題で実行画面が書かれており、そのとおりに表示しないと駄目なんです。
開始文字==>A 「Enter」
終了文字==>Z 「Enter」
と表示しなければ駄目なんです。
もっとも、開始・終了文字を入れて処理を行い、その結果を表示するのですが、
int と %d で数値を入力するのなら、普通に出来るのですが、文字をやろうとすると
上手く行きません・・・。
問題のつけたしすんな
>246 scanf() は必要部分を読んだあと残りを 『食い残す』 癖があるので、 fgets() などで一行丸々読んでから sscanf() で切り出すのが定石。
249 :
デフォルトの名無しさん :04/06/12 17:52
>>246 >printf("開始文字を入力==>");
>scanf("%c",&s);
>printf("終了文字を入力==>");
>scanf("%c",&e);
printf("開始文字を入力==>");
scanf("%c\n",&s); /* こうする */
printf("終了文字を入力==>");
scanf("%c",&e);
>>248 さん
fgets()を早速調べてみたのですが、fflush(stdin);というのもあるみたいですね。
fflush(stdin);よりfgets()の方が確実だとかなんとか・・・fgets()について、もう少し調べてみます。
有難う御座います。
>>249 さん
試してみました。
ただ最初に入力した後に、一文字入れなければ終了文字を入れられません。
%cの後に\nを入れることで、どのような動作になるのでしょうか?
fflushのその使い方はまちがっている。
253 :
デフォルトの名無しさん :04/06/12 18:40
CかC++で一元配置分散分析を行うプログラムを 作らなくてはいけないのですが どこかにいいサンプルなどないでしょうか?
すみません、下げ忘れました。 多重比較の方法はボンフェローニかシェッフェの方法を検討しています よろしくお願いします。
>>245 #include <stdio.h>
#include <stdlib.h>
int main() {
FILE * fpIn = fopen("dump.txt", "r");
FILE * fpOut = fopen("binary.txt", "wb");
while (fscanf(fpIn, "%02x", &cd) == 1) {
fputchar(cd, fpOut);
}
fclose(fpIn);
fclose(fpOut);
return EXIT_SUCCESS;
}
256 :
デフォルトの名無しさん :04/06/12 19:20
fputchar も妙だね…
あははは… fputc()だね。 #ダメだ、寝てこよう_/ ̄|⌒γ⌒γ⌒γ⌒γ⌒γ⌒○
質問ではないのでつが、このスレ時々名前が ぼるじょあどんになったり、ならなかったりするの でつが慣例でつか?
エー
あ、ぼるじょあさんだ
,、.'" __,,,,,_ ゙' 、 ,.':: ,、- ''"´ `゙゙゙''‐ 、 ゙' , ,,、、、 ,.'::: .,. " ゙'.、r'" ゙'、 ,.':::: , " , ., , ,, 、, , 、 、 ,r" ', _,i、 ,.' .i ,','l !l .!l l. ! ',, l .l、/ ........ ! ゙,~ ,.ri. .{ .!.!,i,',l ,',!,! l', l',l,,,!/ .::::::::::::::! ゙、:::::,.' .::! l゙、'l"l,' !,'!'!'.レ !' .'''.,' .:::::::::::::::::l . ,>' .:r"l ',.l,、‐''''i- ''i;' .:::::::::::::::::::,' 〈-、::::゙'‐!. ,. '、ゝ;;;:j /. .::::::::::::::::::::,' . ゙、 ゙''‐-l ', .ヽ`.´ ' ,.' .::::::::::::::::::::/ `,i‐、..}i '.;:. ゙ヽ ヾソ' .:::::::::::::::::::,.' ぼるじょあは天才 . / ;. ゙,゙, ';: ノ,,、-''" .::::::::::::::::::,r' / ,.'-‐゙'',-,、,i'"゙! " .::::::::::::::::,r'"', 憶えた! / i'r"゙'´` `'''>' ゙,::::::::::;r':! ', . / .,、'´ ::、 .:,r'" ゙、:::::'::::::',. ', / .,.! .. :゙'::,' 、.l. ゙、:::::::::: ゙、. ', / /,', ...::.:::::::,' ゙'i. ゙、:,',:::::. ゙、 '゙、 . / , ', ' .i、:::::::::,r' ', ゙、':::::::::. ゙、 ヽ / ,.'.,.' ,゙、:::::::i ゙、. '、 ..:::::::l::::::::::::::. ヽ ヽ / ././ ,.' '、;:::! ', ゙、::::::::::::::::::::::!::::::::::: ,''-、..,,゙、、,,,.__ / / / ./ .::::::`゙'、. '、 .:::::゙.、::::::::::::::::!:::::::: .,.',, ,,-,-‐'
264 :
デフォルトの名無しさん :04/06/12 23:23
お願いします!下に書いた同じ画像を表示させるプログラムをいじって 画像を1/2に縮小するプログラムを作ってください! #include "_wmgraph.h" #include "_stdfunc.h" main() { _init_wmimage(); printf("JPEGファイルを表示します.\n"); printf("何かキーを押して下さい.\n"); getchar(); char fname[256]; if(_fileopen(fname)) { _bmap *b = _read_bmap(fname); _newpage(1,"JPEG FILE",10,10,-b->w,-b->h); _setactivepage(1); _put_bmap(b, 10); _putimage(0,0,10); _setactivepage(1); _bmap *bb = new _bmap(b->w, b->h); //空の画像を生成 unsigned char *c = b->b; int blw=b->lw; unsigned char *cc = bb->b; int bblw=bb->lw;
265 :
デフォルトの名無しさん :04/06/12 23:23
続き for (int i=0; i<b->h; i++) for (int j=0; j<b->w; j++) { cc[bblw*i+3*j+0]=c[blw*i+3*j+0]; //Blue cc[bblw*i+3*j+1]=c[blw*i+3*j+1]; //Green cc[bblw*i+3*j+2]=c[blw*i+3*j+2]; //Red } _newpage(2,"JPEG FILE",20,20,-bb->w,-bb->h); _setactivepage(2); _put_bmap(bb, 10); _putimage(0,0,10); _setactivepage(2); delete b; delete bb; } return 0; }
266 :
デフォルトの名無しさん :04/06/12 23:24
あとこいつを使ってください! int red=0, green=0, blue=0; for (int ii=2*i; ii<2*i+2; ii++) for (int jj=2*j; jj<2*j+2; jj++) { red = red + c[blw*ii+3*jj+2]; green = green + c[blw*ii+3*jj+1]; blue = blue + c[blw*ii+3*jj+0]; } red = red/4; green = green/4; blue = blue/4;
>あとこいつを使ってください! あ、ご丁寧にどうも! って長いYO!w
>画像を1/2に縮小 面積が1/2? 辺の長さが1/2だよね。
wmgraph 持って無いんで良くわかんないけど、単に -for (int i = 0; i < b->h; i++) - for (int j = 0; j < b->w; j++) { -cc[bblw * i + 3 * j + 0] = c[blw * i + 3 * j + 0];//Blue -cc[bblw * i + 3 * j + 1] = c[blw * i + 3 * j + 1];//Green -cc[bblw * i + 3 * j + 2] = c[blw * i + 3 * j + 2];//Red を抜いて、代わりに +for (int i = 0; i < b->h/2; i++) + for (int j = 0; j < b->w/2; j++) { +int red = 0, green = 0, blue = 0; +for (int ii = 2 * i; ii < 2 * i + 2; ii++) + for (int jj = 2 * j; jj < 2 * j + 2; jj++) { +red = red + c[blw * ii + 3 * jj + 2]; +green = green + c[blw * ii + 3 * jj + 1]; +blue = blue + c[blw * ii + 3 * jj + 0]; + } +cc[bblw * i + 3 * j + 0] = blue / 4;//Blue +cc[bblw * i + 3 * j + 1] = green / 4;//Green +cc[bblw * i + 3 * j + 2] = red / 4;//Red を入れるんじゃ駄目?
270 :
デフォルトの名無しさん :04/06/13 03:26
50 個のデータの平均,標準偏差,最小値,最小値をとる 配列要素の番号,最大値,最大値をとる配列要素の番号および10 ごとに区切ったヒストグラムを (B)のように表示するプログラムを完成せよ。(ソースプログラムを提出) ただし,平均,標準偏差,各区間での度数,最小値,最小値をとる配列要素の番号,最大値, 最大値をとる配列要素の番号を計算するためのコードではfor 文は最大2回まで用いてよいこと にする。(うまくアルゴリズムを工夫すればfor 文は1 回の使用でも実現できる。) ヒント for 文を1 回だけ使用するアルゴリズムは難しいので,for 文を2 回使うことを前提としたヒント を与える。まず,最初のfor 文で最小値を求める。次に,2 度目のfor 文で,その最小値と配列 要素が等しいかどうかをみていくことにより,最小値をとる配列要素の番号を探す。このとき, 最小値をとる配列要素の番号が複数になる可能性があることを考え(実際にこの問題では複数あ る。),配列要素の番号を記憶する配列変数とこの配列変数のどの要素までを使ったかを記憶する 変数が必要となる。最大値についても,同様に考えればよい。 平均,標準偏差,各区間の度数を求めるためコードは,最初,2 回目のどちらのfor 文の中に 書いてもよい。 a[NUM] = { 99,45,89,62,61,93,55,78,56,26, 81,49,99,77,38,73,54,20,62,59, 63,59,63,93,74,37,71,49,48,56, 5,47,82,83,85,17,74,56,69,50, 51,82,24,99,66,65,73,53,48, 5};
要素数が可変長の多次元配列の作り方を教えてもらえませんか C/C++どちらでも構いません できれば関数(?)みたいに一行で宣言できるようにしてくれるとありがたいです (要素x y zの数を引数で渡すと生成されるみたいな) しょうもない質問かと思いますが,是非ともよろしくお願いします
>>223 ありがとうございます。
早速アップデートを試して再開したところ今度はエラーメッセージの内容が変わってやがる。。。
f:\c++\レッスン15サンプル1.cpp(39) : error C2512: 'Point' : クラス、構造体、共用体にデフォルト コンストラクタがありません。
f:\c++\レッスン15サンプル1.cpp(46) : error C2512: 'Point' : クラス、構造体、共用体にデフォルト コンストラクタがありません。
f:\c++\レッスン15サンプル1.cpp(53) : error C2512: 'Point' : クラス、構造体、共用体にデフォルト コンストラクタがありません。
エラー数だけで言えば前のほうが少なかった。。。のだろうか。
コード(エラーメッセージは上に書いたのになりました)↓
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_16/code.txt
>>272 271のレベルを推測するに,それだとvector単純に宣言したら出来るんだって思うんでね?
275 :
デフォルトの名無しさん :04/06/13 08:41
>275 内藤さんにちくりました。レポートの注意くらいは読んでおこうね。
>>275 > 卒業できずと教員免許もでない
こんな日本語書く奴が教師になろうとしてるのか...、世も末だな。
>>271 C99対応のコンパイラなら普通の配列と同じように作れるんだけど
そうじゃないの使っているから質問したんだよな……。
int hoge[x][y][z];
寧ろ落として欲しいもんだ。
>>276 GJ!
>>270 >>198- あたりを参照のこと。てか、(・3・)同じ課題かYO!
>>275 unsigned int uint_power(unsigned int a, unsigned int n)
{
if(n == 0)
return 1;
if(n == 1)
return a;
else {
if(n % 2)
return uint_power(a, n/2) * uint_power(a, n/2 + 1);
else
return uint_power(a, n/2) * uint_power(a, n/2);
}
}
動的に求めれば O(log n) よりも早くなるが。
これでいい?
>>273 Pointクラスにデフォルトコンストラクタがないって教えてくれてるでしょーが
class Point
{
//略
Point(int a=0,b=0);
}
↓
class Point
{
//略
Point(int a=0,b=0):x(a),y(b){}
}
あとoperator++,operator++(int)はその実装だとまずいかも。
>>284 >Point(int a=0,b=0):
↑なんかすげーきもちわるい。
Point(int a=0, int b=0):
↑きもちいい。
(B) 平 均 = 60.46 標準偏差 = 22.80 最小値 = 5 最小値をとる配列要素の番号 = 30 49 最大値 = 99 最大値をとる配列要素の番号 = 0 12 43 0- 9 |** 2 10-19 |* 1 20-29 |*** 3 30-39 |** 2 40-49 |****** 6 50-59 |********** 10 60-69 |******** 8 70-79 |******* 7 80-89 |****** 6 90-99 |***** 5
>>286 だーかーらー、>>198- を見れと。同じ課題やった君の友人がいるから。
むしろ同じやつが納得できずに もう一度訊いてたりしてw
>>283 (・3・)アルェー
それのどこが O(log n)???
O(n)にしか見えないYO!
290 :
デフォルトの名無しさん :04/06/13 20:33
この問題をお願いいたします。 ヤコビ法とガウス・ザイデル法のそれぞれで 連立3元1次方程式を解くプログラムをつくりなさい。 ただし、途中の解の近似値も出力されるようにすること。
>>284 どうもありがとうございます。
しかし書籍に載っているコードが動作しないなんてどういうことなんだ。。
やさしいC++ってやつのサンプルですけどこの本だめですかねぇ。。?
配列やらポインタやら一応覚えた気でいるけどもう少しやりたいので完全な素人ではないけど初心者向けみたいな書籍ってないですかね〜
って板違いですかな。
292 :
デフォルトの名無しさん :04/06/13 23:12
>>290 せめてその数式を書いてください。
屋媚法とかガウス・財出るほうを調べるのはプログラムのスキルとは違うと思うので…
293 :
デフォルトの名無しさん :04/06/13 23:42
295 :
デフォルトの名無しさん :04/06/14 08:31
>>283 プッ
unsigned int uint_power(unsigned int a, unsigned int n)
{
if(n == 0)
return 1;
if(n == 1)
return a;
int tmp = unit_power(a, n / 2);
return n % 2 ? tmp * tmp * a : tmp * tmp;
}
これお願いします↓ データの個数と,その個数分の整数データが保存されているファイル(データ例)を読み込み,データを木の節点に保存する,各データがどの節点に保存されるかは任意 とする. このとき,ユーザがキーボードで前順,中順,後順を選択すると,その順で木をなぞる(データを画面上に順に表示する)プログラム order.cを作成せよ.(表示するの はデータの値の大小順ではないことに注意せよ.) データ例 8 3 7 5 8 2 1 4 9
↑問題文はそれだけなの?
木だのなんだのは組めたけど ファイル入力が分からないw
fscanf
これはサイコロの目の出る確率を計算するプログラムであるが、 不備があるため結果が得られません。 間違いを指摘して修正しなさい。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(){ int i,me,j,n; int a[6]; float b[6]; srand(time(NULL)); for(j=0;j<6;j++){ a[j]=0; } 続く
printf("繰り返しの回数≦30000"); scanf("%d",&n); for(i=0;i<n;i++){ me=rand()%6; switch (me){ case 1:a[0]+=1;break; case 2:a[1]+=1;break; case 3:a[2]+=1;break; case 4:a[3]+=1;break; case 5:a[4]+=1;break; case 6:a[5]+=1;break; } } for(j=0;j<n;j++){ b[j]=a[j]/n; printf("%d の目の出る確率= %d\n",j,b[j]); } return(0); } どなたか助言お願いします。
for(j=0;j<6;j++){ b[j]=a[j]/n; printf("%d の目の出る確率= %d\n",j,b[j]); } n回まわすとかぶっちゃけありえない。
>>303 すいません、タイプミスでした
おっしゃる通り、
for(j=0;j<6;j++){
です。
その他で何かあったらお願いします。
printf("%d の目の出る確率= %d\n",j,b[j]); ↑ %f
あとb[j]=a[j]/n;もb[j]=a[j]/(float)nかな
ついでに、case で指定した値も全部 1 大きすぎる。
printf("%d の目の出る確率= %d\n",j,b[j]); ↑ j+1
for文についての質問です for文で特定の回数繰り返しprintf関数を使って出力するときに scanf関数で出力ごとに独自の値を入力できるようにするにはどうすればいいのでしょうか 1つ目の値 ** 2つ目の値 ++ 3つ目の値 == **、++、==はscanf関数を使用して入力した値です 何方かご教授願います
311 :
サイコロ1 :04/06/14 21:26
サイコロの目の出る確率のプログラムを以下のように作ってみましたがうまくいきません。おそらくプログラムが一秒以内で終了してしまうため for文の中のrand()の値が一定になってしまうようです。どうすればよいのでしょうか?
>>311 なんとなく予想がつく。
srandを呼ぶのは一度だけにしろ。
>>309 日本語が不明瞭でよく分からないけど、要するに"nつめの値 "と表示してから
配列の n 番目に値を読み込みたいって事?
314 :
サイコロ2 :04/06/14 21:27
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ int i,me,j,h; int a[6]; float b[6],n; srand(time(NULL)); for(j=0;j<6;j++){ a[j]=0; } printf("繰り返しの回数<=30000\n"); printf("サイコロをふる回数は:"); scanf("%d",&n); for(i=0;i<n;i++){ me=rand()%6; switch(me){ case 0:a[0]+=1;break; case 1:a[1]+=1;break; case 2:a[2]+=1;break; case 3:a[3]+=1;break; case 4:a[4]+=1;break; case 5:a[5]+=1;break; } } for(j=0;j<6;j++){ b[j]=a[j]/n; printf("%dの出る目の確立=%f\n",j,b[j]); } return(0); }
>>310 rand()%6 は、6で割ったあまりなので 0〜5 の範囲しか取らない。しかし
case では、1〜6 で指定しているので case 「6」 (a[5]) には絶対にこない。
>>314 じゃなかったか。
b[j]=(float)a[j]/n;
これでも駄目か?
あと、switchはいらない。↓で十分。
for(i=0;i<n;i++)
a[rand()%6]++;
>>314 >switch(me){
>case 0:a[0]+=1;break;
>case 1:a[1]+=1;break;
>case 2:a[2]+=1;break;
>case 3:a[3]+=1;break;
>case 4:a[4]+=1;break;
>case 5:a[5]+=1;break;
>}
a[me]++;
1文ですむでしょ
C言語をはじめたばかりでどう説明すればいいのかもわかりません。 本当にすみません。
>>316 float n を scanf("%d") で読み込んじゃまずいでしょ。
b[j]=(float)a[j]/n; としてみましたがダメみたいです
>>313 いえ、"nつ目の値"と固有の値をそれぞれfor文でn番目まで読み込ませたいのです
int z,a;
for(z=1;z<=3;z++){
printf("%dつ目の値 ",z);
scanf("%d",a);
}
でaの部分を表示されるたびに打ち込めるようにしたいのです。
なんとなく伝わったでしょうか・・・?
>>319 それだな。
↓これでできるはず。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int i,n,a[6]={0};
srand(time(NULL));
printf("繰り返しの回数<=30000\n");
printf("サイコロをふる回数は:");
scanf("%d",&n);
for(i=0;i<n;i++)
a[rand()%6]++;
for(i=0;i<6;i++)
printf("%dの出る目の確立=%f\n",i,(float)a[i]/n);
return 0;
}
>>315 ありがとうございます。
まだ修正すべき点があるようなのですが、もしよろしければでいいので
お願いします。もちろん自分でもやってみます。
>>321 a の部分ってのは、配列になってるの?それともばらばらの変数?
配列になってると仮定すると、↓で、 1番目の値を a[0]、2番目の…(ry に読み込む。
int z,a[3];
for(z=1;z<=3;z++){
printf("%dつ目の値 ",z);
scanf("%d",&a[z-1]);
}
できました! みなさん、ほんとうにありがとうごさいました!!
>>325 とりあえず
確立→確率
は直しておこう。どんなに頑張ってもコンパイラは教えてくれないバグ(w
>>325 「0」 の目が出る確率は 0 だけど、その辺は直した?
>>324 変数です。授業では配列をやっていないので配列は使わないと思われます。
直しました。大丈夫です! 本当にありがとございましたm(--)m
>>328 配列やってないとすると、switch() もやってないのかな?そうすると変数を a, b, c として
d でいったん入力を受け取って、
int z,a,b,c,d;
for(z=1;z<=3;z++){
printf("%dつ目の値 ",z);
scanf("%d",&d);
if(z==1)
a=d;
if(z==2)
b=d;
if(z==3)
c=d;
}
# 良い子はまねをしないでください系のコードになったかも。
>>330 if、switch、for文の順で習いました。
この後にはここで出す値とifを使い、
それぞれに対応した場合分けの出来るようにするところまでが宿題です
これを使ってやってみます。ありがとうございました。
332 :
デフォルトの名無しさん :04/06/14 22:24
宿題ですが、まったくわからないので、お願いします。 <問題> ############ #...#......# ..#.#.####.# ###.#....#.# #....###.#.. ####.#.#.#.# #..#.#.#.#.# ##.#.#.#.#.# #........#.# ######.###.# #......#...# ############ この2次元配列で、#は迷路の壁、ドットは迷路の道を表す。配列の中でドットのあるところだけが通ります。 迷路の出口(1つあると仮定)に必ず行き着く簡単なアルゴリズムがある。このアルゴリズムでは出口がないと入り口に戻ってくる。 まず、右手で右側にある壁に触りながら前方に歩き出す。決して壁から手を離してはいけない。迷路が右に折れていたら壁に沿って右に曲がる。 このようにして進んでいけば、壁から手を離さないかぎり必ず迷路の出口に着く。 迷路を通り抜ける再帰関数mazetraverseを書け。この関数は引数として迷路の入った12×12の文字型配列およpび入り口の位置を受け取る。 mazetraverseは出口に向って進むたびに文字Xを置いていく。 出口に着いたら、迷路から脱出できたことを示すため迷路全体をプリントすること。 以上です。どうかよろしくお願いします。
ポインタの宿題なんですがちょっと分からないので教えて下さい。 文字列「Evercool」をメモリ領域に格納し、ポインタの概念を利用して文字列「Eeco」と「lorv」を 画面に表示するプログラムを作成せよ。 って言う問題です。 ポインタまで来て少しつまずいてます。 よろしくお願いします。
ポインタの概念を利用してってこういうことか? char *str = "Evercool"; int i; for(i=0; i<4; i++){ putchar(*str); str+=2; } putchar('\n'); str--; for(i=0; i<4; i++){ putchar(*str); str-=2; }
335 :
デフォルトの名無しさん :04/06/14 23:48
d次元正方格子で各ステップごとに2d個の隣接格子点の一つを等確率で 選んで飛び移る(対象単純ランダムウォーク)とき、再帰確率をシミュレーション によって求めるには? 3次元までは分かるがd次元に拡張する良い方法はないかのう…。
>>335 再帰確率とかよくわからなかったけど、
ようするに一度通った座標を覚えておけばいいのだろ?
#include <vector>
#include <map>
#include <iostream>
#include <iterator>
#include <cstdlib>
using namespace std ;
int main()
{
const int d = 6 ;
const int loop_num = 1024 * 8 ;
vector<int> pos( d, 0 ) ;
map<vector<int>,int> count ;
for( int i = 0 ; i < loop_num ; i++ ){
if( rand() % 2 ) ++pos[ rand() % d ] ;
else --pos[ rand() % d ] ;
++count[pos] ;
}
cout << "ゆにーくな座標の数/移動した数="
<< count.size() << "/" << loop_num << "="
<< static_cast<double>( count.size() ) / loop_num
<< endl ;
return 0 ;
}
338 :
デフォルトの名無しさん :04/06/15 06:19
次は文字列と検索する文字を入力し,文字列の中に検索する文字があれば,それ以降(その 文字を含む)の文字列を表示するプログラムです.空欄を埋めてプログラムを完成してください. #include <iostream.h> #define STR_LENG 100 char *wherechar(char *p,char ch); void main(void) { char str[STR_LENG+1], ch, *p; cout << "文字列入力"; cin >> str; cout << "検索文字?"; cin >> ch; if((p=wherechar(str,ch)) == NULL){ cout <<"文字"<< ch << "は見つからない"<<endl; } else{ cout<<"文字"<<ch<<"の後ろの文字列は"<<p<<endl; } } char *wherechar(char *p,char ch) { //埋めていただきたいところ } という問題です。よろしくお願いします。
339 :
デフォルトの名無しさん :04/06/15 06:22
>>338 for(;*p;p++)
if(*p==ch)
return p;
if(!ch)
return p;
return NULL;
文字列 "** /?" (**は数字の1から15) 以外しか読み込めないように制御する式はどうやったら良いんでしょうか? ずっと悩んでいるんですが教えてください。
341 :
デフォルトの名無しさん :04/06/15 10:50
342 :
デフォルトの名無しさん :04/06/15 11:51
二次元配列のメモリを確保することってできますか?
343 :
デフォルトの名無しさん :04/06/15 11:57
>>342 int a[2][3];
こうすれば確保されます。
344 :
デフォルトの名無しさん :04/06/15 12:01
>>343 ありがとうございます。 では、二次元配列のメモリの動的確保ってできますか?
>二次元配列のメモリの動的確保 順番にやるだけ
念のため補足すると、高次からね。
348 :
デフォルトの名無しさん :04/06/15 12:55
>>347 えっと、mallocでやりたいんですけども…
できますか と どうやるんですか は全然違う質問です。
350 :
デフォルトの名無しさん :04/06/15 13:14
mallocでやりたいんですが、どうやるんですか?
>>349 質問のしかたが悪く、すみませんでした。
>>二次元配列のメモリの動的確保 >順番にやるだけ >念のため補足すると、高次からね。 int **a,i; a=(int *)malloc(sizeof(int *)*2次の大きさ); for(i=0; i<2次の大きさ; ++i) a[i]=malloc(sizeof(int)*1次の大きさ);
↑間違ってるし... a=(int **)malloc(sizeof(int *)*2次の大きさ); ぢゃねーのか?
↑?????
↑??????
質問者のイメージする2次元配列によるんだが、
>>343-344 の流れからいくと、
malloc(n*m*sizeof(int)) じゃないのか?
>355 ほぇ? int a[2][3]; って話しか出てない気がするのはもれの目が悪いせいか?もまえがデムパなのか?
357 :
デフォルトの名無しさん :04/06/15 14:31
書き込めない…
なかなか哲学的な書き込みだな↑
359 :
デフォルトの名無しさん :04/06/15 14:41
例えばg[j][i]という配列があるとします。 この場合のjとiのメモリを動的確保したいのですが、 どうすればいいのでしょうか?
int *i,*j; i=malloc(sizeof(int)*1); j=malloc(sizeof(int)*1); ぢゃないのか?
361 :
デフォルトの名無しさん :04/06/15 14:49
>>360 ありがとうございます。
intの箇所をcharにしてもできますか?
何がしたいのか皆目見当がつかんが char *i,*j; i=malloc(sizeof(char)*1); j=malloc(sizeof(char)*1); 別に問題なかろ
>360,362 もまえイヂワルだな(w >例えばg[j][i]という配列があるとします。 >この場合のjとiのメモリを動的確保したいのですが、 質問文章が全然ダメなんだが、 意図はg[0][0]〜g[i][j]の配列を確保したい、って事ぢゃねーのか? iとiのメモリを動的確保したいのではなく(w
364 :
デフォルトの名無しさん :04/06/15 15:02
>>363 質問内容がめちゃくちゃですみません。
363さんが言っている
>g[0][0]〜g[i][j]の配列を確保したい
ってことをしたいのですが、どうすればいいのでしょうか?
>どうすればいいのでしょうか? >351,352 読め >355ぢゃねーぞ(w
>>365 そうかな?
ま、364が何をしたいのかは、この状態ではわからんけどな。
>366 ほぇ? >g[0][0]〜g[i][j] って話しか出てない気がするのはもれの目が悪いせいか?もまえがデムパなのか?
二次元配列ってのは配列を指すポインタの配列と覚えたほうがわかりやすい
>>368 その二つを一緒にするのは配列とポインタを混同するようなものかと。
まぁ別に char *p; を *(p+i) としようが p[i] としようが同じ訳なんだが、 違う意味の所もあるしな
371 :
デフォルトの名無しさん :04/06/15 20:23
自然対数の低の累乗e^(x)のマクローリン展開を定義によって求め、その値を 近似計算する関数定義、 double exp2(double x); を作成し、eの値を求めよ。 この課題をどなたかお願いします。力不足ですみません
せめてマクローリン展開した式くらい書くがよろし。 あと求めるのはdoubleの精度まででいいのか?
>>371 >372 にもあるとおり、数学計算の問題の場合は、どんな計算なのか十分に
説明してくれないと、知ってる人しかできないので、その辺よろしく
double exp2(double x)
{
double n = 0;
double n_kaijo = 1;
double oldans;
double x_njo = 1;
double newans = 0;
double err, e = (1/(10000000000.0));
do {
oldans = newans;
newans = oldans + x_njo / n_kaijo;
n++;
n_kaijo *= n;
x_njo *= x;
err = fabs((newans - oldans) / newans);
} while (err > e);
return newans;
}
374 :
デフォルトの名無しさん :04/06/15 21:17
考えてもここまでしか分かりませんでした。教えてください(T T) 課題 n次正方行列x、yの積を行列zに求める関数mul_mat()を定義せよ。 定義した関数により、 2 1 -3 -1 1 -2 5 -7 1 1 2 -1 ←三次正方行列同士の積 0.5 4 -2 3 -2 1 を計算し、結果を印刷せよ。
#include <stdio.h> #define N 5 double a[N][N]={{2.0,1.0,-3.0},{5.0,-7.0,1.0},{0.5,4.0,-2.0}}; double b[N][N]={{-1.0,1.0,-2.0},{1.0,2.0,-1.0},{3.0,-2.0,1.0}}; double c[N][N]; void mul_mat(double z[][N],double x[][N],double y[][N],int n) { int i,j; for(i=0;i<n;i++) for(j=0;j<n;j++) z[i][j]=x[i][j]*y[i][j]; } void print_mat(double x[][N],int n) { int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++) printf("%5f",x[i][j]); printf("\n"); } }
void main()
{
print_mat(a ,3);
printf("\n");
print_mat(b ,3 );
printf("\n");
mul_mat(c ,a ,b ,3);
printf("\n");
print_mat(c ,3 );
}
>>374 の行列がずれてしまって読みにくくてすみません。
>>374 行列の積は、成分であらわすと
z_ij = Σ a_ik*b_kj
だから、mul_mat 内で新しい for ループを使って k を 0〜2 間で動かして、積の総和を
z_ij に入れてやればいいかと。
ちなみに N の 5 は 3 の間違い?
Nは3の間違いかもしれません。 forループを使って考えてみます。 また分からなかったら教えてください。m(_ _)m
379 :
デフォルトの名無しさん :04/06/15 21:53
>>372 ,373
すみません。マナー違反でした、、
そして、ありがとうございます!
まさかこんなに早いとは思いませんでした、感謝です。
めげずにC言語がんばります
>>375 のmul_mat内を変えて、
void mul_mat(double z[][N],double x[][N],double y[][N],int n)
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<=0;k++)
z[i][j]=x[i][k]*y[k][j]+x[i][k+1]*y[k+1][j]+x[i][k+2]*y[k+2][j];
}
としたら、結果は正しく出たのですが、
無駄が沢山あるように思えます。もう少しスマートに出来ないでしょうか?
void mul_mat(double z[][N],double x[][N],double y[][N],int n) { int i,j,k; k=0; for(i=0;i<n;i++) for(j=0;j<n;j++) z[i][j]=x[i][k]*y[k][j]+x[i][k+1]*y[k+1][j]+x[i][k+2]*y[k+2][j]; } としてみました。連レスすみません。 もっと良いのがあったらご教授下さい。 有難う御座いました!!
382 :
デフォルトの名無しさん :04/06/15 22:22
実数a,bを引数とし、それらの大きい方の数を関数値とする関数定義 double maxi(double a,double b); と小さい方の数に対応する関数定義 double mini(double a,double b); を作成し、それらの動作テストのためのプログラムを作成せよ どうかお願いしますm(__)m
>>380 せっかく k のループ入れたんだから、ループさせようよ(^^;;;
void mul_mat(double z[][N], double x[][N], double y[][N], int n)
{
int i, j, k;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
z[i][j]=0; /* まず積算前に初期化しておく */
for (k = 0; k < n; k++)
z[i][j] += x[i][k] * y[k][j]; /* k ごとに積算していく */
}
}
}
>>382 そんなのわからない奴っているのか?信じられん。いや俺は絶対信じない!
>>383 有難う御座います。
z[i][j]=0; /* まず積算前に初期化しておく */
が無くても出来たのですが、あった方がいいのでしょうか?
>>385 絶対必要
もし、c=a*b を計算して表示した後に、今度はc=b*a を計算しようとかしたら、
c には前の計算結果が残っているから、0 で初期化しないと、それも足しちゃうよ?
# ついでに言うと、>380-381 がだめな理由は、3次以外のn次正方行列(→問題
# 参照)でおかしくなるから
ありがとうございました。m(_ _)m よく考えます!!
388 :
デフォルトの名無しさん :04/06/16 00:17
>>336 332です。どうもありがとうございました。助かりました!またお願いします。
実行結果 二つの整数を入力してください。 整数A:40 整数B:45↓ 平均値の符号を反転した値は-42です。 平均値の符号を反転した値って何?どうやって計算するの?教えてください
-1をかけりゃいいんでない?
かける必要なんて無い。 -a
できました、ありがとうございます。それでもうひとつ教えてほしいんですが 実行結果 長さcmを入力してください:25.4↓ それは10.000000インチです。 cmの単位を、インチに変換した値にするんですけどどうすればいいんでしょうか
2.54 で割ればいいのでは?
プログラム以前の問題だよなコレ
>平均値の符号を反転した値は-42です。 >平均値の符号を反転した値って何? 類推できないのかよ。恐ろしいな。 int 切捨てになってること以外は、小学生向けの知能テストのレベルだよ。
ゆとり教育の賜物ですな
397 :
デフォルトの名無しさん :04/06/16 10:19
ですな。
簡単な問題は 友達に聞くほうが早いで。
399 :
デフォルトの名無しさん :04/06/16 11:36
int red,green,blueとdouble brightnessをメンバとする構造体colorと、 int x,yをメンバとする構造体coordinateを作成し、coordinate positionと color lightをメンバとする構造体dotinfoを定義せよ (@u@ .:;)御願い
402 :
ぼるじょあ ◆yBEncckFOU :04/06/16 13:12
ぼるじょあ◆yBEncckFOUは共同体で連続体で群生体だから 無限の知識と無尽蔵の体力を持ってるんだYO!24時間、いつでも質問オッケー♪ (・3・) エェー こっちが嫌になるほど質問しろYO! 名前欄に「ぼるじょあ#ぶるじょあ」って書けば、キミも今日から ぼるじょあ◆yBEncckFOU だYO! 名前欄に「ぼるじょあ#セV8cLFセz」って書けば、キミも今日から ぼるじょあ◆yEbBEcuFOU だYO! *ぼるじょあ◆yBEncckFOUはコテハンじゃないYO! *ぼるじょあ◆yBEncckFOUはいつだって全力投球ダジェ!! *ぼるじょあ◆yBEncckFOUは共同体で連続体で群生体だYO! *ぼるじょあ◆yBEncckFOUはみんななれるからイイぼるじょあも悪いぼるじょあもいるYO! *ぼるじょあ◆yBEncckFOUはエムエクースとニーはよくわからないYO! *ぼるじょあ◆yBEncckFOUは2ちゃんねるの人気者だYO! *ぼるじょあ◆yBEncckFOUはちょっと基地外はいっているYO!
>>399 >int red,green,blueとdouble brightnessをメンバとする構造体colorと、
struct color {
int red, green, blue;
double brightness;
};
>int x,yをメンバとする構造体coordinateを作成し、
struct coordinate {
int x, y;
};
>coordinate positionと
>color lightをメンバとする構造体dotinfoを定義せよ
struct dotinfo {
coordinate position;
color light;
};
もう>400の勉強しに逝ってしまったかな?
次の関数を定義し、適当なmain関数を付けて実行しなさい。 ・文字列を受け取り、その中の最小(コード)の文字を返す関数min よろしくお願いします。どう考えるのかご教授下さい。
405 :
デフォルトの名無しさん :04/06/16 17:31
自然対数の低の累乗e^(x)のマクローリン展開を定義によって求め その値を近似計算する関数定義 double exp2(double x); を作成しeの値を求めよ これを誰かお願いします。
406 :
デフォルトの名無しさん :04/06/16 17:31
@キー入力で文字列を読み込む A検索したい文字列をキー入力 Bマッチする文字列のメモリ番地の範囲を出力 というものなのですが、お願いします。 メモリ番地の先頭番地だけの出力ではなくお願いします。 「あいうえおえおえお」とかの場合で検索語「えお」ならば 1つめの番地 4〜5 2つめの番地 5〜6 3つめの番地 6〜7 という感じです。
407 :
デフォルトの名無しさん :04/06/16 17:41
引数1 int型 税抜き価格 引数2 int型 税率(%) 戻り値 int型 税込価格 引数から税込価格の計算をする。 main 整数型変数に税抜き価格を入力する。 整数型変数に税率を入力する gctpriccを用いて税込価格を計算する。 税込価格を表示する。 関数って難しいです。おながいします。
>>404 C++でいいのかな?
#include <iostream>
using namespace std;
char min(char[]);
int main() {
char test[] = "fieiVj aEFLjfQelha BHue ha";
cout << min(test) << endl;
return 0;
}
char min(char s[]) {
char m = s[0];
int len = strlen(s);
for (int i = 1; i < len; i ++)
if (s[i] >= 'A' && s[i] <= 'z' && s[i] < m)
m = s[i];
return m;
}
アルファベットに限定する必要ないなら最後の方の if の中身は
if (s[i] < m) だけでいいでしょう。
Cだったら・・・自分で書き換えて。
>>405 >371- あたりを参照のこと。
>>404 #include <stdio.h>
char min(char const *str)
{
unsigned char lowest;
for(lowest = 0xff;*str != 0; str ++)
{
if (((unsigned char) *str) < lowest)
lowest = *str;
}
return lowest;
}
int main()
{
char s[] = "The quick brown fox jumps over the lazy dog.";
printf("'%s'の最小のコード: '%c'\n", s, min(s));
return 0;
}
げ、かぶった(汗
412 :
デフォルトの名無しさん :04/06/16 17:57
>409-410 熾烈な争いだ・・・。
>>407 かぶりませんように・・・(ドキドキ)。
#include <iostream>
using namespace std;
int gctpricc(int, int);
int main() {
int zenuki;
cout << "税抜き価格は?";
cin >> zenuki;
int zeritsu;
cout << "税率は?";
cin >> zeritsu;
cout << "税込みで" << gctpricc(zenuki, zeritsu);
cout << "円かよ〜ヽ(`Д´)ノウワァァン" << endl;
return 0;
}
int gctpricc(int zenuki, int zeritsu) {
double zekomi = static_cast<double>(zenuki);
zekomi *= 1.0 + static_cast<double>(zeritsu) / 100;
return floor(zekomi);
}
ところで gctpricc ってなんだぁ!?
もしかして getprice だったのかな・・・?
>>406 本当に ascii コードじゃなくて日本語でやるの? それとも ascii だけでいいの? まさか混在?
日本語だとしたら、文字コードとかはどうなってる?
もしかして wcs <-> mbs とかいう問題?
ああ、日本語は例題として使ってしまっただけで 日本語じゃなくて良いんです。すいませんでした。 お願いします。
416 :
デフォルトの名無しさん :04/06/16 18:22
線形リストが与えられたとき,その長さ(要素の個数)を計る関数 int length( list *pt),リスト要素の数字の和を計算する関数 int sum( list *pt ) および2つのリストのそれぞれの対応する要素の和を要素するリストを計算する 関数 list *add_list( list *list_a, list *list_b) をつくれ.ただし, add_listについては,長さが一致しない場合には短い方に値0の要素を適当に後ろに詰 めるようにして長さを一致させたリストとの和をとると考えよ
>>417 いや、文字コード次第だが境界の問題がある。要はある字の第二バイトと次の字の
第一バイトが検索文字の第一、第二バイトに一致する可能性がある。
加えて、>406 の問題文を見ると漢字一個で番地が 1 増えてるし、ascii と混ざると
めんどい事になりそう。
>>416 >線形リストが与えられたとき
その線形リストについてもうちょっと詳しく書いて。
先頭のノードはダミーなのかそうじゃないかとか
終端のノードはNULLをさしてるかどうかとか
だいたいメンバーに要素の長さを保持しておくんだったらlength関数めっちゃ短いし。(一行?)
いやむしろメンバーに和の値を保持しておくんだったらsumもいらないに近いな・・・(あんまそんなことしないと思うけど)。
えーと、ファイルからの読み込みとかじゃなくて・・・ キー入力でお願いしたいんですが・・・ 配列とかを使うっぽいんですが分かりません。 どなたか・・・どなたか・・・・(´ω`)
423 :
デフォルトの名無しさん :04/06/16 18:59
2個のint型変数引数の内容を入れ換えるための手続き型引数付きマクロ、 iswap(a,b) を実現せよ 誰か助けてくださいm(__)m
すみません追加です main()も作成せよとあります。 間に合ったかな、、
main()関数○ main() ×
427 :
デフォルトの名無しさん :04/06/16 19:06
(゚Д゚)ハァ?
>>423 w=a
a=b
b=w
a,bに適当な数字入れてやってみ
429 :
デフォルトの名無しさん :04/06/16 19:12
>>420 #include <stdio.h>
#include <stdlib.h>
struct list{
int no;
struct list *next;
};
typedef struct list list;
list *add_to_list( int no, list *l )
{
list *pt = (list *)malloc( sizeof(list) );
pt->no = no;
pt->next = l;
return pt;
} /* add_to_list */
431 :
デフォルトの名無しさん :04/06/16 19:12
>>420 int main()
{
list *pt = NULL;
list *ptx;
int i;
/*---- make a list ----*/
for ( i = 0; i < 20; i++ ) pt = add_to_list( i, pt );
/*---- print the list ----*/
ptx = pt;
while ( ptx != NULL ){
printf( "%d:", ptx->no );
ptx = ptx->next;
} /* while */
printf( "\n" );
/*---- free the list ----*/
ptx =pt;
while ( ptx != NULL ){
list *n = ptx->next;
free( ptx );
ptx = n;
} /* while */
return 0;
} /* main */
>>428 #define iswap(a,b) としてそのあとに
w=a
a=b
b=w
でいいんですか?
>>432 マクロの使い方がまったく分かってないでしょ。
たとえば、こんな感じ。
↓
#define iswap(a,b) ¥
do {¥
int temp = a;¥
a = b;¥
b = temp;¥
} while (0)
#include <stdio.h>
#define iswap(a,b) w=a ,a=b, b=w;
int main(void)
{
int a , b,w;
a = 4, b = 6;
printf("aは%d bは%d\n", a,b);
iswap(a,b);
printf("aは%d bは%d\n", a,b);
return 0;
}
>>432 ちっとは脳みそ使ってみたらどうなんだ
>>433 おっしゃる通りマクロについて無知です
この分野の難解さにがくぜんとしてます、、
教えてくれて感謝です!
>>403 で定義した構造体dotinfo型の変数imageの初期値を以下の値としたい。
lightのメンバ変数red,green,blueの初期値を20,40,90とし、
positionのメンバ変数x,yの初期値を240,180とするプログラムを作成せよ
よろしゅうたのんます
聞きたいんですが、みなさんもCを始めたとき はかなり理解するのに苦労しました? 自分はかなり苦労してるんでまじでアフォなんじゃと悩んでます
どなたかお願いします。(´д`)ヾ
>>439 横着せんと、質問以降のレスはちゃんと全部嫁。特に >426
>>413 CPad for Borland C++コンパイラーってソフトで実行すると
致命的エラー F1003 C:\borland\bcc55\Include\stdcomp.h 5: error 指令: Must use C++ for STDCOMP.H
と出ますた。
ともかく乙です。ありがとう。
「"円かよ〜ヽ(`Д´)ノウワァァン"」には笑ったYO!
>>406 どこまで対処すればいいのかよくわからんので2バイト文字に変換して処理するようにした。
入力文字数を限定したくないのでC++ね。
#include<iostream>
#include<string>
using namespace std;
wstring to_wide(std::string const & s){//2バイト文字に変換
int len = mbstowcs(NULL, s.c_str(), s.size());
wchar_t * buffer = new wchar_t[len + 1];
mbstowcs(buffer, s.c_str(), len);
wstring result(buffer, len);
delete[] buffer;return result;
}
int main(){
string source,pattern;
string::size_type pos=0;//検索場所
int hitNum=1;
cin>>source;//ソース文字列を入力
cin>>pattern;//検索文字列を入力
wstring wSource=to_wide(source),wPattern=to_wide(pattern);
while(1){
pos=wSource.find(wPattern,pos);
if(pos==string::npos)break;//検索終了
int start=(int)&wSource[pos],end=start+wPattern.size()*sizeof(wchar_t)-1;
cout.unsetf(ios::oct);cout.unsetf(ios::dec);cout.setf(ios::hex|ios::showbase);
cout<<hitNum<<"つめの番地:"<<start<<"〜"<<end<<endl;//番地を16進数で画面に出力
pos++;hitNum++;
}
return 0;
}
406 じゃないけど、コンパイルできない… (g++ (GCC) 3.3.1 (cygming special) 使用) こちらの環境が腐ってるのでしょうか? 。・゚・(ノД`)・゚・。 D:\tmp\syuku>g++ -g 406wc.cc 406wc.cc:4: error: syntax error before `const' 406wc.cc:7: error: `len' was not declared in this scope 406wc.cc:8: error: `s' was not declared in this scope 406wc.cc:8: error: `len' was not declared in this scope 406wc.cc:8: error: ISO C++ forbids declaration of `mbstowcs' with no type 406wc.cc:8: error: `int mbstowcs' redeclared as different kind of symbol /usr/include/stdlib.h:93: error: previous declaration of `size_t mbstowcs(wchar_t*, const char*, unsigned int)' 406wc.cc:8: error: initializer list being treated as compound expression 406wc.cc:9: error: `len' was not declared in this scope 406wc.cc:9: error: 'wstring' is used as a type, but is not defined as a type. 406wc.cc:10: error: syntax error before `delete' 406wc.cc: In function `int main()': 406wc.cc:21: error: `wstring' undeclared (first use this function) 406wc.cc:21: error: (Each undeclared identifier is reported only once for each function it appears in.) 406wc.cc:21: error: syntax error before `=' token 406wc.cc:23: error: `wSource' undeclared (first use this function) 406wc.cc:23: error: `wPattern' undeclared (first use this function) D:\tmp\syuku>
>>416 #include <stdlib.h>
typedef struct {
int value;
list *next;
} list;
int length(list *pt){ int i;for(i=0; pt; ++i, pt=pt->next); return i; }
int sum(list *pt){ int s; for(s=0; pt; s+=pt->value, pt=pt->next); return s; }
list *add_list(list *pa, list *pb){
int a=length(pa); int b=length(pb); int len=a>b?a:b;
list *ret=malloc(sizeof(list)*len);
for(int i=0; i<len; ++i, pa=pa?pa->next:NULL, pb=pb?pb->next:NULL){
ret[i].value=(pa?pa->value:0)+(pb?pb->value:0); ret[i].next = ret+i+1;
}
ret[len-1].next = NULL;
return ret;
}
426見忘れてました。 で、機動させて文字を入力すると”Error: 入力 stdin が変です” というエラーしかでませんでした。(´ω`) プログラムは動いてるんですが・・・ >443 有り難うございます。ですが、あまりに高度な内容? で、全く理解できません。
>>446 以下のコード (main() 内二箇所)を
if (fgets(buff, sizeof(buff), stdin) == 0) {
fprintf(stderr, "Error: 入力 stdin が変です。。。\n");
return 1;
}
このコードに置き換えるとどうなりますか? うまくいけば原因を表示してくれるんですが…
if (fgets(buff, sizeof(buff), stdin) == 0) {
if (feof(stdin))
fprintf(stderr, "Error: 入力 stdin が変です: eof\n");
if (ferror(stdin)) {
fprintf(stderr, "Error: 入力 stdin が変です: %s\n",
strerror(errno));
}
return 1;
}
>404 文字列は必ず最後に\0が付くといってみる。
初心者がここに出される問題を解いていけばレベルアップしていってウマーですか?
置き換えたらただのエラーで機動しませんでした。 というか自分が未熟なもので良く分からないからなんですが・・・ 426さんのプログラムはきちんと動いているみたいです。 ただ文字を打ち込むと if (fgets(buff, sizeof(buff), stdin) == 0) { fprintf(stderr, "Error: 入力 stdin が変です。。。\n"); return 1; の部分が表示されるので・・・でも自分では何がなんだか・・・
>>450 エラーはコンパイル時ですか? それとも実行時?
どんなエラーがでますか? エラーを「そのまま」コピペしてください。
# 後よろしければ参考程度に OS とコンパイラの名前も。
補足: > 置き換えたらただのエラーで機動しませんでした。 についての質問です。
オレは
>>426 そのままで問題なく動いたけど...
ちなみにgcc3.3.1
コンパイラはLIGHT Cとかいうヤツです。vectorで無料でした。 OSはXPです。エラーメッセージというか・・・ ifで飛ばされてError: 入力 stdin が変です。。。 の部分が表示されるので、プログラム自体は動いてます。
あれれ・・・自分だけおかしいのかな? 455さんのコンパイラは無料ですか? そっちにしようかな・・・ Light Cはexeファイル作成したり作業が面倒なんですよね・・・ まぁ426さんのがそのまま動くのであればコチラに問題ある訳ですからね・・・。
>>409 >>410 各氏
わざわざ解いて頂いて、どうもありがとうございました。
ノートに書き写したので、これからじっくり考えてみます。
>>448 様
優しいヒントをありがとうございます。文字列の問題が出題
された時には気をつけて解くようにします。
次式のテーラー展開式に従って,指数関数e^xを計算する プログラムをつくってください。 e^x= 1+x+x^2/2!+x^3/3!+… (forループのループ変数を使って) また,x=1の場合について,nの値が1から20までのそれぞれの 計算結果と真値e=2.718281828459045...とを比較して下さい. という問題です。 何をforループのループ変数にすれば良いのかも分かりません。 どなたか助けて下さい。
>>459 >371- あたりを参照のこと。君で三人目
>>459 ↓こんな感じかなぁ。
double exp(double x)
{
double e = 1;
double xn = x;
double factorial = 1;
for(int i=2; i<MAX; ++i)
{
e += xn / factorial;
xn *= x;
factorial *= i;
}
return e;
}
>>456 の light C をダウンロード、コンパイルしてデバッグしました。
CX::DX=3 AH=42H AL=00H で INT 21H して返り値 DX:AX != 3 でエラーっぽいです。
要約すると、標準入力をシークしようとして、シークできないって文句言ってます (・д・)ポカーン
406 氏へ:
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
|
____.____ |
| | | |
| | ∧_∧ | |
| |( ´∀`)つ ミ |
| |/ ⊃ ノ | | [LIGHT C]
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
|
そんなコンパイラ、窓から投げ捨てろ!
最大200文字までの空白を含む英語の文章を入力し、 文章を空白やカンマなどから判別して単語に分け、 かつ各単語の出現回数を計算して出現回数の多いものから順にトップ5の単語と その出現回数を出力するプログラムを作りなさい。 ・単語は空白から空白までの文字列を1つの単語とみなす。 ('you your'の場合にはyouの個数は1カウントとする。) ・ポインタ変数を用いて作ること。 誰か助けてください・・・。
465 :
デフォルトの名無しさん :04/06/17 00:54
>>460 >>459 の問題は1年(プログラミングを0から始めて2ヶ月)にはきついと
思いませんか?
e = 1+1+1/2!+1/3!+…
>>465 思わない。
C的にはぜんぜん初歩だし。むしろ数学の問題。
>>465 漏れの学校でも1年でやったが、一万桁は求める羽目になったぞ。
>>469 scanf()を使わないと言うのには賛同するが、
scnaf()で空白を読み込めないと言うのは嘘だし
gets()を勧めるのは如何な最中と。
おっと、2行目、scanf()だよ。
>>464 おれは STL 使って書いたので、たぶん課題としてはダメっぽいのでうpしません。
#include <stdio.h> double frac(int n) { if(n == 1) return 1.0; else return frac(n - 1) * n; } int main(void) { const double e = 2.718281828459045235360287471; double exp1 = 1.0; int n; for(n = 1; n <= 20; n++) { exp1 = exp1 + 1.0 / frac(n); printf("%.24f %2d %.24f\n", exp1, n, e - exp1); } return 0; }
>>465 いまおじさんマになってる奴の中には
! の意味さえ教えりゃ小学校のうちから同等のことができた奴も多かろうて
同じ一年でも中学一年生にはきつかろうが
がっこでΣ習った奴はできなきゃあかんだろ
>>471 すまん。scanfは空白読めたのね。
今、検索して知った。
>>464 473の解答の方がC言語でかかれていて
読みやすくかつ正しいので、473をすすめる。
478 :
デフォルトの名無しさん :04/06/17 13:05
以下の手順で動的メモリの割り当て開放を行え。割り当ての際には割り当てられた アドレスを出力せよ。出力されたアドレスを解析し、どのように割り当てが行われるか 考察せよ。 | 操作列1 | 操作列2 | 1 | 200バイト割当て | 200バイト割当て | 2 | 200バイト割当て | 200バイト割当て | 3 | 1で割当てた領域の開放 | 1で割当てた領域の開放 | 4 | 250バイト割当て | 150バイト割当て | 5 | 150バイト割当て | 2で割当てた領域の開放 | 6 | 2で割当てた領域の開放 | 250バイトの割当て | 7 | 200バイトの割当て | 200バイトの割当て |
>>478 とりあえず、すべきことそのまんま書いてあるじゃん。
考察する部分が難しいって言うなら、とりあえず結果出してみて
アドレスがどうなったか書いてみ。
template <int n> struct F; template <> struct F<0>{ enum{ value = 1 }; }; template <int n> struct F{ enum{ value = F<n-1>::value * n }; }; template <int n> struct E; template <> struct E<0>{ static inline double value(){ return 1; } }; template <int n> struct E{ static inline double value(){ return E<n-1>::value() + 1 / (double)F<n>::value; } }; #include <iostream> int main(void){ std::cout << E<1>::value() << std::endl; std::cout << E<2>::value() << std::endl; std::cout << E<3>::value() << std::endl; std::cout << E<4>::value() << std::endl; std::cout << E<5>::value() << std::endl; std::cout << E<6>::value() << std::endl; std::cout << E<7>::value() << std::endl; std::cout << E<8>::value() << std::endl; std::cout << E<9>::value() << std::endl; std::cout << E<10>::value() << std::endl; }
>>481 Java 厨です。こういう例(というか templete の宣言例) 、はじめてみました。
とても面白いです。でも僕の脳には難解で、日常的に読みたくはないです
483 :
デフォルトの名無しさん :04/06/17 14:05
このプログラムより効率の悪いプログラムを作成せよ。 #include<stdio.h> int A(int n) { if(n==0) return 0; if(n==1) return 1; return (A(n-1)+A(n-2)); } main() { int n; for(n=0; n<10; n++){ printf("A(%d) = %d\n", n, A(n)); } }
>>483 #include<stdio.h>
int A(int n)
{
if(n==0) return 0;
if(n==1) return 1;
return (A(n-1)+A(n-2));
}
main()
{
char n;
for(n=0; n<10; n++){
printf("A(%d) = %d\n", n, A(n));
}
}
485 :
デフォルトの名無しさん :04/06/17 14:12
問題 体積の異なる5個の球がある。それぞれの体積は、{1.20,3.65,2.70,8.93,7.62}である。 これらの値を配列に代入し、球の半径を求めよ。 お願いします。
>>237 遅れましたが、非常に助かりました。
ありがとうございます。
487 :
デフォルトの名無しさん :04/06/17 14:21
488 :
デフォルトの名無しさん :04/06/17 14:24
#include <math.h> #include <stdio.h> main() { double taiseki[] = {1.20,3.65,2.70,8.93,7.62} for(int i=0; i<5; i++) { printf("%f\n", sqrt(sqrt(taiseki[i] * 4.0 / 3.0 / M_PI)); } }
>>469 >>473 >>479 本当にありがとうございます。
実は、構造体もソートもまだ習ってないのです。
2次元配列に単語を入れていき、それをまた一つずつ取り出して
新しい2次元配列にコピーしつつ出現回数をカウントしてました。
今回みなさんのを見て本当に勉強になりました。
まだ書いてる途中ですが、がんばってみようと思います。
ありがとうございました。
492 :
デフォルトの名無しさん :04/06/17 15:48
行列A(lm行列)と行列B(mn行列)の積ABを計算するプログラムを作成せよ。ただし、行列のすべての要素は整数であるとし、また、l、m、nおよび行列の要素はプログラム実行時に読み込むようにすること。 どなたか、助けてください・・・。
>>485 #include <stdio.h>
#include <math.h>
int main(void)
{
double vol[5] = {1.20,3.65,2.70,8.93,7.62};
double r;
for(int i=0; i<5; i++)
{
r = pow(vol[i] * 3.0 / 4.0 / M_PI , 1 / 3.0);
printf("V=%.2f -> r=%f\n", vol[i], r);
}
return 0;
}
494 :
ぼるじょあ ◆yBEncckFOU :04/06/17 16:11
保守
フィボナッチ数列を計算するプログラムを再帰を使わずに作成せよ。
>>495 #include<stdio.h>
int main()
{
int an=1,an_1=1;
printf("%d %d ",an,an_1);
for(int i=0;i<10;i++)
{//とりあえず10ループ
int an_2=an+an_1;
printf("%d ",an_2);
an=an_1;
an_1=an_2;
}
return 0;
}
>>496 Nバイト割り当て
C: char *x = (char *)malloc(N);
C++: char* x = new char[N];
領域の解放
C: free(x);
C++: delete[] x;
アドレスの出力
C: printf("%ld", (long)x);
C++: cout << (long)x;
500 :
デフォルトの名無しさん :04/06/17 17:11
昨夜は色々有り難う御座いました。 真っ当なコンパイラで機動させたトコロ きちんと動きました。やはりLIGHT Cは使えませんね・・・ >463さん わざわざ面倒なことご苦労さんです。 で、動いたので良いのですが・・・ メモリ番地を出力して頂きたかったんです・・・(;´Д`)うは 勘違いしてお願いしていました・・・(´ω`)ショボーン ex)1つめの単語は:1000〜1001番地 2つめの単語は:1003〜1004番地 みたいな感じで・・・ どうもすいません(´ω`)・・・
ご苦労さんとはもっぱら目下の者にいう言葉である (業界によるが)
>>500 感謝してるのに「ご苦労さん」という言葉を使うのは不適切だと思う。
>>500 これを
printf("%dつめの番地 %d〜%d\n", c + 1, s - str1 + 1,
s - str1 + lenstr2);
このコードに差し替えてください。
printf("%dつめの番地 %p〜%p\n", c + 1, s, s + lenstr2 - 1);
表示はこうなります(メモリ番地は通常こういう表記):
1つめの番地 0x22ef58〜0x22ef5a
C言語で、 「平成元年から16年までを西暦に変換して、 うるう年であれば、Lと出力するプログラム。 うるう年は西暦が4で割り切れるとする。」 期待される出力 1 1989 2 1990 3 1991 4 1992 L わけ分かりません>< if whitch forなどを使うらしいんですが… 誰か教えてください!
>>500-502 ∀{日本人}において
{日本語の出来ない人} ⊂ {プログラム言語のできない人}
∴{日本語が出来ない} ⇒ {プログラム言語もできない}
でファイナルアンサー?{
見直してみたらちょっとおかしい スマン、流してくれ
>>507 すいません。 whileでしたm(__)m では訂正: C言語で、 「平成元年から16年までを西暦に変換して、 うるう年であれば、Lと出力するプログラム。 うるう年は西暦が4で割り切れるとする。」 期待される出力 1 1989 2 1990 3 1991 4 1992 L if while forなどを使うらしいんですが…
>>505 #include <stdio.h>
void whitch(void)
{
int i;
for (i = 1; i <= 16; i++) {
printf("%d %d", i, i + 1988);
if (i % 4 == 0) puts(" L");
else puts("");
}
}
int main(void)
{
whitch();
return 0;
}
>>512 j = right; これが原因。
data[data_num] にアクセスしちゃうでしょ。
> /* ソート関数呼び出し */ > quicksort(0,data_num,data,order); いや、むしろ ↑か。 こうすればいいね。 quicksort(0, data_num - 1, data, order);
あ、なんだなんだ そうでしたか、ありがとうございます
516 :
デフォルトの名無しさん :04/06/17 18:51
>>495 確かめては無いがこんな感じなのではないかな
int s=0, a=1, b=1, n, i;
n = 求めたい番目;
if( n==1 || n==2 ) return 1;
for(i=3; i<n; ++i){
s = a + b;
a = b;
b = s;
}
return s;
main(){ char *p1,*p2,*p3,*p4,*p5,*p6,*p7; p1 = (char *)malloc(200); printf("1のアドレス=%p\n",&p1); p2 = (char *)malloc(200); printf("2のアドレス=%p\n",&p2); free(p1); printf("3のアドレス=%p\n",&p3); p4 = (char *)malloc(250); printf("4のアドレス=%p\n",&p4); p5 = (char *)malloc(150); printf("5のアドレス=%p\n",&p5); free(p2); printf("6のアドレス=%p\n",&p6); p7 = (char *)malloc(200);; printf("7のアドレス=%p\n",&p7); return 0; } こうやったら 1のアドレス=0012FF88 2のアドレス=0012FF84 3のアドレス=0012FF80 4のアドレス=0012FF7C 5のアドレス=0012FF78 6のアドレス=0012FF74 7のアドレス=0012FF70 って表示されました。あってますか?
それじゃあ、割り当てられたアドレスじゃなくて、ポインタ変数のアドレスだよ
スンマソン(´ω`)ご苦労様で御座いました。 >504さん またまた有り難う御座いました。 新しいコンパイラをインストールしてやってみます。 どうもでした(≧∀≦)
ご苦労様はもっぱら(ry
馬鹿にしてるようにしか読めないぞ。
>>500 なんか特に。
そのつもりならそれでいいけど
せめて「お疲れ様」にしてくれ。 というか、社会不適合者ばかりが集まってるのか?
n人の生徒のデータを読み込み、平均、最大値、最小値を求めるプログラムを作りなさい。 ただしデータの読み込み部分はinpdateとし、平均値、最大値、最小値を求める部分は 関数avemxmnとして作りなさい。 この問題が分かりません・・・・馬鹿なりに必死で考えてみたんですが全然ダメでした。 どなたかご教授お願いします。
フォルダを、中身と一緒にコピーするにはどのようにすればいいのでしょうか?
>>509 #include <stdio.h>
int main(){
int i = 0;
while(++i <= 16){
printf("%2d %d ", i, 1988 + i);
if(i % 4 == 0) putchar('L');
putchar('\n');
}
return 0;
}
// ※ 2000年はうるう年ではないが、あなたの出題に答えるとこうなります。
int a; a = a の持ってる値。 &a = a のアドレス。 int *b = &a; b = b の持ってる値 = a のアドレス。 &b = b のアドレス。
>>524 > // ※ 2000年はうるう年ではないが、あなたの出題に答えるとこうなります。
おいおい
1のアドレス=0090282C 2のアドレス=009028F8 3のアドレス=00000000 4のアドレス=009029C4 5のアドレス=00902AC4 6のアドレス=009021D0 7のアドレス=00902B60 といった結果になりました。あとはどうすればいいか解りません。 教えてください。。。
あとは考察すればいいじぇねーの?
>>530 これ操作列1についてしかやってないんですよ。
操作列2はどうすればいいか・・
533 :
デフォルトの名無しさん :04/06/17 20:23
動的にメモリを確保し、それを返さなければ、 最終的にはメモリが足りなくなりメモリを確保できなくなる。 それを以下の方法で確認せよ。 ・無限ループを生成し、その中で、 −動的にメモリを確保する。 −メモリを確保できなかった場合(malloc関数の返り値がNULL) は、ループから抜ける。 −確保したメモリのアドレスを出力する。 ・この関数を呼び出すメインプログラムを作り、実行する。 っていう問題がでました。皆さんお願いします。
main () { void *p; while ((p = malloc(1024 * 1024) != NULL)) printf("%d\n", p); } 書き込みを見る限りでは、こんなのしか出てこない 実行する気が全く起きない…
括弧、その他いろいろおかしいな 何やってんだ漏れorz
いい方法が思い浮かばないのでよろしくお願いします。 static struct ST{ unsigned char st;/* 状態 */ unsigned char priority;/* 優先度 */ void (*func) (unsigned char st);/* 実行関数 */ }; struct ST State[] = { 1,2,a 0,1,b 1,0,c 1,0,d 0,3,e }; void test(unsigned char num, unsigned char st) { } 例えば上のようにあったとします。test関数の引数numはST構造体 の配列n番目が入ります(今の例だと0〜4)。、stはnumで指定した配 列番号のstを設定します(0か1)。 何がしたいかっていうと、test関数の中で、stが1のものの中で、 優先度がもっとも高い(0が一番高い)関数に1を引数として、またそ れ以外でstが1のもには0を引数として渡し、また最高優先度でほか に同じ優先度のもの(例だと最高優先度が2つある)があれば、それ にも引数として1を渡す処理を作りたいのですが、いいやり方が思い 浮かびません。なにとぞよろしくお願いします。
状態を示す値struct ST::stを第一優先キー, 優先度を示す値struct ST::priorityを第二優先キー として,予め,配列をソートしておくべき。 ソートされていれば,至極単純な処理で済む。 何も難しいことは無い。
>>525 >526 を参考にしながらちゃんと教科書などで復習したほうがいいよ。
ここちゃんと理解しておかないと、後でつまづくよん(脅
540 :
デフォルトの名無しさん :04/06/17 20:54
誰かタスケテー(ノД`)
誰かボスケテー(ノД`)
>>522 >>542 必死に考えた「過程」を示してくれるとうれしいな。
多分いろんな人の勉強になると思う。
>>541 操作列2:
操作列2は、操作列1の4の操作を6と7の間に動かしただけ。
操作列1用をちょっと書き換えれば操作列2用のプログラムはすぐできるっしょ?
考察:
16進数は分かってるものとして、紙の上にそれぞれの割り当てられたメモリの
位置関係を図示してみると、なんか見えてこない?
レス後れてすいません。 497さんありがとうございます
次の10個のデータをバブルソートを使って小さい順に並べなさい 2,9,4,5,1,8,0,7,6,3 ただし、どのような並べ替えが進行するのかわかるように表示させてください。 わかりません。お願いします
548 :
◆yEbBEcuFOU :04/06/17 21:15
てsつ2
>>544 >必死に考えた「過程」を示してくれるとうれしいな。
俺は平均、最大値、最小値を求めるプログラムを作るためにはどうすればよいのか考えた
平均、最大値、最小値を求めるプログラムなのだからどんなこともできる
手始めに全裸で姉の部屋にアンゲロ、アンゲロとつぶやきながら飛び込む
タンスをこじ開けブラジャーを腰に巻きパンティーを頭にかぶる
姉が呆然としながら見てくるが平均、最大値、最小値を求めるプログラムなので気にしない
姉のベッドに潜りこみ「幸せだから!幸せだから!」と絶叫
姉は無言で部屋から立ち去る
だがまだ平均、最大値、最小値を求めるには不十分
次は妹の部屋にムッシュムッシュと叫びながら飛び込む
妹は着がえをしている最中だったが最大値、最小値を求めるプログラムなので無視
半裸で逆立ちをしながら
「俺に充電しろ!!俺に充電しろ!!」と絶叫
妹は大泣きで退散
確実に平均、最大値、最小値を求めるプログラムに近づく
開脚後転でトイレに飛び込み便座を外し首に掛ける
ゾンビの真似をしながら母の部屋に突撃
タンスを開けると一枚の写真発見
死んだ親父が俺を抱いている写真発見
俺は泣いた
>>538 う、うあまりソートってしたことなくて苦手なんですよ。
ソートするってことはtest関数の頭で
struct ST State[] = {
1,2,a
0,1,b
1,0,c
1,0,d
0,3,e
}; を
ローカル変数をとって
struct ST a[] = {
1,0,c
1,0,d
1,2,a
0,1,b
0,3,e
};
とするっていうことですか?ソート詳しい人助けてください。
なんか
>>522 の必死っぷりにワロタのでマジレス。
生徒のデータってのはなんなのか
読み込むのはファイルからか標準入力なのか
inpdateじゃなくてinpdataじゃないかのか
等をちゃんと書けば誰か答えてくれるよ、たぶん。
>>554 なんとなくわかります。
#include<stdio.h>
int main (void)
{
これ以降どうやればいいかわかりません。教えてください
>>522 int *inpdate (int *n) {
int i, *buf, *tmp;
scanf("%d", n);
tmp = buf = (int *) calloc(*n, sizeof(int));
for (i = 0; i < *n; i++) scanf("%d", tmp++);
return buf;
}
void avemxmn (int n, int *d, int *max, int *min, double *ave) {
int i; *max = INT_MAX; *min = INT_MIN; *ave = 0;
for (i = 0; i < n; i++, d++) {
*max = *max<*d?*max:*d; *min = *min>*d?*min:*d; *ave += *d;
}
*ave /= n;
}
int main () {
int size, max, min, *data = inpdate(&size);
double ave;
avemxmn(size, data, &max, &min, &ave);
printf("max = %d\nmin = %d\nave = %lf\n", max, min, ave);
free(data);
return 0;
}
駄目っぽかったら自己訂正よろ
中途半端に酔った頭ではコレが限界
>>547 わからない言葉を検索する癖をつけることは上達への近道かと
バブルソートで検索してでてきたサイト↓
ttp://www.miyagi-ct.ac.jp/ee/lecture/E3_01/Bubble_sort.html #include<stdio.h>
int main()
{
int i,j,k;
int data[]={2,9,4,5,1,8,0,7,6,3};
int max=sizeof(data)/sizeof(int);
for(i=0;i<max-1;i++)
{
for(j=i+1;j<max;j++)
{
if(data[i]>data[j])
{
data[i]=data[j]-data[i];
data[j]-=data[i];
data[i]+=data[j];
for(k=0;k<max;k++)//途中経過を表示
printf("%d ",data[k]);
printf("\n");
}
}
}
return 0;
}
>>547 #include <stdio.h>
void print_array(int a[], int size, int n){
int i;
for(i = 0; i < size; i++){
putchar(a[i] + '0');
if(i == n) putchar('-'); else putchar(' ');
}
putchar('\n');
}
int main(){
int a[] = {2,9,4,5,1,8,0,7,6,3};
int i, j, tmp, flg, size = sizeof(a) / sizeof(int);
flg = 1;
for(i = 0; i <size; i++){
if(flg) flg = 0; else return 0;
for(j = 0; j < size - 1; j++){
print_array(a, size, j);
if(a[j] > a[j + 1]){
tmp = a[j]; a[j] = a[j + 1]; a[j + 1] = tmp;
flg = 1;
}
}
}
return 0;
}
うお、同着。
書き込み前にリロードしたのに…壮絶だ…(^^;
あやうく書き込むとこだったヤシの数→(1)
以下に示す仕様の関数を作成せよ。numの桁数がdnumより大きい場合は、左詰で表示すること。 中央揃えで、左右に均等に分割できない場合は、前半を一文字多くせよ。 void print_binary(unsigned int num,int dnum,char pos); num: 表示する数字 dnum: 表示する桁数 pos: 表示位置 numをdnum桁で表示する。このとき、posの内容により、左詰('L')、中央揃え('C')、右詰('R') にせよ。また確認の為に、空白の代わりに_を表示せよ。例えば、 print_int(100,10, 'C'); __1100100_ print_int(100,10, 'L'); 1100100___ print_int(100,10, 'R'); ___1100100 のように表示する。
>>556 たいていの場合、最大値と最小値がINT_MAXとINT_MINになってしまうね。
以下の手順に従って作成せよ。 ●与えられた整数を2進数で表示するときの桁数を求める関数の作成 (例えばint count_bit(int num);) 下記のように再帰的に桁数を求める。 (a)num < 2 の場合: 1桁なので1を返す。 (b)num > 2 の場合: count_bitにnum/2を与えて呼び出すことで、2桁目以上の桁数を求め それに1を加えて返す。 ●与えられた整数を2進数で表示する関数の作成(例えばint print_bin(int num);) (a)num < 2 の場合: numに対応する文字を出力する(0の場合は'0'、1の場合は'1')。 (b)num >= 2 の場合: print_binにnum/2を与えて呼び出すことで、2桁目以上の桁を出力し そのあと1行目を表示する。 ●上記の関数を使用して空白の数を求め、dnumとposの値によって適当な空白を 数字の印刷の前後に入れるようにする。
>>552 あーすみませんでした。生徒のデータは身長で
読み込みは標準入力(キーボードからって意味?)と思います。
あとindateじゃなくてindataです。dateて、何なのよ俺。
教科書見てると配列使ってavemxmnとinpdataって関数作ってやるのかなと思ったんですが
まず配列からよく分かりません。今までだと配列は50以下とか条件あったけど今回は特に指定がないので・・・
あと関数もaveを平均みたいに一つならいいんですが複数だともうさっぱり分かりません。
いや正直1個でもよく分かんないんですけど。
要するにほとんど全部分かりませんスミマセンスミマセン。
>>556 お答えありがとうございます。でもtmpとかbufとかcallocとかが何のことか分からないです・・・
>>563 >>565 修正したものあげ直し
int *indata (int *n) {
int i, *buf, *tmp;
scanf("%d", n);
tmp = buf = (int *) calloc(*n, sizeof(int));
for (i = 0; i < *n; i++) scanf("%d", tmp++);
return buf;
}
void avemxmn (int n, int *d, int *max, int *min, double *ave) {
int i; *max = INT_MIN; *min = INT_MAX; *ave = 0;
for (i = 0; i < n; i++, d++) {
*max = *max<*d?*d:*max; *min = *min>*d?*d:*min; *ave += *d;
}
*ave /= n;
}
int main () {
int size, max, min, *data = indata(&size);
double ave;
avemxmn(size, data, &max, &min, &ave);
printf("max = %d\nmin = %d\nave = %lf\n", max, min, ave);
free(data);
return 0;
}
まだ違うかも
何のことか分からなかったら調べてください。
568 :
デフォルトの名無しさん :04/06/17 22:05
(A)大勢の学生について 学籍番号(五桁の文字列)、英語、数学、国語の点数(各100点満点)を次々に読み込んで、 各人の総得点を計算の上、(1)総得点の高い順に各人のデータを、さらに(2)各々の平均と 標準偏差を、次の形に出力するCプログラムを作成せよ。 Id−No Eng Math Jap Total −−−−− −−−− −−−− −−−− −−−−− T0802 83 100 84 267 T0809 85 80 90 255 ・・・・・・・・・・・ T0804 58 30 57 145 −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− Ave 72.5 75.8 68.1 216.4 Dev 15.3 19.6 12.4 33.3 但し、プログラム作成においては ・学生一人のデータは構造体としてまとめて、それにStudentとデータ型名を付けよ。 ・総得点の高い順にデータを並び替える際に、線形リストを用いよ。 初心者でCしか使えません。誰か親切な方教えてください。
>>565 配列版
#define DATA_MAX 50
int indata (int d[]) {
int i, n;
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%d", &d[i]);
return n;
}
void avemxmn (int n, int d[]) {
int i, max = INT_MIN, min = INT_MAX, ave = 0;
for (i = 0; i < n; i++) {
max = max<d[i]?d[i]:max; min = min>d[i]?d[i]:min; ave += d[i];
}
printf("max = %d\nmin = %d\nave = %lf\n", max, min, (double)ave / n);
}
int main () {
int data[DATA_MAX], size = indata(data);
avemxmn(size, data);
return 0;
}
多分これも間違ってる
>510・>524 本当にありがとうございました! どうしてもわかんなかったらまた来ます。
>562 print_binaryかprint_intかはっきりせい。 void print_binary(unsigned int num,int dnum,char pos){ int bits = count_bit( num ); if( bits > dnum ) print_binary( num >>(bits-dnum), dnum, 'L' ); else if( pos == 'L' ) { print_bin( num ); fill_space( dnum-bits ); } else if( pos == 'R' ) { fill_space( dnum-bits ); print_bin( num ); } else { /* 'C' */ if( (dnum-bits)%2) { printf( "_" ); print_binary( num, dnum-1, pos ); } else{ int n = ( dnum - bits ) /2; fill_space( n ); print_bin( num ); fill_space( n ); } } } あと、count_bit、print_bin、それから fill_space(int n){ n個空白を表示; } は自作しれ。
573 :
デフォルトの名無しさん :04/06/17 22:36
>>568 結構でかくなりそうでつね。
というわけで構造体の宣言だけかいときますね。
typedef struct student {
int eng ;
int math ;
int japanese;//japはまずかろう
int total ;
int average ;
int hyoujunnhennsa;//...
} student_t ;
typedef struct node {
student_t *data;
node_t *prev;
node_t *next;
} node_t ;
typedef struct list {
node_t *head;
node_t *tail;
} list_t ;
いじょ、あとはまかせた
>>459 とおそらく同じ学校のダメ生徒です。
>>475 ではfracの意味習ってないのでどなたか別でできませんか?
void main(void)でお願いします。。
はじめまして。 「150.99874ポンドをキログラムに換算せよ。 1ポンドは0.4536キログラムである。」 という問題で、出力の精度・書式が重要なのですが、 何故か正確な値が出力されません。 #include <iostream> #include <string> #include <iomanip> using namespace std; int main() { const float KILOGRAMPERPOUND = 0.4536; double pounds; double kilograms; cout.setf(ios::fixed,ios::floatfield); cout.setf(ios::showpoint); cin >> pounds; kilograms = pounds * (double)KILOGRAMPERPOUND; cout << setprecision(9) << kilograms ; return 0; } とすると、150.99874*0.4536=68.493028464なのに、 68.493026866という微妙に違う値が表示されてしまう。。。 KILOGRAMPERPOUNDをdouble型にすれば解決なのですが、 必ず1箇所はfloat型を使うこと、とされています。 何が原因なのでしょうか? ご教授ください。
578GET
>>575 #define float double
マジお願いします。切迫詰まってます。
>>574 >371-373 >405 >459-462 参照のこと。
次の文は数字文字5からその2進数を求めるものです。 a='5'-'0'; これを利用してキーボードから3個以内の連続する数字を文字として入力し、 それを2進数へ変更して整数型変数へ代入するプログラムを作成しなさい。 Cです。いまいち問題の意味がわかりません。お願いします。
>>537 Stateがあまりでかくならないんならループ回して終わり、のような気がするんだがそれじゃまずいのか?
582 :
デフォルトの名無しさん :04/06/17 22:52
ファイル名test.c #include<stdio.h> int main(void){ double k=77.7; printf("%lf\n",k); } このプログラムのkの値を コマンドラインから与えたいのですか よく分かりません。 test.c 88.8 test2.c ↑ 出力を書き出す atofなどを使うようです
難しい出題だな。意味が分からん。
どういう風な動きにすればいいかはわかるんですが、それをコ ードにするとうまく書けないんです。能力不足で。
>>582 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc != 2) {
printf("Parameter Error!\n");
return 1;
}
printf( "%lf\n", atof(argv[1]) );
return 0;
}
>>577 #defineは許されないと思います。
ほかにちゃんと正確な値を得る方法ないでしょうか?
そもそもどうして、こうなっちゃうのでしょうか?
どうか助けてください。。。
>>584 void test(unsigned char num, unsigned char st)
{
int nmin=-1;
int c;
for(c=0; c<5; c++)
{
if(State[c].st == 1 && State[c].priority < nmin)
nmin = State[c].priority;
}
for(c=0; c<5; c++)
{
if(State[c].st == 1)
{
if(State[c].priority == nmin)
(*State[c].func)(1);
if(State[c].priority == nmin)
(*State[c].func)(0);
}
}
}
>>573 ありがとうございます。しかし、力不足でへたれな自分はこれでもまだできません。 何回かに分けてでいいので、続きを書いてくれると助かります。
>587 訂正: 誤 int nmin=-1; 正 unsigned char nmin=0xff;
>>584 ほれ、ヒントだ。
int compare(const void *a, const void *b)
{
struct ST *x = (struct ST *)a;
struct ST *y = (struct ST *)b;
return (x->priority == y->priority)? 0: (x->priority < y->priority)? 1: -1;
}
struct ST[] = { ... };
void test(...)
{
/* ... */
/* State[]をpriorityでソート */
qsort(State, sizeof(State)/sizeof(struct ST), sizeof(struct ST), compare);
/* ... */
}
>>587 すごくわかりやすいです。
ただ最後って
if(State[c].priority == nmin)
(*State[c].func)(1);
if(State[c].priority == nmin)
(*State[c].func)(0);
じゃなくて
if(State[c].priority == nmin)
(*State[c].func)(1);
else
(*State[c].func)(0);
ですよね?
>>590 う、難しい。
592 :
コンパイルは通ったのですが… :04/06/17 23:38
/* 最小2乗法による線形近似 */ #include <stdio.h> #define NUM 9 double linear_lsm(double [], double [], int, double *, double *); void main(void) { double x[NUM]={3.4,1.3,6.1,9.5,8.2,8.9,7.7,2.0,4.8}, y[NUM]={0.20,0.04,1.37,13.73,6.17,8.76,3.77,0.07,0.50}; double a,b,r2; r2=linear_lsm(x, y, NUM, &a, &b); printf("y=%fe^%fx\n", a,b); printf("R^2=%f\n", r2); }
593 :
正解の値と異なるんです… :04/06/17 23:39
/* x[n],y[n]のデータから最小2乗法により y=ax+b の a,b を求める */ double linear_lsm(double x[], double y[], int n, double *a, double *b) { double xi, yi, x2, xy, d, y2, fy, s; int i; /*y=ax+bのa,bを求める部分*/ xi = yi = x2 = xy = 0.0; for (i=0; i<n; i++) { xi += x[i]; yi += y[i]; x2 += x[i] * x[i]; xy += x[i] * y[i]; } d = n*x2 - xi*xi; *a = (n*xy - xi*yi)/d; *b = (yi*x2 - xi*xy)/d;
594 :
592〜593 :04/06/17 23:40
すみません、間違えました
595 :
592〜595 :04/06/17 23:48
>>591 そうです。else にしといてください。寝ぼけてました。
# もう今日は寝まつ。
597 :
デフォルトの名無しさん :04/06/17 23:53
10,000 未満である2のべき乗の数を、1行に4個ずつ並べて、見やすくなるように整形して出力せよ。 とりあえず、以下のようなコードを作ってみたんですけど、 for (;i < 5000;) がすっきりしなくて困っています。 なんかすっきりしたいい方法ないでしょうか? #include <iostream.h> int main(void) { int i = 1; for (;i < 5000;) { for (int j = 1; j <= 4; j++) { if ( i < 5000 ) { i = i * 2; cout.width(4); cout << i << " "; } } cout << "\n"; } return(0); }
while使えばいいんじゃ?
600 :
デフォルトの名無しさん :04/06/18 00:18
>>599 やっぱりそうですかね?
実は模範解答らしきものがあるんですが、何入力しても0しか出ないし、これでいいのか謎です。
#include <stdio.h>
int main(void)
{
int c,d=0;
printf("3桁以内の整数を入力してください\n");
scanf("%c",&c);
if(('0'<=c)&&(c<='9'))
{
d=c-'0';
scanf("%c",&c);
if(('0'<=c)&&(c<='9'))
{
d=10*d+c-'0';
scanf("%c",&c);
if(('0'<=c)&&(c<='9'))
d=10*d+c-'0';
}
}
printf("%d\n",d);
return 0;
}
次の文といわれているものが、全然二進数を求めるものでもなんでもないのだが。
プロセッサ、メモリの視点で考えれば5の2進数表現が確かに得られるわけだが、 C言語の視点では求めていることにならないよな。
「3個以内」なのか「3桁以内」なのかわけわからんしな。 少なくともそんな支離滅裂な質問しか出来ない香具師に論理的思考力があるとは思えない。
アルェー 出題者は国語もCもできてませんNe(・3・)〜♪
日本語を母国語としているのか疑問
606 :
デフォルトの名無しさん :04/06/18 01:00
1 2 3 4 10 5 6 7 8 26 9 0 1 2 12 3 4 5 6 18 7 8 9 0 24 25 20 25 20 90 を出力するプログラムを作れ 教えて
#include<stdio.h> int main(){ printf("1 2 3 4 10\n"); printf(" 5 6 7 8 26\n"); printf(" 9 0 1 2 12\n"); printf(" 3 4 5 6 18\n"); printf(" 7 8 9 0 24\n"); printf("25 20 25 20 90\n"); return 0; }
意味あんのかな・・ #include <stdio.h> int main(void) { printf( "1 2 3 4 10\n" "5 6 7 8 26\n" "9 0 1 2 12\n" "3 4 5 6 18\n" "7 8 9 0 24\n" "25 20 25 20 90\n" ); return 0; }
こんなコードで被ってしまったスマソ
ところで、
>>606 はこの数字の法則性をわかっているのか?
612 :
デフォルトの名無しさん :04/06/18 01:18
>>610 2次元配列を使って解いてほしいのですが…
一番右の列と一番下の行がそれぞれの合計になっているとおもいます
とりあえず・・ #include <iostream> int main(void) { std::cout << "1 2 3 4 10\n" << "5 6 7 8 26\n" << "9 0 1 2 12\n" << "3 4 5 6 18\n" << "7 8 9 0 24\n" << "25 20 25 20 90\n"; return 0; }
#include <stdio.h> void main(void){ const double e = 2.718281828459045235360287471; double exp = 1.0; double factorial = 1.0; int n; for (n = 1; n <= 20; n++){ factorial = factorial * n; exp = exp + 1.0 / factorial; printf("%.20f %2d %.20f\n", exp, n, e - exp); } }
#include <iostream> int main() { int i = 2,cnt = 1; std::cout.width(5); while(i<10000) { std::cout.width(5); std::cout << i; if(cnt % 4 == 0) std::cout << std::endl; cnt++; i <<= 1; } return 0; }
int main(void) { int i,j,tbl[6][5]={ {1, 2, 3, 4, 10}, {5, 6, 7, 8, 26}, {9, 0, 1, 2, 12}, {3, 4, 5, 6, 18}, {7, 8, 9, 0, 24}, {25, 20, 25, 20, 90} }; for(i=0; i<6; ++i){ for(j=0; j<5; ++j) printf("%d",tbl[i][j]); putchar('\n'); } return 0; }
617 :
デフォルトの名無しさん :04/06/18 01:30
調べ方が悪いのか、答えがわからないので質問。C言語です。 srandの種子と乱数の関係が宿題です。 ─漏れ的考え─ 1.でっかい乱数表のなかから種子の値を開始値みたいにつかって乱数を生成 2.乱数表はいくつもあって、種子の値で、表が変わる 3.表などなく、種子の値を使って乱数を生成する このうちのどれかだとおもうのですが・・・ 問題がわかりずらくてすいません。。。
>>617 確かに問題は分かりづらい。
実装に限った話でいえば、「よくある」のは3.
えっと、書き忘れです。 標準ライブラリのrandとsrandを使った場合です。
レスありがとですっ!
>>618 今読み直すとホント分かりにくいですね(汗
>>620 ほほー こんな風にも乱数は生成できるのですねー 勉強になりました
だいぶ問題の書き方が悪かったみたいです^^;;
randとsrandを使った場合、乱数はどのように生成されているのですか?
やっぱり
>>620 の教えてくれた方法を勝手にやってくれているのかなぁ・・・。
622 :
デフォルトの名無しさん :04/06/18 02:28
>>616 tbl[5][4]={
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 0, 1, 2},
{3, 4, 5, 6},
{7, 8, 9, 0}}
だけを入力して6行目と5列目は計算で出して欲しいです
s+=tbl[i][j]を使ってた気がします
何故求められているプログラムの仕様を小出しにして伝えるのか。
for文を2重で回せばすぐできるんじゃね?
>>623 出題内容を理解せずに質問する人が増えたよね。
int main(void) { int i,j,tbl[5][4]={ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 0, 1, 2}, {3, 4, 5, 6}, {7, 8, 9, 0} }; for(i=0; i<5; ++i){ int s=0; for(j=0; j<4; ++j){ printf("%d",tbl[i][j]); s+=tbl[i][j]; } printf("%d\n",s); } {int total=0; for(j=0; j<4; ++j){ int s=0; for(i=0; i<5; ++i) s+=tbl[i][j]; printf("%d",s); total+=s; } printf("%d",total); } return 0; }
寝てた。おはよう。
>>603 問題と模範解答は問題集から丸写し。
やっぱおかしいよね。
いいやもう。寝る。
>>628 要するに
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buff[4];
printf("3桁以下の数値を入力: ");
fgets(buff, 4, stdin);
printf("%d\n", atoi(buff));
return 0;
}
がやりたいんだろう。
>>611 x=1 y=2 z=3 を初期値にしたい場合、jacob() の方は
ans_xyz newans = { {1, 2, 3}, 0 }, oldans;
gauss_seidel() の方は
ans_xyz oldans = { {1, 2, 3}, 0 };
にする。
>>630 なるほど、やってみることにいたしやす。
dクスでした。
if文で月を入力したら季節を表示するプログラムなんですけどif文の中にはなんといれればいいんでしょうか ちなみに3月〜5月を「春」、6月〜8月を「夏」、9月〜11月を「秋」、12月〜2月を「冬」です
>>634 if(x>=3 && x<=5){//春
}else if(x>=6 && x<=8){//夏
}else if(x>=9 && x<=11){//秋
}else if(x==12 || (x>=1 && x<=2)){//冬
}
4桁の整数の数当てゲームを作る宿題です。 プログラム側で4桁の乱数(1000〜9999)を発生させて、こちらが4桁の数を入力した時に 桁数と数字が合っていれば+1ホームラン、 桁数は違うが同じ数字が違う桁数に存在すれば+1ヒットという具合です。 ホームランした数字はヒットの検索には含めない。 (例1)乱数;3633 入力;3663 2ホームラン!1ヒット! (例2)乱数;1234 入力;3303 0ホームラン!1ヒット! てな感じです。 一応自分では乱数と入力の4桁のint型の整数を 4つに分割して別々の配列に格納して比較しているんですが…。 {ホームランした数字はヒットの検索には含めない}がうまくいきません。
間違いましたw (例1)は乱数;3633 入力;3663 3ホームラン!0ヒット! です。
>>636 エスパーでもない限りどう巧くいかないのか判らんのだが。
>>635 最後のifは蛇足。∵それ以前に春夏秋の判定が終わっているのだから。
すいません、 うまくいかないのは乱数にある1つの数に対して その数が入力に複数あるような時です。 乱数4344 入力3132 のような時に2ヒットになってしまいます
この類のゲームって 乱数の中に同じ桁の数が入っちゃいけないんじゃないっけ?
0〜9 用の配列を、「ヒットせず」で初期化して、 「ヒット」、「ホームラン」それぞれのフラグを入れていけばいい ただしホームランをヒットで上書きしない また、ホームランの数は別途数える 最後に、結果的にヒットになった数字がいくつあるか数える
>>639 ※乱数と入力文字は、桁ごとに配列に入れてあるとして
int flag[10]; //要ゼロ初期化
for (i = 0; i < 桁数; i++) flag[乱数[i]] = 1;
for (i = 0; i < 桁数; i++) {
if (flag[入力[i]]) {
ヒット++;
flag[i] = 0;
}
}
かぶった
>>556 返事が送れましたがおかげで問題を解くことができました。ありがとうございます。
教えてくださってありがとうございます。 なんとか終わらせれそうです。
>>647 (1) 65行目くらいの、if (strcmp のとこの符号を書き換える
(2) person の仕様を変えないとすれば、再帰かな
main の最後の3行消して代わりに print(root);
関数の実装は
void print(struct person *cur) {
if (cur->next != NULL) {
print(cur->next);
}
printf("%s\n%s\n%s\n%s\n\n",cur->address,cur->name,cur->hname,cur->phone);
}
1個先以降の表示を先にやって、今のところを表示する
×符号 ○不等号
>625 ありがとうございます。問題文はあれで全文なんです。入力については一言も・・・ scanfをつかえばできますかね? 教科書の例題を見てなんとかやってみます。 本当に助かりました。
>>635 遅れましたがありがとうございます〜助かりました
>>649 >int print_bin(int num){
> if(num < 2) printf("%s\n",num);
> else if(num >= 2) return print_bin(num/2);
>}
おいおい,その printf, %s に (int) 渡してどうする?
これをやりたいのか?
void print_bin(int value){
if( value ){ print_bin(value
>>1 ); printf("%d", value&1L); }
}
655 :
デフォルトの名無しさん :04/06/18 17:37
ポインタの問題なんですがちょっと分らないので教えてください。 文字列「ERADRE」を1次元配列に格納し、各配列要素に格納されたデータの番地とその内容をポインタを用いて 表示するプログラムを作成せよ。 また、1次元配列に格納された文字列を「READER」と表示するプログラムをポインタを用いて作成せよ。 と言う問題です。 後半が良く分らないので「また、〜」以降の答えを教えてください。
#include <stdio.h> int main(void) { char szStr[] = "ERADRE"; int order[] = {1, 0, 2, 3, 5, 4}, i; for(i = 0; i<6; i++) printf("%c", *(szStr+order[i])); return 0; }
>>655 某M橋が、「添え字を使ってアクセスしといて、文句言われたら"単なるシンタックスシュガーじゃないですか!"
って反論しなさい」って言ってるタイプの問題そのままな気がw
>>656 >char szStr[] = "ERADRE";
動けばいいというものではない。減点。
>int order[] = {1, 0, 2, 3, 5, 4}, i;
無理に1行に詰め込んで可読性を下げるな。減点。
>printf("%c", *(szStr+order[i]));
空白明けろ。減点。
>>658 putchar()を使えとの指摘がない。減点。
>>658 好みに関わるコーディングスタイルまで採点対象にしない。減点。
模範例を示さない。0点。
> 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。 > 模範例を示さない。0点。
>>655 これだけポインタ使えば,出題者も満足だろう。
int main(){
char *p; int i;
char str[]="ERADRE";
const char *TARGET="READER";
for(TARGET; *TARGET; ++TARGET){
for(i=0,p=str; i<strlen(p); ++i)
if( *TARGET == p[i] ){ putchar(p[i]); braek; }
}
}
>>658 >>char szStr[] = "ERADRE";
>動けばいいというものではない。減点。
これ意味わかんね。
>>char szStr[] = "ERADRE"; >動けばいいというものではない。減点。 これは別にふつーでは? >>int order[] = {1, 0, 2, 3, 5, 4}, i; 多分そうじゃなくて、二字ずつに区切って後ろから表示するんではなかろうか? >模範例を示さない。0点。 こんなのはどうですかね? #include <stdio.h> #include <string.h> int main(void) { char szStr[] = "ERADRE"; char *p; for (p = szStr + ((strlen(szStr) - 1) / 2) * 2; p >= szStr; p -= 3) { putchar(*p); p++; if (*p != 0) putchar(*p); } return 0; }
>>char szStr[] = "ERADRE";
>動けばいいというものではない。減点。
>>658 は
char szStr[] = "ERADRE";
と
char *szStr = "ERADRE";
が同じだと思ってるのかな。
とりあえず
>>656 >char szStr[] = "ERADRE";
ハンガリアン ダメゼッタイ。減点。
なんかこれも問題自体の日本語が微妙じゃない?
宿題をそのまま貼るとどうしても問題自体の意味がおかしくなるわな それに似たような問題をやったあとに宿題出されてるんだろうからさ
>>658 はきっと、sizeof(szStr) が 7 になる事にご立腹なんだよ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=80&fi=no (1)このプログラムを改良することにより、読み込んだ英文から単語を切り出すプログラムを作成せよ。
単語の区切りは、スペースやコンマ、ピリオド、ダブルクォーテーションなどを手がかりにすること。
単語に余計な記号が付かないように注意すること。また、出力に関しては1行1単語でファイルに出力せよ。
※空行は除くこと。標準関数(ctype.h)や==演算子を利用する。
(実行例)One two three,four.
(出力ファイル例)
One
two
three
four
(2)(1)で切り出した単語には、大文字と小文字が混じっている。全て小文字で構成される単語に変換する
プログラムを作成せよ。結果は別のファイルに出力せよ。
(3)(2)で切り出した単語をアルファベット順にソートするプログラムを作成せよ。結果は別のファイルへ出力せよ。
※バブルソートを用いるとよい。
お願いします。
>>650 実行したら
エラー E2356 list.c 80: 'print' の再宣言で型が一致していない
と出ました・・
ctype.h なんていう関数は聞いたことがない。
676 :
デフォルトの名無しさん :04/06/18 22:26
>>664 p[0]とp[1]使えばいいのに。
"ポインタ"変数は既に使っているのだからな。
>>678 いや、出題者的には、ポインタの理解と練習のためには p[1] とか使って
ほしくないとか思うんじゃないかなと思ったもんで。
>>680 2つ毎の参照という点から出題意図を考えるに
むしろ,使うべきだと思われる。
アドレス演算で変化させた任意のポインタ変数を基準に,
配列と同様の,[]演算子によるインデックス参照が可能 …とな。
char *p;
for (p = szStr + ((strlen(szStr) - 1) / 2) * 2; p >= szStr; p -= 2) { /***ポインタ演算でpの値を変化***/
putchar(p[0]); /*** 配列じゃないけど,インデックス参照 ***/
if (p[1] != '\0') putchar(p[1]); /*** インデックス値が固定で,ポインタのアドレス値が変化する ***/
}
>>665 char szStr[] = "ERADRE";
だと無駄なコピーが発生するね。
>>683 をいをい…、無駄なポインタ変数が出るのは
char *szStr = "ERADRE";
だよ。
釣れまつか
>無駄なコピー >無駄なポインタ変数 ……
>>684 無駄なコピーって何だ?
>>655 は
>文字列「ERADRE」を1次元配列に格納し
って書いてるけど
見てるほうが恥かしくなるな
結局どう書いたらみんな納得するんだよ!?
682 にはまだ文句が付いてないようだが。
テーラー展開について質問しようと思ってスレ見たら、同じような人がいて、
その人達のソースを参考にして作ってみたら、やっぱできませんでしたorz
自分の場合、x=-5.5のときの真値e^-5.5=0.00408677…と
e^x= 1+x+x^2/2!+x^3/3!+…
e^x=1/e^-x=1/(1+-x+(-x)^2/2!+(-x)^3/3!+…
の二通りで計算し比較せよという課題です。結果が違うらしいけどなんでだろ?
>>459 のソース
>>614 をいじって改造してみたんですが力不足で上手くいきませんでした・・
どなたか
>>614 みたいな分かり易いソースをお願いします!
>>692 じゃ、その 614 を改造して…
double myexp(double x)
{
double exp = 1.0;
double factorial = 1.0;
double x_n = 1.0;
int n;
for (n = 1; n <= 50; n++) {
factorial = factorial * n;
x_n *= x;
exp = exp + x_n / factorial;
}
return exp;
}
int main(void)
{
const double ans = 0.0040867714384640669934647026847208;
printf("e^-5.5 %.20f =%.20f\n", myexp(-5.5), ans - myexp(-5.5));
printf("1/(e^5.5) %.20f =%.20f\n", 1 / myexp(5.5),
ans - (1 / myexp(5.5)));
}
695 :
デフォルトの名無しさん :04/06/19 12:30
作り方のわからないプログラムの課題がでたのでお願いします。 <問題> 英語のフレーズを読み込んで、それをモールス符号に変換するプログラムを書け。また、モールス符号のフレーズを読み込んで、それを英語に変換するプログラムを書け。 ただし、モールス符号の各文字は1個の空白で区切り、各単語は3個の空白で区切ること。 モールス符号の国際規格 A .- B .--- C -.-. D -.. E . F ..-. G--. H .... I .. K -.- L .-.. M -- N -. O --- P .--. Q --.- R .-. S ... T - U ..- V ...- W .-- X -..- Y -.-- Z --.. 1 .---- 2 ..--- 3 ...-- 4 ....- 5 ..... 6 -.... 7 --... 8 ---.. 9 ----. 0 ----- 以上です。どうかよろしくお願いします!
性器表現
>>694 えと、恐縮ですがなんか難しいです、、あと
>>614 同様
void main(void)だと嬉しい、、
>>696 Jがないのは仕様ですか?
>>697 >void main(void)だと嬉しい、、
ワロタ
void main(void) { for(;;); }
701 :
デフォルトの名無しさん :04/06/19 12:55
>>701 エラーメッセージぐらい貼れよ。
それにしてもインデントの仕方がすごいな。
>>697 元々 614 にあった
e^x= 1+x+x^2/2!+x^3/3!+… (1)
と言う計算部分を、myexp() の中に移動しただけです。それは判りますか?
二番目の
e^x=1/e^-x=1/(1+-x+(-x)^2/2!+(-x)^3/3!+… (2)
の式は、(x=-5.5 の時、-x=5.5なので)、(1)式を用いて
=1/mpexp(-x)=1/myexp(5.5)
と書いているだけです。printf() の引数の所にこの記述があります。
なお、OS から呼び出されて起動するようなプログラムでは、必ず int main(〜) で
ないといけないという決まりがあります。void main(void) でも動いているのなら、
それは単にあなたのコンパイラや環境が運に恵まれていただけです。
#include <stdio.h> #include <string.h> void main() { char *codes[] = { ".-", ".---", "-.-.", "-..", ".", "..-.", "--.", "....", "..", "J", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----.", "-----" }; char *chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; char *word = "SOS HELP HELP ME 945YEN YARU KARA TASUKETE"; for (int i=0; i<strlen(word); i++) { char c = word[i]; for (int j=0; j<strlen(chars); j++) { if (chars[j] == c) { printf("%s", codes[j]); break; } } printf(" "); } } J がぬけとる
J: .---
707 :
デフォルトの名無しさん :04/06/19 13:04
>>701 search関数内のnatって・・・
初歩的なミスだな。
問題ろくに読んでなかった(w
すまそ、707のレスは忘れて
713 :
デフォルトの名無しさん :04/06/19 13:13
#include <stdio.h> #define MAX 100 struct member { int number; int count; }data[MAX]; int datanum = 0; int search(int nat); main() { 省略 return 0; } int search(int nat){ int i; for( i = 0; i < datanum; i++ ) if( nat == data[i].number ) {return ( i );} return -1; }
714 :
デフォルトの名無しさん :04/06/19 13:15
11parase error before cahracter 0201 はウンコ的な文字が入力されてるため。
ウンコ的な文字とは、 日本語入力の空白文字とか・・・
>>700 エディタ?
>>704 運に恵まれた?
intとかvoidとか習ってないんです、、今までずっとvoid main(void) だし。
つってもまだ初めて一月あまりですが、、
>>713 >>714 ありがとうございました。無事にできました。
0201はウンコ的ですか(藁)覚えときます。勉強になりました。
>>709 おまいがインデントに全角スペース使ってるからだよ!
あとwhileの中で初回とそうでないときを分ける必要は
別にないかと。
>717 int も知らないやつになぜ実数の数値計算の宿題が出るのかと小一時間(ry
>>720 void main は おまじないだと教わりました。いずれわかると。
でもそうもいってられないようなのでどっかで調べます。
ソースを作ってくれた方有難うございました。
「これはオマジナイだよ」 「赤ちゃんはコウノトリがはこんでくるんだよ」
>>721 int a;
とかは判るよね? float x; もしくは double x; を使う宿題もらうくらいだから。
その int なんだけど。 関数は分かる? 以下分かると仮定して:
int main(〜) { 〜 } と言う風に書く時、それは、main と言う関数が int 型の返り値を返す
と言う意味。int の代わりに void を書くと、(void は中身のない、空の、という意味なので)
何も返さないという意味になる。
ただし、main 関数はプログラムが開始する時に呼び出される特別な関数なので、
勝手な形で作ってはいけなくて、int main (int argc, char *argv[]) と言う形である
こと、と決められてる。
そして、 int argc, char *argv[] の部分は、利用しないんなら省略できることになっ
てるが、だからといって勝手に ***別の型に変更してはいけない***
725 :
デフォルトの名無しさん :04/06/19 14:16
整数データを接点に持つ二分木は、 typedef struct node *Tree typedef struct node { int data; Tree left_subtree; Tree right_subtree; } Node; という風に定義された構造体を木の接点とし、これらをポインタで繋げることに よって表すことができる。 この様に表された二分木の根へのポインタが引数と して与えられた時、その二分木の大きさ(接点の個数)を調べて返すCの関数 int size(Tree t) を定義せよ。 構造体は習ったばっかりなので、理屈はなんとなくわかりますがプログラムが書けません。 言語はCでお願いします。
>>724 >ただし、main 関数はプログラムが開始する時に呼び出される特別な関数なので、
>勝手な形で作ってはいけなくて、int main (int argc, char *argv[]) と言う形である
>こと、と決められてる。
>
>そして、 int argc, char *argv[] の部分は、利用しないんなら省略できることになっ
>てるが、だからといって勝手に ***別の型に変更してはいけない***
おいおい、規格では
int main(void)
int main(int argc, char *argv[])
上記2つのいずれかと等価な方法
上記3つ以外の処理系定義の方法
と決まっている(C99)。
>>726 >int argc, char *argv[] の部分は、利用しないんなら省略できる
の省略なしの場合が
>int main(int argc, char *argv[])
省略の場合が
>int main(void)
のことのつもりで書いたわけです。
>上記3つ以外の処理系定義の方法
は「運に恵まれた」ってやつね。
int size(Tree t){ if(t) return 1+size(t->left_subtree)+size(t->right_subtree); else return 0; }
>>705 !!!英語のフレーズを読み込んで!!!
!!!!また、モールス符号のフレーズを読み込んで!!!!
!!!!各単語は3個の空白で区切ること。!!!!!
よって,ボツ
>>728 int size(Tree &t) じゃないの?
あと
> 1+
根はひとつだから再帰に含むと重複してカウントされるかと
>>727 >...のつもりで書いたわけです。
了解です。
けど「省略」っていうと
"int main(int argc, char *argv[])" ⊃ "int main(void)"
って感じちゃうな。オレだけかもしれないけど。
前者と後者は対等だと思うのでちょっと引っかかりました。
>>上記3つ以外の処理系定義の方法
>は「運に恵まれた」ってやつね。
んー「処理系定義」と「運がいい」は違う気がする。
例が思いつかなくてごめんなさい。
スレ違いなんでこの辺で失礼します。
>>654 これに従ったもので・・
●与えられた整数を2進数で表示する関数の作成(例えばint print_bin(int num);)
(a)num < 2 の場合: numに対応する文字を出力する(0の場合は'0'、1の場合は'1')。
(b)num >= 2 の場合: print_binにnum/2を与えて呼び出すことで、2桁目以上の桁を出力し
そのあと1行目を表示する。
プログラムからフローチャートを書け って宿題が出た漏れはどうしたらいいのやら・・・OTZ
>>730 >Cの関数
> int size(Tree t)
>を定義せよ。
C++の国の人はお帰り下さい。
>654 value=0の時に何も表示されませんよ?
>736 いや、私572なんですけど。
738 :
695です :04/06/19 17:26
739 :
デフォルトの名無しさん :04/06/19 17:26
最初に四則演算を示すアルファベット1文字を入力し、次に二つの実数を 入力してその演算を行う。これを繰り返すプログラムを作りなさい。 アルファベット1文字に対して以下の演算を対応付ける。 p ・・・ + m ・・・ − d ・・・ ÷ t ・・・ × 文字qを入力した場合にプログラムを終了することとする。これ以外の文字 が入力された場合は無視する(何もしない)。 という問題です。文字の授業に入ってからなんかわからなく なってしまいました・・・。わかる方どうぞよろしくお願いします<(_ _)>
>>733 Latexとか…、たしかフローチャート作成支援のスタイルファイルが落ちてたはず。
742 :
デフォルトの名無しさん :04/06/19 17:55
恥ずかしい741晒しage
なんで t なの times なの
>>730 >> 1+
>根はひとつだから再帰に含むと重複してカウントされるかと
何を言いたいのかわけわからん。
お前さんの正しいと思うコードを晒してくれ。
>int size(Tree &t) じゃないの?
出題がC言語限定な上に,
typedef struct node *Tree;
だぞ。
>>739 #include <stdio.h>
int main(void)
{
int ch;
double x, y;
for (;;){
puts("input operation");
ch = getchar();
if (ch == 'q') break;
printf("x:"); scanf("%lf", &x);
printf("y:"); scanf("%lf", &y);
switch(ch){
case 'p': printf("%f + %f = %f\n", x, y, x+y); break;
case 'm': printf("%f - %f = %f\n", x, y, x-y); break;
case 'd': printf("%f / %f = %f\n", x, y, x/y); break;
case 't': printf("%f * %f = %f\n", x, y, x*y); break;
}
getchar(); /*改行飛ばし*/
}
return 0;
}
746 :
デフォルトの名無しさん :04/06/19 22:30
このプログラムがVC++6.0で動きません 古い規格で組まれてるコードだと言ってる人もいるんですが どこをなおさないといけないのやらわかりません。 おしえてください #include <stdio.h> #include <string.h> class String { protected: intl; char*s; public: String(char *str) { l = strlen(str); s = new char[l+1]; strcpy(s, str); } voidset(char *); String*append(char *); String *append(String *); };
747 :
デフォルトの名無しさん :04/06/19 22:31
void String::set(char *str) { int len; if((len = strlen(str))>=l) { if(s != 0) delete s; l = len + 1; s = new char[l]; } strcpy(s,str); }
748 :
デフォルトの名無しさん :04/06/19 22:32
String *String::append(char *str) { int len; char *os; len = strlen(str); if(s != 0) len += strlen(s); if(len >= l) { l = len + 1; os = s; s = new char[l]; if(os != 0) { strcpy(s, os); delete os; } } strcat(s, str); return this; } String *String::append(String *str) { String *ps = new String(s); ps->append(str->s); return ps; }
749 :
デフォルトの名無しさん :04/06/19 22:32
class Pattern: public String { int d[256]; void setd(); public: Pattern(char *s):String(s) { setd(); } int find(const char *); }; void Pattern::setd() { char *pt; int i; int length = strlen(s); for(i = 0; i<256; i++) d[i] = i; for(pt=s,i=length-1;i>0;i--,pt++) { d[(unsigned int)*pt] = i - length + 1; } };
750 :
デフォルトの名無しさん :04/06/19 22:35
int Pattern::find(const char *text) { int i,j; const char *pt; int textlength; int nvd; int maxd; int length = strlen(s); textlength = strlen(text); maxd = 0; i = 0; j = length -1; pt = text + i + j;
751 :
デフォルトの名無しさん :04/06/19 22:35
while(i + j < textlength) { while(j>=0) { nvd = d[(unsigned int) *pt] +j; if(nvd > maxd) maxd = nvd; if(*pt !=s[j]) { i += maxd; j= text+i+j; maxd = 0; break; } else { if(j==0) return i+1; else j--, pt--; } } } return 0; }
>>746 エラーメッセージとかは?
あと長いソースを貼るときは
>>1 とか活用しる。
753 :
デフォルトの名無しさん :04/06/19 22:41
main(int argc, char** argv) { const int maxLen = 200; char line[maxLen+1]; int len = 1; int cn; int n; Pattern *pp; if(argc!=2) exit(1); pp = new Pattern*(argv+1); while(gets(line)!=0) { if((n = pp->find(line))>0) { printf("(%3d):found at %d", ln, n); cn = n; while((n = pp->find(line+cn))>0) { cn += n; printf(",%d", cn); } printf(".\n"); }else printf("(%3d):not found.\n",ln); ln++; } }
754 :
デフォルトの名無しさん :04/06/19 22:47
error C2061: 構文エラー : 識別子 'String' がシンタックスエラーを起こしました。 error C2059: 構文エラー : ';' error C2449: '{' を見つけました (関数のヘッダーがないかもしれません)。 error C2059: 構文エラー : '}' error C2143: 構文エラー : '{' が '*' の前に必要です。 error C2143: 構文エラー : '{' が ':' の前に必要です。 error C2059: 構文エラー : ':' error C2143: 構文エラー : '{' が '*' の前に必要です。 error C2143: 構文エラー : '{' が ':' の前に必要です。 error C2059: 構文エラー : ':' error C2061: 構文エラー : 識別子 'Pattern' がシンタックスエラーを起こしました。 error C2059: 構文エラー : ';' error C2059: 構文エラー : ':' error C2143: 構文エラー : '{' が ':' の前に必要です。 error C2059: 構文エラー : ':' error C2143: 構文エラー : '{' が ':' の前に必要です。
ソース連投キモイ
757 :
デフォルトの名無しさん :04/06/19 22:51
error C2059: 構文エラー : ':' error C2057: 定数式が必要です。 error C2466: サイズが 0 の配列を割当てまたは宣言しようとしました。 error C2133: 'line' : サイズが不明です。 error C2065: 'Pattern' : 定義されていない識別子です。 error C2065: 'pp' : 定義されていない識別子です。 warning C4552: '*' : 演算子にプログラム上の作用がありません。作用を持つ演算子を使用してください warning C4013: 関数 'exit' は定義されていません。int 型の値を返す外部関数と見なします。 error C2065: 'new' : 定義されていない識別子です。 error C2146: 構文エラー : ';' が、識別子 'Pattern' の前に必要です。 error C2297: '*' : 不正な右オペランドです。 error C2223: '->find' : 左側が構造体か共用体に対するポインタではありません。 error C2065: 'ln' : 定義されていない識別子です。 error C2223: '->find' : 左側が構造体か共用体に対するポインタではありません。
嵐認定
759 :
デフォルトの名無しさん :04/06/19 22:55
ざっとみたところ、コンパイラの問題ではない。 ソースがバグってる。
>>746 まずexit()使うんならstdlib.hもインクルードしとく。
×intl; ○int l;
×voidset ○void set
Pattern::find()内、j= text+i+j;これじゃint型の変数にchar *ポインタ代入してる。
あとmain()の中身にlnとかいう変数がある。lenか?
ついでに122行目が意味不明。pp = new Pattern(argv[1]);のことか?
中身ちゃんと読んでないので悪しからず。
762 :
デフォルトの名無しさん :04/06/19 23:42
>>761 ありがとうございました。
exit()をreturn()にし、スペースを直し、打ち込みミスを訂正し、
122行目を仰るとおりになおし、
mainの前にint、メインの終わりにreturn 0を書き足し、
lnをlenに直したところ
無事にうごきました!!
しかしちゃんと読んで無くてもそこまで分かるなんて761さんは
すごいですね。
連続ソース投稿どうもご迷惑おかけしました
>>745 おお、これを参考にしつつ文字のプログラムも理解できるように頑張ります
本当にありがとうございました<(_ _)>
764 :
デフォルトの名無しさん :04/06/20 01:11
ファイルのデータを読み込みたいのですが、 例えばこれはどこが間違っているのでしょうか? よろしくお願いします。 【suuji.dat】 640 83.7 【main】 #include <stdio.h> #include <math.h> int main (void){ int hatyou; double a; FILE *S; S=fopen("suuji.dat","r"); fscanf(S,"%d%f",&hatyou,&a); printf("%d %f\n",hatyou,a); fclose(S); return 0; } 【実行結果】 640 -9255960488578375300000…0.000000 ↑になってしまいます。
ぱっと見、%lfにするかaをfloatにするか かな?
766 :
デフォルトの名無しさん :04/06/20 01:25
>>765 すっごい!できました!
感激です。ありがとうございました!
1年半Cから離れていただけで、こんなにも忘却している自分が恥ずかしいです。
(ファイル操作は初めてやったんですけど…。)
x-y座標上に点P,点Nがあり、点Pから点Nを見たときの方角を出力するプログラムを作成してください。 なお方角は八方位で北:0 北西:1 西:2 南西:3 南:4 南東:5 東:6 北東:7として数値で表す。 座標は第一象限のみの場合でよい(↓こんな感じです) 北 │ │ │ ・P(px,py) │ │ │ │ │ ・N(nx,ny) │ │ 西.. ─┼─────────────東 多分arctanとか使ってやると思うのですが数学苦手で。 あと例えば東と判定するのは真東だけじゃなく 東北東気味、東南東気味のものも含むようにしなくてはいけないそうです。 言語はCでお願いします。
fscanf(S,"%d %f",&hatyou,&a);
>767 +-----+P | | + N 角度計算するだけだろ?
771 :
デフォルトの名無しさん :04/06/20 01:51
積分をする関数って<math.h>に入っていたりしませんか? それとも自分で作らなくてはならないのでしょうか? 提出期限の迫った課題に追われています。 ご存知の方、教えてください。 よろしくお願いします。
772 :
デフォルトの名無しさん :04/06/20 02:29
WIN32APIで、jpg画像の色情報を読み込んで R、G、Bごとに画素値のヒストグラムを作るプログラムを作りたいのですが jpg画像の色情報はどのように取得すればよいのでしょうか? よろしくお願いします。
>>767 すまん、ミス。角度がマイナスになる場合を忘れてた。
double angle = RadToDeg(atan2(ny-py,nx-px));
の次の行に
if(angle<0)angle+=360;
を加えてください。
>>769-770 ,772,774
大体分かりました、ありがとうございます。
予想と南北が逆でしたが理解できました。
NとPがかぶったらどうなるんだろ〜。
げっ、角度を数値で表すのだった。 課題をよく読んでなかったです…。 でもatan2で角度を求めたら似たようなことやるだけなので 後はがんがれ…(-_-
gimpでできそう
>>773 すまん、ミス。
×#include<olectl.h.>
○#include<olectl.h>
構造体配列って大域変数でも定義できるよね?
782 :
デフォルトの名無しさん :04/06/20 10:42
age
783 :
デフォルトの名無しさん :04/06/20 10:43
【問題】 コンピューターがランダムでグー、チョキ、パーを出す、 ジャンケンのプログラムを作成しなさい。 また、勝ち、負け、あいこの結果も表示させなさい。 例) g(グー)c(チョキ)p(パー)のどれかを入力してください。 (printfで表示させる。) g (プレイヤーが入力。) じゃんけんぽん! (printfで表示させる。上がgcp以外の時は「エラー」を表示させ、最初の処理に戻る。) チョキ (コンピュータがランダムで表示。) あなた【グー】、コンピュータ【チョキ】で【あなたの勝ち】です。(結果表示。) よろしくお願いします。
>>783 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int get_index(int h){
switch(h){
case 'g': h = 0; break;
case 'c': h = 1; break;
case 'p': h = 2; break;
default: h = -1;
}
return h;
}
int main(){
char buf[256];
int h1, h2;
char *hand[] = {"グー","チョキ", "パー"};
char *result[] = {"引き分け", "あなたの負け","あなたの勝ち"};
srand(time(NULL));
for(;;){
printf("g(グー)c(チョキ)p(パー)のどれかを入力してください。\n");
h1 = get_index(*fgets(buf, sizeof(buf), stdin));
if(h1 == -1){ printf("エラー"); continue;}
printf("じゃんけんぽん!\n");
h2 = rand() % 3;
printf("あなた【%s】、コンピュータ【%s】で【%s】です。\n",hand[h1], hand[h2], result[(h1 - h2 + 4) % 4]);
}
return 0;
}
間違ってた・・・ ×printf("あなた【%s】、コンピュータ【%s】で【%s】です。\n",hand[h1], hand[h2], result[(h1 - h2 + 4) % 4]); ○printf("あなた【%s】、コンピュータ【%s】で【%s】です。\n",hand[h1], hand[h2], result[(h1 - h2 + 3) % 3]);
786 :
教えてください :04/06/20 13:35
787 :
デフォルトの名無しさん :04/06/20 13:56
秒数を入力し、○時間○分○秒に変換するプログラムをお願いします。
time
>>786 せめて何をしようとしているコードなのか説明して、
もう少しコメントのはいったソースにして欲しい…。
漠然と全ソースをULして読めってのは…。
何をやろうとしているのか調べてませんが、
↓以下エラー訂正部分。これらを直したら実行はできました。
class Dimension 宣言内
virtual Dimension* operator-(Dimension+);
→virtual Dimension* operator-(Dimension*);
Input::getToken内
LUNITTIME→未定義
Dimensionクラスのいろんなメソッド
getbaseがメンバではない→getBaseの間違い
int main()内
戻り値が無い→return 0;でも書いて
>>788 timeというのは使ったことがありません。
すいません、もう少し具体的に教えていただけないでしょうか?
>787 閏秒情報が無いので正確に変換できない。
>>787 秒数を入力ってことは
取得するのではなくキーで入力するってことですか?
それなら普通にscanfで入力すればいいのでは。
>>791 ワロタ
意地悪っすなw
#include<stdio.h>
int main()
{
int time,hour,minute,second;
printf("時間を入力\n");
scanf("%d",&time);
second = time % 60;//秒を求める
time /= 60;//timeを秒以下を切り捨てて分に変換
minute = time % 60;//分を求める
hour = time / 60;//分以下を切り捨てて時間に変換
printf("%d時間%d分%d秒\n",hour,minute,second);
return 0;
}
794 :
教えてください :04/06/20 14:40
>>789 失礼しました。
これは単位つき電卓のプログラムで、
2m + 3mなどと入力すると Result = 6mとでるようなソースです。
あと、Input::getTokenのLUNITTIMEはLUNITNAMEの間違いでした。
仰るように訂正してみたのですが、
いまだにInput.hの中の
char getToken(Dimension*&);がシンタックスエラーになってしまいます…。
他のエラーはなくなったのですが…
???なぜ???
795 :
教えてください :04/06/20 14:47
>>794 いやそりゃ…Input.h内ではDimensionなんて定義されてないですから。
Input.h内に#include "Dimension.h"を書いてください。
実行したら演算子の優先順位を考慮した電卓として機能しました。
ソースは大丈夫そうです。
>>793 コンパイルしたところ、正常に実行できました。
ありがとうございました。
問題 int型変数nに数値(>3)を読み込み、n個分の配列を(動的に)用意し、任意の実数値を入力できるようにせよ。 次に、入力された数値の中から任意の2つの(異なる)数値を取り出し、掛け算、割り算の計算を行い、その結果が最も大きくなる組み合わせと計算結果を表示するプログラムを作成せよ。 ただし、用いる変数はn以外はすべてポインタを用いて表現すること(動的に配列を宣言して使用してもよい)。 Cです。よろしくおねがいします。
798 :
教えてください :04/06/20 15:17
>>795 Input.h内に#include "Dimension.h"を加えると
シンタックスエラーはでなくなりましたが
error C2011: 'Dimension' : 'class' で示される型としてすでに定義されています。
というエラーがでてしまいました…。
頭がウニになってしまいそうです。
今度はどこがいけないんだろう、Dimension.hのインクルードがどっかでかぶってるってことですか???
>>798 すまん。実は手を抜いて
1つのファイルにコピーしてコンパイルしていた。
多重定義を回避するには
Dimension.h内の一番最初に
#ifndef __DIMENSION__
#define __DIMENSION__
Dimension.h内の最後に
#endif
とでもかいてください。
これは多重定義を回避するために
よく使うので覚えておいた方がいいと思います。
VC6なら↑の代わりにに
最初に#pragma onceとかくだけでもいいです。
800 :
教えてください :04/06/20 15:32
>>799 うお〜無事実行できました。
どうもありがとうございました。
感涙
>>775 >予想と南北が逆でしたが理解できました
180度回して考えるのが普通だと思う。
// 0 ==d000 ==rad -PI
// 4 ==d180 ==rad 0
// 8 ==d360 ==rad PI
int main(){
char buf[1024]; char *string;
double px, py; double nx, ny;
int octal_dir;
printf("input P:"); fgets(buf,sizeof(buf),stdin);
px = atof( strtok(buf,",") ); py = atof( strtok(NULL,",") );
printf("input N:"); fgets(buf,sizeof(buf),stdin);
nx = atof( strtok(buf,",") ); ny = atof( strtok(NULL,",") );
if( px==py && nx==ny )
octal_dir = 0;
else
octal_dir = 4.*atan2(px-nx,py-ny)/M_PI + 4.5;
printf("Octal direction: %d\n",octal_dir);
return 0;
}
>>797 int main(){
int n;
char buf[1024];
fgets(buf,sizeof(buf),stdin);
if( !((n=atoi(buf)) > 3)) return 1;
{ double array[n]; double *p=array,*q;
double div_max=0, mul_max=0;
while(1){
printf("input value:");
fgets(buf,sizeof(buf),stdin);
if( !buf ) break;
*p++=atof(buf);
if( p == array+n ) break;
}
for(p=array; p<array+n; ++p){
for(q=array; q<array+n; ++q){
if(p==q) continue;
mul = p*q; div = p/q;
if(mul>mul_max) mul_max=mul; if(div>div_max) div_max=div;
}
} printf("mul_max:%g div_max:%g\n",mul_max, div_max);
}
return 0;
}
ぼるじょあが・・・片付けますYO!スレなのにぼるじょあが全然片付けてないのは仕様ですか?
仕様というか単純にシンボリックだから
>>802 解答ありがとうございます。しかし私の環境では、コンパイルではじかれてしまいました。
2ch.c: In function `main':
2ch.c:4: `stdin' undeclared (first use in this function)
2ch.c:4: (Each undeclared identifier is reported only once
2ch.c:4: for each function it appears in.)
2ch.c:18: `mul' undeclared (first use in this function)
2ch.c:18: invalid operands to binary *
2ch.c:18: `div' undeclared (first use in this function)
2ch.c:18: invalid operands to binary /
あと、mulやdivについてですが、おそらくこれらもポインタで処理しなければならないようです。
>>805 変更部分のみ
冒頭に付け加える
+#include <stdio.h>
+#include <stdlib.h>
途中を差し替える
- mul = p*q; div = p/q;
- if(mul>mul_max) mul_max=mul; if(div>div_max) div_max=div;
+ if (*p * *q > mul_max)
+ mul_max = *p * *q;
+ if (*p / *q > div_max)
+ div_max = *p / *q;
>>806 ありがとうございました。
無事コンパイルも通り、動作も確認できました。
後は自分でいろいろいじってみようと思います。
整数を2進数で表示するプログラムを作成せよ。 ※与えられた整数を2進数で表示するときの桁数を求める関数(再帰的に桁数を求める)と 与えられた整数を2進数で表示する関数(再帰的に表示する)を作成すればよい。
#include <stdio.h> void dispBinary( unsigned long n ) { struct Printer { unsigned char b; Printer( unsigned long n ) : b ( (unsigned char)( n & 1 ) ) { if ( !n ) throw b; } ~Printer() { putchar( '0' + b ); } }; Printer p( n ); dispBinary( n >> 1 ); } int main() { try { dispBinary( 0x1234 ); } catch( unsigned char ) {} return 0; }
ワロタ
811 :
これでいけるかな? :04/06/20 21:03
#include <stdio.h> int mona(int num) { int x=0; if(num ) x = mona(num/2) * 10; return x + num%2; } int main() { int num; scanf("%d",&num); printf("%d",mona(num)); return 0; }
812 :
デフォルトの名無しさん :04/06/20 21:09
整数データを接点に持つ二分木は、 typedef struct node *Tree typedef struct node { int data; Tree left_subtree; Tree right_subtree; } Node; という風に定義された構造体を木の接点とし、これらをポインタで繋げることに よって表すことができる。 この様に表された二分木の根へのポインタが引数と して与えられた時、その二分木の大きさ(接点の個数)を調べて返すCの関数 int size(Tree t) を定義せよ。 自分Cしか使えないので、Cでわかりやすくお願いします。 構造体やったばかりでよくわからない・・・
813 :
デフォルトの名無しさん :04/06/20 21:13
>812 すみません。まちがえてもう一回載せてしまいました。無視してください。
>>778 ありがとうございます。
宿題の内容は、が措置の合計を出す、ではなく
画素値のヒストグラムを作ることなので
Rが100であるピクセルがいくつ、とかRGBごとに数えていくように
したかったんです。
大変参考になりました。これから頑張ってみます。
>815 Cでなくていいなら面倒なことしないでも、適当にツール入れてこんな感じでR値の出現数出せるけどね。(G,Bは -f 1を2,3にする) %cat HOGE.jpg | jpegtopnm | ppmhist -noheader | sed -e 's/ */ /'g -e 's/^ //' | cut -f 1 -d " " | sort -n | uniq -c
817 :
デフォルトの名無しさん :04/06/20 23:32
C言語の宿題です.いろいろ指示があってややこしいとは思うのですが, どうかお願いできますでしょうか. 以下,問題文全文です. =========================================== 1から999間での間の整数N個(つまり整数配列AI[N])をランダムに発生させ ,その平均値と分散(いずれも実数値)を表示するプログラムを以下の仕様 に従って作成しなさい. ・main関数で,整数の配列AI[N]を確保する. ・整数配列AI[]とサイズNを引数にして,その配列の要素全てに題意の ランダムな整数(1〜999)を格納する初期化関数myinit(...)を作成する. ・整数配列とサイズを引数にして,その配列の全ての要素を10個ずつ 表示する関数mydisplay(...)を作成する.(注:1行に10個ずつという意味. N=100なら10個×10行) ・整数配列とサイズとフラグ(平均値か分散かを決める)を引数にした 関数mycalc(...)を作成する.戻り値は,フラグによって変わるように設計 すること. ・mainから初期化関数と計算の関数をフラグを変えて呼び出し,すなわち まず平均値を求めるように指示して呼び出し,次に分散を求めるように 指示して呼び出し,それぞれの結果を表示させる. 注)Nの値ははじめに#defineを用いてN>100の範囲内で適当に与えなさい. ============================ 以上です.よろしくお願いします.
大学名・学部名・学科名・講義名を明記しないとヤル気出ないんだけど
だってエンドポイントが分からんかったらヤル気でないもん(・3・)
あれ、分散って最後に0.5乗しないといけなかったっけ。
>>817 #include <stdlib.h>
#include <stdio.h>
#define N 99999
enum MODE{ AVERAGE, VARIANCE };
void myinit(int *AI,int N){ for(--N;N>=0;--N) AI[N]=1000.*rand()/(RAND_MAX+1.); }
double mycalc(int *AI,int N, enum MODE mode){
double avg=0,var=0; int *p;
for(p=AI;p<AI+N;++p) avg+=*p;
avg/=N; if( mode == AVERAGE ) return avg;
for(p=AI;p<AI+N;++p) var+=pow(*p-avg,2);
var/=N-1; if( mode == VARIANCE ) return var;
return 0;
}
int main(){
int *AI = malloc(sizeof(int)*N);
myinit(AI,N);
printf("Average:%g Variance:%g\n",mycalc(AI,N,AVERAGE),mycalc(AI,N,VARIANCE));
return 0;
};
間違い。それは偏差だっけ…
かぶった上に{乱数|1...999}だった_| ̄|○
どうもありがとうございます! ただ,ランダムな数を取るやり方が未習なやり方な気がするのですが, 授業ではたとえば0〜9の16個のランダムな数の取り方として srand(time(NULL)); for (i=0;i<N16;1++){ ai[i]=rand()%10; みたいなのを習いましたので,もしよろしければこれに準じたバージョンも 作っていただけるとうれしいです. 注文多くてすいません.
なんだ,821も間違えてるや,ちょっぴり安心。 分散は自由度平均だから /(N-1)
>>817 さすがに、その部分くらいは自分で書き換えた方が…
>>829 …そうですね(;´д`)
甘えすぎました.スマソ.
831 :
デフォルトの名無しさん :04/06/21 01:02
英文のテキストファイルを読み込んで文字列ごとの頻度を表すプログラムを書きたいのですが、教えていただけないでしょうか。
832 :
デフォルトの名無しさん :04/06/21 01:13
自 分 で 作 れ
>>818 大阪大学・工学部・電子情報エネルギー工学科・計算機システム。
実は何回もここで質問していた俺(;´Д`)
837 :
デフォルトの名無しさん :04/06/21 02:14
また大阪か
839 :
デフォルトの名無しさん :04/06/21 06:09
>>342 多次元配列って言っても内部では一次元配列として存在してるわけで。
3次元配列 int a[10][10][20]; というのは
1次元配列 int a[2000]; と意味は同じ。
x=5、y=9、z=13とおいた場合
a[x][y][z]=13; を一次元配列で書きたい場合は
a[x+(x*y)+(x*y*z)]=13; とすればいい。
空間図形って理解してます?
小学生でも分かると思いますがw
覚えたてほやほやか
>>839 へぇーへぇーへぇー
でもそれだとa[9][9][2]とa[7][7][4]が
どっちもa[252]になるような。
>>831 をみてて、こんなの考えたんですが、map の second で sort するにはどうすれば良いですか?
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
map<string, int> hindo;
string str;
while(cin >> str)
hindo[str]++;
for(map<string, int>::iterator i = hindo.begin(); i != hindo.end(); i++)
cout << i->second << " : " << i->first << endl;
return 0;
}
>>839 a[x+(y*MAX_X)+(z*MAX_X*MAX_Y)]=13;
じゃないんですかね
スマゾ・・・勘違いしてました。訂正します。 A=10 B=20 C=30 Box[A][B][C] このような多次元配列の場合、一次元配列で表すと Box[A*B*C] となる。上記の設定で Box[3][7][21]=255 のようなことを一次元配列で表すと Box[3+(7*A)+(21*(A*B))]=255 となる。
850 :
デフォルトの名無しさん :04/06/21 10:43
>>849 自動変数としてとるには配列が大きすぎる。
VC++6.0ならオプションでスタックの大きさを変更すればもしかしたらできるかもね。
もしくはstaticをつけるか。
>>849 [プロジェクト]→[設定]の[リンク]タブ開く。カテゴリを[アウトプット]に。
[スタックアロケーション]の[予約]のところに0x400000と入力してリビルド。
それでもエラーが出るようだったら値をもっと大きくしてくれ。
あと、178行目rad[i][j]とかなってるぞ。radは一次元配列のようだが。
>850 >851 ありがとうございます。早速試してみます。 178行目は、一次元配列に変更するさい、見落としていた ものと思われます。ご指摘ありがとうございます。
無事実行できました。 ありがとうございました。
854 :
デフォルトの名無しさん :04/06/21 11:43
以下の問題お願いします。 最初に四則演算を示すアルファベット1文字を入力し、次に二つの実数を 入力してその演算を行う。これを繰り返すプログラムを作りなさい。 アルファベット1文字に対して以下の演算を対応付ける。 p ・・・ + m ・・・ − d ・・・ ÷ t ・・・ × これ以外の文字を入力した場合に、プログラムを終了することとする。 余力のある人は大文字でも対応できるようにしなさい。
855 :
デフォルトの名無しさん :04/06/21 11:44
構造体配列って大域変数でも定義できる?
ようするにDQN校ってことだな。はやく学校なんてやめちまえばいいのに。
訂正前:Exit(q) 訂正後:q(Exit) でよろしく
整列のアルゴリズムで0〜100までの 乱数を基本挿入法を使ってソートするプログラムを作成してください。 ポインタ使用不可です。 よろしくお願いします。
861 :
デフォルトの名無しさん :04/06/21 14:01
投稿しようと思ったらかぶってた、、orz
それに何を勘違いしたか選択法使ってたし、、。 貼らなくて良かったけど恥ずかしい、、。すんません独り言で。
ありがとぅ、うう。
>858 ありがとうございましたm(__)m
訂正。 >861 ありがとうございました^^
1<a<bかつa,bは互いに素であるとき ユーザーがa,bを入力すると ax-by=1となるx,yを出力するプログラムをつくれ ただし、ユーザーが互いに素でない a,bを入力することを考慮する必要はない a,bは1<a<bを満たす自然数です x,yは負でも大丈夫です どなたかおながいします。 拡張ユークリッドの互除法などを いろいろと具具って見たのですが わたしにはユークリッドの互除法を理解することで精一杯でした
すいません追加です x,yは正となる最小の自然数でお願いします。
MAX_X だと 添え字の最大と取られかねないかしらね。ちょっと反省。
あ、下にかいてあったね。
>>868 a=49, b=237が入力されたとする。
237と49に対してユークリッド互除法を解くと
237 = 49*4+41 (r1 = 41 = b-4*a)
49 = 41*1 + 8 (r2 = 8 = a-r1)
41 = 8*5 + 1 (r3 = 1 = r1-5*r2)
8 = 1*8
したがって
1 = r1-5*r2 = r1-5*(a-r1) = 6*r1-5*a = 6*(b-4*a)-5*a = 6*b-29*a
したがって
6*b-29*a = 1
これを237*x-49*y=1と比較すると、a=-49, b=237なので
x = 6, y = -49 が1つの解の組だとわかる。
初期状態を除いてプログラム実行時に既存の英単語リストのファイル(list.txt)を読み込み,2次元配列に格納する. 単語登録,リスト表示,終了の各機能が選択可能なメニュー画面を表示する.ただし,登録可能な単語数を表示し,リスト内と同一単語の登録は受付けない.また,リスト表示は登録した英単語を含めるものとする.
875 :
デフォルトの名無しさん :04/06/21 19:51
出力を小数点二桁に制限したいのですが、どうすればいいんでしょうか?
[実行例] ***** 英単語管理 ***** [1] 英単語登録 [2] 英単語リスト [99] 終了 機能を選択してください:2 ***** 英単語リスト ***** No. 1: programming No. 2: exercise No. 3: information (省略) No. 19: science No. 20: function 20個の英単語が登録されています.
***** 英単語管理 ***** [1] 英単語登録 [2] 英単語リスト [99] 終了 機能を選択してください:1 ***** 英単語登録 ***** [0] メニューへ戻る 登録可能な英単語数: 80 英単語No. 21:exercise この英単語は登録済みです. 登録可能な英単語数: 80 英単語No. 21:mathmatics 登録可能な英単語数: 79 英単語No. 22:0 お願いします。
879 :
デフォルトの名無しさん :04/06/21 19:55
scanfで入力した自然数(正の整数)が素数か否かを調べるプログラムを作成しなさい。 割り切れることを判別するのは、%で余りがなければその結果は「真」である。 例えば、5%3は2であるから、5%3は偽(真ではない)である。 a=5; if(a%3==0)printf(“割り切れる“); else printf(“割り切れない“); となる。 お願いします。
>>880 効率無視。もう少し効率の良い用法を考えることをおすすめする。
#include <stdio.h>
#include <stdlib.h>
int main(){
int a,i;
printf("input a=");
scanf("%d",&a);
for(i=2;i<a;i++){
if(!(a%i)){
printf("%dで割り切れる",i);
return 0;
}
}
printf("素数\n");
return 0;
}
提出期限が近くてやばいです。 ヒントだけでもおねがいします。
>>881 素早いご返信&ご教授ありがとうございました。
>>725 =
>>882 こんなんでどうでしょう。
再帰を使って、右・左の枝の個数を数える、それに自分の分を足して返す。
int size(Tree t){
int r_num=0,l_num=0;
if(t->right_subtree!=NULL){
r_num=size(t->right_subtree);
}
if(t->left_subtree!=NULL){
l_num=size(t->left_subtree);
}
return (r_num+l_num+1);
}
885 :
デフォルトの名無しさん :04/06/21 22:42
sscanf を使って以下のプログラムを書くのはどうしたらいいでしょうか? 行単位で、3個以下の単語を入力する。 4個以上の入力には、無効メッセージを出す。 よろしくお願いします。
886 :
デフォルトの名無しさん :04/06/21 23:17
>>885 こんな感じか。
char buf[256], s1[16], s2[16], s3[16];
char c;
fgets(buf, sizeof buf, stdin);
if (sscanf(buf, "%s%s%s %c", s1, s2, s3, &c) > 3){
puts("無効");
}
887 :
デフォルトの名無しさん :04/06/21 23:24
できました。 ありがとうございます。 要するに%c の所に何かあったら無効と表示するということですか?
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { int op_cnt; char str[1024]; if (argc>4) { fprintf(stderr,"argument is less than Three"); } memset(str,0,1024); for (op_cnt=1;op_cnt<argc;op_cnt++){ sscanf(argv[op_cnt],"%s",str); printf("%s\n",str); } return 0; }
>>887 そこに入るとsscanfの戻り値が4になるからね。
その前の空白はfgetsのときに入る改行を飛ばすため。
890 :
デフォルトの名無しさん :04/06/21 23:33
>>888 , 889
理解できました。
感謝いたします!!
整数値nを読み込んでn×nの正方形を*を用いて表示するプログラムを次の条件に従い作成せよ 繰り返しにはfor文を用いる よろしくお願いします。
>>891 #include <stdio.h> int main(void){ int n, i, j; printf("n >>"); scanf("%d", &n); for (i=0;i<n;i++){ for (j=0;j<n;j++){ printf("* "); } puts(""); } return 0; }
>>892 すみません
puts(""); のところの解説をお願いしてもよろしいでしょうか?
改行。 putchar('\n'); でもいいけど。
n回横へ、それをn回縦にってことですね ありがとうございました
896 :
デフォルトの名無しさん :04/06/22 00:35
#include <stdio.h> #include <stdlib.h> #include <string.h> int main (int argc, char **argv){ int n,i; char **matr_2; char *ptr; fscanf(stdin,"%d",&n); if(n<0){ fprintf(stderr,"invalid value!\n"); exit(1); } matr_2 = malloc(sizeof(char*)*n); if (!matr_2) { fprintf(stderr,"can not allocate\n"); exit(1); } for (i=0; i<n; i++) { ptr = malloc((sizeof(char)*n+1)); if (!ptr) { fprintf(stderr,"can not allocat\n"); exit(1); } memset(ptr,'*',n); ptr[n] = '\n'; matr_2[i] = ptr; } for (i=0;i<n;i++) { fprintf(stdout,matr_2[i]); } return 0; }
>839を見て考えた。 a[(x * y) * (x * y + 1) / 2 + y] = 13; とすれば幅(高さ)に関係なく2次元が扱える。 #(10 * 5)の空間だろうが(10 * 20)の空間だろうが関係ない。 これを拡張すれば3次元でもつかえるのだが、 ↑の式の分子の部分が(x * y * z) * (x * y * z + 1) * (x * y * z + 2)となった時点で馬鹿馬鹿しくなった。 #でもこれ、なんかに応用できないかなぁ。
何がやりたいのかわけわかめ。 >a[(x * y) * (x * y + 1) / 2 + y] = 13; 3次元扱っているようにしか見えないよぅ。・゚・(ノД`)・゚・。
900 :
デフォルトの名無しさん :04/06/22 12:45
これをやっていただけませんか↓ 次の動作を行うプログラムheap.cを作成せよ. ファイルに保存された整数データ(データの保存形式は自由)を1つずつ読み込み,ヒープを構成する. プログラムはデータをひとつ読み込むごとにヒープの状態を表示する. すべてのデータを読み込んだら,ヒープに保持している最小のデータを1つずつ削除する.この時再構成されたヒープの状態を削除の都度表示する. 表示された結果をソースファイルの最後にコメントとしてつけること
>>898 どこまでも突き詰めて、究極のハッシュ関数に応用すれ
誰かお願いしますorz
903 :
デフォルトの名無しさん :04/06/22 17:49
関数の問題ですお願いします。 まず次のような二つの関数を作成する。 @一つの正整数を引数として受け取り、その整数の各桁の和(345なら3+ 4+5=12)を返す関数。 A一つの正整数を引数として受け取り、それが3で割り切れなければ0、割り 切れれば0以外を返す関数。 これらの関数を用いて、いくつかの正整数を入力して、それが3で割り切れるか 否かを表示する。入力の終わりは0または負のデータが現れたことで判定する。 (ただしbreak contineは用いない)
>>903 2つの関数使う意味ないけど、使えってことだよな。
ほれ。
#include <stdio.h>
int foo(unsigned int n)
{
if( n )
return n % 10 + foo(n / 10);
return 0;
}
int bar(unsigned int n)
{
return n % 3;
}
int main(void)
{
int n;
do{
scanf("%d",&n);
if( n <= 0 )
return 0;
if( bar( foo(n) ) )
printf("3で割り切れない。\n");
else
printf("3で割り切れる。\n");
}while( 1 );
return 0;
}
ここは課題を書き込んで頼んでもいいのですか?
906 :
デフォルトの名無しさん :04/06/22 18:29
N個の自然数を入力して下記の処理をするプログラムなんですがお願いします。 但し 入力データの終わりを0であらわすものとする。 1 入力されたデータをそのまま表示するプログラム 2 入力されたデータを合計して平均を求めるプログラム 3 MAXとMINを求めるプログラム 初歩的なことだと思うんですが できません 教えてください
うん。
>>900 #include<stdlib.h>
#include<stdio.h>
#include<string.h>
int compare_int(const void *a, const void*b)
{ if(*(int*)a==*(int*)b)return 0; return (*(int*)a>*(int*)b)?-1:1; }
void print_heap(int *heap, size_t heap_size){
int *h; printf("\nheap_size: %d\n",heap_size);
for(h=heap; h!=heap+heap_size; ++h) printf("address:%p value:%d\n",h,*h);
}
int main(int argc, char**argv){
int *heap=NULL; size_t heap_size=0;
char buf[1024]; FILE *fp;
if( !(argc>1) || !(fp=fopen(argv[1],"r")) ) return EXIT_FAILURE;
while( fgets(buf,sizeof(buf),fp) ){
char *p;
for(p=strtok(buf," \n"); p; p=strtok(NULL," \n")){
heap=realloc(heap,++heap_size*sizeof(*heap));
heap[heap_size-1]=atoi(p); print_heap(heap,heap_size);
}
}
for(--heap_size;heap_size!=0;--heap_size){
int *h; int *min_h=heap;
for(h=heap; h!=heap+heap_size; ++h)
if( *min_h >= *h ) min_h = h;
if( min_h != heap+heap_size-1 )
memmove(min_h,min_h+1,(heap+heap_size-min_h)*sizeof(int));
heap=realloc(heap,heap_size*sizeof(*heap)); print_heap(heap,heap_size);
}
return EXIT_SUCCESS;
}
>>906 #include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define N 10
void print_heap(int *heap, size_t heap_size){
int *h; printf("\nheap_size: %d\n",heap_size);
for(h=heap; h!=heap+heap_size; ++h) printf("address:%p value:%d\n",h,*h);
}
int main(int argc, char**argv){
int *heap=NULL; size_t heap_size=0; char buf[1024];
for( printf("input Number: "); fgets(buf,sizeof(buf),stdin); printf("input Number: ") ){
char *p;
for(p=strtok(buf," \n"); p; p=strtok(NULL," \n")){
heap=realloc(heap,++heap_size*sizeof(*heap));
heap[heap_size-1]=atoi(p);
}
if(heap[heap_size-1]==0){ --heap_size; break; }
if(heap_size >= N){ heap_size=N; break; }
}
print_heap(heap,heap_size);
{ int *h; int *min_h=heap; int *max_h=heap; double sum=0;
for(h=heap; h!=heap+heap_size; ++h){
sum+=*h;
if( *min_h >= *h ) min_h = h;
if( *max_h <= *h ) max_h = h;
}
printf("avg: %g, max: %d, min: %d\n", sum/heap_size, *max_h, *min_h);
}
return EXIT_SUCCESS;
}
910 :
デフォルトの名無しさん :04/06/22 19:03
>>909 ありがとうございます すみませんが1,2,3の問題でわけるとどうなるんですか?
どこからどこまでがなにのプログラムかわかりません お手数かけてすみませんが教えてください
たとえば struct CELL{ char a[10]; char b[10]; char c[10]; char d[10]: struct CELL *next; struct CELL *prev; }; って構造体のリストがあるとして,その要素の中からある文字列s[ ](例えば"asd")ってのを含む 要素をすべて文字列としてとりだして表示するプログラムってどんなのですかね?
>>911 a,b,c,dとsをstrcmp()で比較して、一致したのだけ表示すればいい。
913 :
デフォルトの名無しさん :04/06/22 21:37
main() { int i; float height[100],x; i=height[0]=x=0; while(1){ scanf("%f",&x); height[i+1]=height[i]+x; i++; printf("平均は%f,\n",height[i+1]/i); printf("入力数は%d,\n",i); } } 入力された数の個数とその平均値を求めるプログラムを作ったつもりなのですが 実行結果が C:\c>height2.exe 100 平均は-1810926403 入力数は1, 200 平均は-2362138731 入力数は2, となってしまいます、どこがおかしいのでしょうか?
>>913 printf("平均は%f,\n",height[i+1]/i);
↓
printf("平均は%f,\n",height[i]/i);
>どこがおかしいのでしょうか? printf("平均は%f,\n",height[i+1]/i);
配列使う意味もないね
>>912 次や次の次のCELLの中のaやbなどはどうすれば?
ありがとうございます、さっそくソースを手直ししてコンパイルしたところ正常に動きました 次にx=0のとき直前に入力した値を削除するような機能 例えば実行結果が C:\c>height.exe 100 平均は100.000000 入力数は1, 200 身長の平均は150.000000 入力数は2, 0 平均は100.000000 入力数は1 となるようにしたいのですが どのようにすればいいでしょうか?
>>917 struct CELL *p = head; // headはリストの先頭
while( p ){
if( !strcmp(p->a,s) || !strcmp(p->b,s) || !strcmp(p->c,s) || !strcmp(p->d,s) )
disp(p); // CELLを表示する関数(自分で定義)
p = p->next;
}
みたいな感じでループまわす。
つか、ポインタ一つ用意してnext使って辿ればいいだけ。
921 :
デフォルトの名無しさん :04/06/22 22:37
>>918 if(x!=0){
height[i+1]=height[i]+x;
i++;
} else {
if( i>0)i--
}
std::cout << "Hello World!\n"; 今日覚えたよ!!
明日は std::cin を使って入力に挑戦してみると良いでしょう。
>>919 あの〜、例えばsが"asd"でaが"ruasdf"の時もaが表示されないといけないのですが
上のプログラムでそれもいけますか?
んじゃstrstr()に直してくれ。
927 :
デフォルトの名無しさん :04/06/22 23:17
N個の自然数を入力して最頻値を求めるプログラム(ただし、0で入力が終わる)を C言語であらわすプログラムを教えてください。お願いしますm(__)m
928 :
デフォルトの名無しさん :04/06/23 00:11
整数nの階乗(n! = n(n-1)…1, ただし、0! = 1)を求める 関数factorialを作り、 それを用いて0から5までの階乗の結果を表示するプログラム 出力例 0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 お願いします。
929 :
デフォルトの名無しさん :04/06/23 00:38
#include<stdio.h> int factorial(int n){ int i,f=1; for(i=1;<=n;i++) f=f*i; } return f; } int main(){ int i; for(i=0;i<=5;i++) printf("%d\n",factorial(i)); return 0; }
>>928 #include <stdio.h>
int factorial(int n) {
if (n == 0) return 1;
else return n * factorial(n-1);
}
int main() {
int i;
for (i=0; i<=5; i++) {
printf("%d! = %d\n", i, factorial(i));
}
return 0;
}
すまん。最初の「}」は不要。
寝ます…
933 :
デフォルトの名無しさん :04/06/23 00:43
その後に、 928の関数factorialを参考にして、 キーボードから入力した2つの正または0の整数nとmの 組み合わせnCmを計算する関数combinationを作り、 それを用いてnCmを計算するプログラム。 ヒント) nCm = n!/(n−m)!m! 出力例 Input n: 8 Input m: 6 8C6 = 28
934 :
デフォルトの名無しさん :04/06/23 00:44
2つも頼んじゃいましたが、 どうかよろしくお願いしますm(__)m
935 :
デフォルトの名無しさん :04/06/23 00:46
>>933 それってfactorial使うとすぐに桁溢れするぞ。
パスカルの公式(三角形とcombinatorialを結びつけるやつ)使っとけ。
正直に書いてみる。 int combination(int n, int m) { return factorial(n) / (factorial(n-m) * factorial(m)); } int main() { int n, m; printf("Input n: "); fflush(stdout); scanf("%d", &n); printf("Input n: "); fflush(stdout); scanf("%d", &m); printf("%dC%d = %d\n", n, m, combination(n, m)); return 0; }
名簿みたいのってどうやってつくったらいいですか? 構造体つかってやろうとおもうのですが、それだけだと新しい人を登録くするときにいちいちコンパイル しないといけませんよね? コマンドラインから入力する方法ってどうやってやるんですか? 具体的(プログラム例など)におしえていただけるとうれしいです。
>>937 >新しい人を登録くするときにいちいちコンパイル
(´д`)・・・
ぼくはどうしたらいいんでしょう?
939 :
デフォルトの名無しさん :04/06/23 01:49
IEEE754の浮動小数点数同士の加減乗除のプログラムを教えてください 入力は二つです。10進数で入力しますy。それを2進に変換して浮動小数点数にして、演算をします。。 出力結果も10進で表示します。
狼狽するね_| ̄|○
C言語でお願いします
#include <stdioh.> main(){ puts("狼狽するね_| ̄|○ "); }
> stdioh. 狼狽するね_| ̄|○
狼狽するね_| ̄|○
>>944 そのスレってひょっとして次スレ?
スレ番が入ってないけど・・・
/*
>>937 */
/* 質問内容を理解できている自信はないが */
/* $ ./program_name Nanashi Mona ItteYoshi */
#include<stdio.h>
int main(int argc, char *argv[]){
int i;
for(i=0;i<argc;i++)
printf("%s\n",argv[i]);
return 0;
}
>>948 それだとコマンドそのものも印字されるよ_| ̄|○
コマンドラインからの入力のサンプルってのが妥当なら別にいいやん。 まぁ、>937 が求めているのは別のことかも知れんけど。
ひx致死だな
(・3・)
957 :
デフォルトの名無しさん :04/06/23 16:08
#include<stdio.h> int factorial(int n){ int i,f=1; for(i=1;<=n;i++) f=f*i; } return f; } int main(){ int i; for(i=0;i<=5;i++) printf("%d\n",factorial(i)); return 0; } の関数factorialを利用して キーボードから入力した2つの正または0の整数nとmの 組み合わせnCmを計算する関数combinationを作り、それを用いてnCmを計算するプログラム。 ヒント) nCm = n!/(n−m)!m! 出力例 Input n: 8 Input m: 6 8C6 = 28 です。 関数を3つ書いてやるらしいです。もう1度お願いします。
factorialあるんなら一瞬だろ
#include<stdio.h> int factorial(int n){ int i,f=1; for(i=1;i<=n;i++){ f=f*i; } return f; } int combination(int a,int b){ return (factorial(a)/factorial(a-b)/factorial(b)); } int main() { int i,n,m; printf("Input n:"); scanf("%d",&n); printf("Input m:"); scanf("%d",&m); printf("%dC%d = %d",n,m,combination(n,m)); return 0; }
960 :
デフォルトの名無しさん :04/06/23 22:07
以下に示すプログラムを実行した時に、 画面に表示される数字を答よ。 #include <iostream> using namespace std; int main() { int i, k; k = 11 / 4 * 3; for ( i=0; i<5; i++ ) { if ( i <= 2 ) {k = k + 2*(i+1);} else {k = k - i;} } cout << k << endl; } これって数字いくつになりますか?
962 :
デフォルトの名無しさん :04/06/23 22:19
コンパイルてなんですか?
965 :
デフォルトの名無しさん :04/06/24 01:02
>>939 この宿題は某電機大学の講義で出された課題でつ。
みんな必死だね...
966 :
デフォルトの名無しさん :04/06/24 01:05
p
>>965 必死なのはいいんだけどね。
必死なだけなのは困るよね。
968 :
デフォルトの名無しさん :04/06/24 01:19
VC++でコンパイルしてそのままCtrl+F5で実行すると問題なく処理されるのですが, これをアイコンのダブルクリックで起動するとここの部分で終了してしまいますが, なぜでしょうか? char *index[3]; int i,j; for(i = 0;i < 3 ; i++){ index[i] = (char *)malloc(j+1); }
補足: jは事前の処理で高々100以下の整数が収まっています. 処理が中断してしまうのはmallocの命令文に問題があるようなのですが.
ソース全部出せよ
解決しました.m(__)m
>>960 頭の中でやっただけだから間違ってるかも。
6
>>960 脳内インタープリタで実行したところ11が出力されました。
私も>974同様11でした。 ってことで、>973の脳内インタプリタはバグってるらしい。
脳内コンパイルでコンパイルしたところ バイナリファイルが生成されました シンボル解決は見てみぬふり
978 :
デフォルトの名無しさん :04/06/24 17:03
×*q[*(p+i)-0x61]+=1; ○q[*(p+i)-0x61]+=1; ○*(q+*(p+i)-0x61)+=1;
*q
>>978 おぉ、即レスどうもです。
うまく動きました。
しかし、どこかが間違ってるのかzの個数がすごいことになる(つД`)
printf("%cは%d個\n"(0x61+i),alpha[i]); とりあえず,が抜けてるけど
982 :
デフォルトの名無しさん :04/06/24 17:36
てめえの脳内ではアルファベットは25個しかないのか? static int alpha[25];
あぁ、俺ってバカ。 助言どもっす・・_ト ̄|○
984 :
デフォルトの名無しさん :04/06/24 18:16
985
986
987 :
今日からC言語始めますた!宜しく!!! :04/06/26 13:07
#include <stdio.h> void main() { printf("俺はロリコン(爆"); }
>>987 ・main()は本来int型の値を返すものです。
・標準出力の最後は改行をつけたほうが無難です。
989 :
デフォルトの名無しさん :04/06/26 17:12
この問題をC言語でお願いします。 直径15cmの円周と面積を求めよ。
990 :
デフォルトの名無しさん :04/06/26 17:13
この問題をC言語でお願いします。 直径15cmの円周と面積を求めよ。
printf("円周:15π\n", ); printf("面積:56.25π\n", );
#include <stdio.h> main() { printf("円周%f面積%f\n", 15*2*3, 15*3*3 }
994 :
デフォルトの名無しさん :04/06/26 17:32
ι(´Д`υ)
#include <stdio.h> int main(void) { printf("俺は%d\n",995); return 0; }
#include <stdio.h> int main(void) { int i = 996; while(i<1001) printf("俺は%d\n",i++); return 0; }
円周率@小学校って3.14に戻ったんじゃなかったっけ
俺は22/7と習ったぞ。
円周率が3っていうのは完全にデマだぞ? ↓↓1000ゲットどうぞ↓↓
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。