C/C++の宿題やらせてください。おながいします

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
ついでに今はJavaと基本情報もやっている。
わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m
4代目(前スレ): http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
3代目: http://pc2.2ch.net/test/read.cgi/tech/1041992392/l50
2代目: http://pc3.2ch.net/test/read.cgi/tech/1039772622/l50
宿題手伝いますYO!!: http://pc3.2ch.net/test/read.cgi/tech/1038024989/l50



2デフォルトの名無しさん:03/04/29 14:34
2


前スレの話だが汎用の値交換に興味のある向きは
BSD や GNU の libc/stdlib/qsort.c を見るといいやも
4C初心者:03/04/29 14:44
SGLつかってscanfで読み込んだ2つの数値n,mで
n行m列の表を作ろうと思ったのですがうまくいきません。
超初心者的な質問で申し訳ないですが、どなたかご教授下さい。

#include "sfcgl.h"
void display()
{
BGColor(0, 0, 0);
int i,j;
double n,m,x,y;
for(i = 0; i < n; i++){
x = 10.0 + 10*i;
DrawLine(x, 0.0, 0.0, x, n*100 , 0.0);
}
for(j = 0; j < m; j++){
y = 10.0 + 10*j;
DrawLine(0.0, y, 0.0, m*100, y, 0.0);
}
SGSwapFrames();
}
int main(int argc, char** argv) {
int n,m;
scanf("%d%d",&n,&m);
SGInit(argc, argv);
SGOpenWindow(50, 50, 500, 500);
SG2DMode();
SGSetDisplay(display);
SGCallBack();
return 0;
}

mainで読み込んだn,mをvoid displayに関連させる方法が分りません。
>>4
void display(double n,m) /* ←引数にする */
{
BGColor(0, 0, 0);
int i,j;
double x,y; /*←ローカル変数のm,nは削除*/
for(i = 0; i < n; i++){
x = 10.0 + 10*i;
DrawLine(x, 0.0, 0.0, x, n*100 , 0.0);
}
>>3
glibcはdo{}while(0)マクロを使っていたと思う。
7C初心者:03/04/29 16:25
レスどもです。
でもそれをやると
parse error before m と
m undeclared, n undeclared
とエラーが出ます。引数にするのは正しいと思うのですが、
なぜかできない・・・。
スマソ
8bloom:03/04/29 16:26
>>7
void display(double n,double m)
10デフォルトの名無しさん:03/04/29 16:49
http://pc2.2ch.net/test/read.cgi/tech/1045074808/948
質問の問いのを作ってるのですが、カーソルにあたった時の処理ってどうでしたっけ?
・ボールの角度が垂直×真ん中にあたった=垂直のボールが飛ぶ
・ボールの角度が垂直×端にあたった=端にあたるほど角度の無いボールが飛ぶ
・ボールの角度が垂直でない×真ん中にあたった=その角度を反転させたボールが飛ぶ
・ボールの角度が垂直でない×端にあたった=?
?の部分を教えてください。元のボールの角度に関係なくあたった位置により角度を作るか、
元のボールの位置とあたった位置を平均して角度を作るのどちらかっぽいのですが。
11C初心者:03/04/29 17:10
神キター!!!
しかしできず。萎え・・・。
passing arg 1 of SGSetDisplay from imcompatible pointer type
と出ます。

何度も何度もスマソですがこのエラーの対処方わかります?。
>>11
お前はそのエラーメッセージが読めんのか?
SGSetDisplay()に渡す関数ポインタのシグネチャが違うんじゃないの
>>11
ヒント。
自分自身の書いた関数名を渡そうとしていないか?
そのSGなんたらには何を渡すべきか判っているのか?
15C初心者:03/04/29 17:25
SGSetDisplay(display);
問題は上の()の中に入れる関数だと思うのですが、
(display(n,m))と入力しても voidエラーが出て実行できません。
英語が駄目駄目なんでエラー文の意味もまともに解釈できず困ってます。
神の方どうかご教授下さい。
16デフォルトの名無しさん:03/04/29 17:28
>>15
とりあえず関数ポインタについて勉強してからにした方がいいよ

>>15
博識者を神とおだてるより自分で調べろよ。
英語がわからないならオンライン辞書でも使えばいいしさ。
エラーをヘルプで検索するってのもできるだろ?
18C初心者:03/04/29 17:31
わかりました。関数ポインタについては参考書を購入して
勉強いたしたいと思います。ですがとりあえずこのプログラムが
上手くいく方法をご教授願えないでしょうか?よろしくお願いします。
>>18
英語も勉強しろ。
sageも覚えろ。

さて、「とりあえず」のコードをやろう。

#include "sfcgl.h"
int n,m;
void display()
{
BGColor(0, 0, 0);
int i,j;
double x,y;
〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜
}
int main(int argc, char** argv) {
scanf("%d%d",&n,&m);
SGInit(argc, argv);
SGOpenWindow(50, 50, 500, 500);
SG2DMode();
SGSetDisplay(display);
SGCallBack();
return 0;
}

このライブラリは描画関数に引数を渡せんのか・・・。不便だな。
>>19
> sageも覚えろ。

これは余計
なんか結局質問した時に戻ってるような
ようは答えだけが知りたいんだろ。

ヒントなんかくれなくていいから答えだせ、と
23C初心者:03/04/29 17:48
>>19
ありがとうございます。おかげさまで実行できますた。

scanfに突っ込むのは無粋ですね
既存質問スレでの常時age進行は、
質問スレ乱立防止策には成り得ませんか?ダメ?
>C初心者さん
なんでnとmへの入力をmain関数で受けるの?
27デフォルトの名無しさん:03/04/29 22:57
以下の2つの宣言は、どう異なるか述べなさい。
char *p = 'A';
char *p = "A";
次に上記のようにポインタ変数に初期値を与えるのでなく、
代入によって与えるような次のプログラムを書いた。
このプログラムに誤りがあるとすれば指摘しなさい。
#include<stdio.h>
int main(void)
{
char *p;
*p = 'A';
printf("*p = %c",*p);
return 0;
}
よろしくお願いします。
とりあえず。1が宿題をやらないのがむかつく
>>27
怪しい問題だな。写し間違いか?
>char *p = 'A';
>char *p = "A";

上、ろくな事にならんぞ。

>char *p;
>*p = 'A';
>printf("*p = %c",*p);

pは有効な変数を指してないのでまともに動かね
#include<stdio.h>

main(){
int i;
float f;
f=1234.0098;
i=f;
printf("%f %d",f,i);}

1234.0098 1234 と表示されるはずが
1234.009766 1234 と表示されます。
どうしてですか?教えてください。
ちなみに環境はwinXP,bcc5.5です
>>31
重箱の隅だが「pは有効な変数を指してない」はいかがなものか
>>27
> char *p = 'A';
> char *p = "A";

Cではcharはintと等価だから、上のは代入の時点で普通Warning吐かれるよ。
まあ、そういうことを言いたいんじゃないと思うけど。

とりあえず'A'は値を代入、"A"はアドレスを代入することになるから。
char *p = 'A'は多分、コンパイル通ってもAccess Viorationで落ちるね。
このプログラム、なんか少し前のVCLの某文字列クラスのバグを皮肉ってるようでなんかムカつく。

>>32
C、というかprintfはfloat型を出力できません。
すべてdouble型に暗黙の型変換されます。
35デフォルトの名無しさん:03/04/29 23:49
int型って-127〜128だったっけ?

2進数    →10進数

00000000  → 0
10000000  → -128  でいいの?
10000001  → -1
01111111  → 128  ?

助けて
>>35
× int型って-127〜128だったっけ?

○ 00000000  → 0
○ 10000000  → -128
× 10000001  → -1
× 01111111  → 128

× 助けて
3735:03/04/29 23:56
char型って-128〜127だっけ?

00000000  →  0
10000000  →  -128
11111111  →  -1
01111110  →  127

助けて
>>37
× char型って-128〜127だっけ?

○ 00000000  →  0
○ 10000000  →  -128
○ 11111111  →  -1
× 01111110  →  127

× 助けて
3935:03/04/30 00:12
char型って-128〜127だろ!

00000000  →  0
10000000  →  -128
11111111  →  -1
01111111  →  127
10000001  →  -127
10000010  →  -126

分かった!
>>34
そうなんですか?でも、誤差はでませんよね??
>>39
× char型って-128〜127だろ!

○ 00000000  →  0
○ 10000000  →  -128
○ 11111111  →  -1
○ 01111111  →  127
○ 10000001  →  -127
○ 10000010  →  -126

× 分かった!
実数を使う以上誤差はでるよ。
4335:03/04/30 00:39
char型って-127〜127ですか?

中略


分かりません。
>>43
型の取り得る値の範囲は処理系依存。(CHAR_MIN〜CHAR_MAX)
char型が符号付か符合無しかも処理系依存。
>>42
丸め誤差とかのことでしょ?
0.0098に対して0.009766は誤差がありすきでしょう。
#include <float.h>
printf("%f",FLT_EPSILON);
>>43
signed charなら確実にその範囲は表せる。
4847:03/04/30 01:46
0〜127なら確実だね。
4935:03/04/30 02:23
サッパリ分かりません。
char型は1バイトでしょう?8ビット。
256個の整数を表せるのでは?
-128〜127は256個
-127〜127では255個です。
unsigned charでは0〜255なので256個

リナックスとウィンドウズは想像以上に違うの?
つうかリナックスの何処に<stdio.h>ってあるのですか?
#include <stdio.h>
って書いて意味あるの?
>>49
補数って知ってますか?
>>49
最低8ビットだけど、8ビットとは限らない。
limits.hの中のCHAR_BITがビット数

で、8ビットかつ1の補数表現なら最低は-127
1の補数表現だと全ビット0と全ビット1がどちらも値として0になる。

> つうかリナックスの何処に<stdio.h>ってあるのですか?
多分/usr/include
stddef.hとかは別の場所にあるかも。
5235:03/04/30 03:08
出直してきます
ありがとうございました。
>>45
IEEE754ならfloatの32bitの内訳は符号sが1bit, 指数eが8bit, 仮数mが23bitなので
有効数字は2進で24桁、約7桁だから期待通りの結果だと思うが?
54 :03/04/30 11:16
つーか
ttp://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html
読めば全て解決。

昔、漏れも C の先生に
sizeof int 以外は処理系に依らず決まってる
と嘘つかれますた。
56デフォルトの名無しさん:03/04/30 12:59
int one(int i, int vc)
{


for (i = 0; i < 2; i++) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
}
return(vc[i]);
}

どこをどう治したらいいかわからん
あと
c:7: warning: declaration of `i' shadows a parameter
これはなに?
>>56
なぜint vcを配列として扱う?
>>56
その程度の英語くらい何とかしろよ。
そのソースには書いてないようだが、
パラメータでiを宣言しているのに関数内でも宣言してないか?
59デフォルトの名無しさん:03/04/30 13:05
>>56
ただのループカウンタを引数にすんなよ。
>>56
何をしたいプログラムなの?
>>56
% echo 'void f(int i){
int i;};' | gcc -c -xc -
: In function `f':
:2: warning: declaration of `i' shadows a parameter
int one(int n, int *vc)
{
int i;
for (i = 0; i < 2; i++) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
}
return(vc[n]);
}
>>62
中途半端なスワップ関数だなぁ・・・。
スワップッつーか、リバースだろ。
6556「:03/04/30 13:29
returnは使えないんじゃないの
使わないやり方教えてください
>>56
おいおい、それ以前にやることがあるだろ。
・自分がどんな関数を書きたかったのか
・書かれたことは理解できたか
・ついでにお礼も
ここは質問スレじゃないんだからネタ提供せずに質問だけするなよ。
#あ、ネタにはなってるのか。
リバースならこうかな。iは要素数として
void one(int i, int *vc)
{
for (; --i > 0; vc++) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
}
}
なんで使えないの?
vc[n]はintだから型もあっているし。
名前が one だからリバースじゃないね
7056「:03/04/30 14:09
配列の並び順を 逆にする関数を作りたいんです
#include <stdio.h>
#define NUMBER 5
void one(int i, int *vc)
{ for (; --i > 0; vc++) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
} }
int main(void)
{
int i;
int vc[5];


puts("5個の整数を入力してください。");
for ( i = 0;i < 5; i++){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
}
puts("逆に並べると");

for (i = 0;i < 5; i ++)
printf("vc[%d]=%d\n", one(i, *vc ));
return(0);
}
: In function `main':
:26: warning: passing arg 2 of `one' makes pointer from integer without a cast
:26: invalid use of void expression
さっぱりでつ お願いします
>>70
> printf("vc[%d]=%d\n", one(i, *vc ));

なぜ*vcと間接参照する。参照しないでポインタを渡すの。
7271:03/04/30 14:12
それにoneの戻り値はvoidなんだからprintfの引数には使えないでしょう。
7356「:03/04/30 14:16
もう少しわかりやすくお願いします
>>73
#include <stdio.h>
#define NUMBER 5
void one(int i, int *vc)
{ for (; --i > 0; vc++) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
} }
int main(void)
{
int i;
int vc[5];


puts("5個の整数を入力してください。");
for ( i = 0;i < 5; i++){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
}
puts("逆に並べると");
one(i, vc );
for (i = 0;i < 5; i ++)
printf("vc[%d]=%d\n", i,vc[i]);
return(0);
}
>>66
漏れは礼はいらんと思う。理解できたかどうかだけが意味がある。
7666:03/04/30 17:58
>>75
「理解できました、ありがとう。」ってのを期待してた。
でもどうやらそれ以前のようだね・・・
>>76
紛らわしかったかもしれんが75≠56
7866:03/04/30 18:42
>>77
わかってるよん。
>>67
もう一つ引かないといけないんじゃない?
void one(int i, int *vc)
{
for (; --i > 0; vc++, i--) {
int temp = *vc;
*vc = vc[i];
vc[i] = temp;
}
}
80デフォルトの名無しさん:03/04/30 21:38
void reverse(int i, int *vc) {
for (; --i > 0;)
*vc++ ^= vc[i--] ^= *vc ^= vc[i];
}
81__:03/04/30 21:42
82デフォルトの名無しさん:03/04/30 22:42
>>1 やってみて。

1.1926以上2002以下の数(西暦)をキーボードから入力すると、「昭和45年です」とか
 「平成6年です」とか和暦に直すプログラム。1926年の場合は「昭和元年です」
 1989年の場合は「平成元年です」と表示するように。
 で、1925以下や2002以上が入力されると「入力は1926-2001の間にして下さい」と表示。

2.Aさん、Bさんが階段じゃんけんゲームをシュミレーションするプログラム。
 ルールは・・・
 ○プレイヤー2人は、最初階段の0段目にいてじゃんけんする。
 ○じゃんけんの勝者はグーで勝てば1段、チョキで勝てば2段、パーで勝てば5段
  階段を登ることが出来る。あいこは0段。
 ○10回のじゃんけんの結果、より高い段に居た方が勝ち。

3.「2のn乗 −2」がnで割り切れるなら素数であるという定理を使って、2〜20までの
 素数を全て求めよ。
>>67 >>79 >>80
おまえら、無駄が多い。
>>83
お前は無駄レスだけ。
オレニマカセロ!
86not 1:03/04/30 22:50
>>82
1ではないが、やっていいかNa??
87 :03/04/30 22:57
>>82
> 3.「2のn乗 −2」がnで割り切れるなら素数であるという定理を使って、2〜20までの
この定理、なんか変じゃないか???

2^2-2=4
2^3-2=6
2^4-2=14 ×
2^5-2=30
...
そもそも何が素数か書かれていない。
90デフォルトの名無しさん:03/04/30 23:06
>>87
n=341の時はその定理は成り立たない。nが20以下には全部適用できるね。
9187 :03/04/30 23:09
>>90
なるほど「問題文の日本語が変」なだけだw

3.「2のn乗 −2」がnで割り切れるなら "nが" 素数であるという定理を使って、2〜20までの
 素数を全て求めよ。

ってことね。
ちょっとやってみるか。
今日の宿題です。

配列を上位桁から表示するようにして欲しいです。
関数は


int card_conv(unsigned x, int n, char d[])
{

int i;

char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int digits = 0;
if (x == 0)
d[digits++] = dchar[0];
else
while (x) {
d[digits++] = dchar[x % n];
x /= n;
}


for (i = 0; i < n / 2; i++)
swap(int, d[i], d[n - i - 1]);


return (digits);

}
メインは


int main(void)
{
int i;
unsigned no;/* 変換する整数 */
int cd;/* 基数 */
int dno;/* 変換後の桁数 */
char cno[100];/* 変換後の各桁を格納する文字の配列 */
int retry;/* もう一度? */

do {
printf("正の整数値を入力してください:");
scanf("%u", &no);
do {
printf("何進数に変換しますか(2-36):");
scanf("%d", &cd);
} while (cd < 2 || cd > 36);
dno = card_conv(no, cd, cno);/* noをcd進数に変換 */
printf("%d進数では", cd);
for (i = dno - 1; i >= 0; i--)/* 上位桁から順に表示 */
printf("%c", cno[i]);
printf("です。\n");
printf("もう一度しますか(1…はい/0…いいえ):");
scanf("%d", &retry);
} while (retry == 1);

return (0);
}
for (i = 0; i < n / 2; i++)
swap(int, d[i], d[n - i - 1]);

for (i = 0; i < digits / 2; i++)
swap(int, d[i], d[digits - i - 1]);
16行目でエラーが出てしまいます。aには名前を入力したいのですが
この書式指定では駄目なのでしょうか?

#include <stdio.h>
#include <string.h>
struct tell{
char name[20];
char tele[20];
};
main(){
char *a,*b;
struct tell c[255];
int i,j=0;
while(1) {
printf("全角5字以内で、氏名を入力せよ。 終了:e\n");
scanf("%s",&a);
if (a == "e") break;
strcpy(c[j].name, a);
printf("半角20字以内、ハイフン編集して、電話番号を入力せよ。 終了:e\n");
scanf("%s",&b);
if (b == "e") break;
strcpy(c[j].tele, b);
j++;
}
printf("氏名  電話番号\n");
for (i=0;i>j;i++) {
printf("c[i].name  c[i].tele\n");
}
}
9796:03/04/30 23:48
すいません13行目になります
char *a

char a[1000]
scanf("%s",&a);

scanf("%s",a);
>>96
exploitコードの見本ですか?
>>94
> char cno[100];/* 変換後の各桁を格納する文字の配列 */

変換対象が unsigned no なら 100 もとることはなかろう。
102デフォルトの名無しさん:03/05/01 00:08
n元連立一次方程式を解くプログラム作って下さい。
数式処理のソフト手に入れろ。
105102:03/05/01 00:37
卑怯な奴等ですね。
有難く頂いておきますが。
107その1:03/05/01 00:48
>82
86ではないが、2をやってみますた

#include <stdio.h>
#include <time.h>

int nyuryoku(){
int t;

while(1){
printf("1:グー 2:チョキ 3:パー\n");
scanf("%d",&t);
if(t<=0||t>=4){
printf("1 2 3のどれかを入力して下さい!\n");
} else {
break;
}
}

return t;
}
108その2:03/05/01 00:48
int janken(int a,int b){
if(a==b){return 0;}
if(a==1&&b==2)return 1;
if(a==1&&b==3)return -5;
if(a==2&&b==1)return -1;
if(a==2&&b==3)return 2;
if(a==3&&b==1)return 5;
if(a==3&&b==2)return -2;
}

void main(){
int pla=0,plb=0;//A,Bのいる位置
int i;
int ta,tb;//じゃんけんの手
int jan;
char *s;
time_t a;
109その3:03/05/01 00:49

for(i=1;i<=10;i++){
ta=nyuryoku();
tb=time(NULL);
tb=tb%3+1;
jan=janken(ta,tb);
if(jan>=0){
pla=pla+jan;
printf("Aの勝ち\n");
printf("Aは階段を%d段上がりました\n",jan);
} else {
plb=plb-jan;
printf("Bの勝ち\n");
printf("Bは階段を%d段上がりました\n",-jan);
}
}

if(pla<plb)s="Bの勝ちです";
if(pla==plb)s="あいこです";
if(pla>plb)s="Aの勝ちです";

printf("Aは%d段に、Bは%d段にいるので%s",pla,plb,s);
}
110107:03/05/01 00:51
なんか、ダサいプログラムだなあ・・・
もっと上手い方法きぼんぬ
111デフォルトの名無しさん:03/05/01 00:57
うーん、長いね。もっと簡潔に出来そうじゃない?
112102:03/05/01 01:01
( ゚Д゚)ゴルァ!!
コンパイルしたけど下の奴はコンパイルできねえし
gauss.cは出来たけど実行したら
nしか入れられないじゃないか!

2 2 3  x    10
3 2 3  y  =  9
9 2 3  z     8

とかやりたいの!
113107:03/05/01 01:04
もっと簡素にですか・・・
いいプログラムきぼんぬ

っていうか、janken関数が自分で書いててなんか気持ち悪い
int janken(int a,int b){
 static int const *const sSteps[] = {0, 1, -5, -1, 0, 2, 5, -2, 0};
 return sSteps[(a - 1) * 3 + (b - 1)];
}
115107:03/05/01 01:12
>112
Aを行列として
Ax=y
を解きたいんでしょ?
線形代数の教科書に載ってる、余因子を使って逆行列を求める方法を使えば?

1.A,yの値を入力する
2.detAを求め正則かどうかを判別する
3.余因子を計算し、それを用いてAの逆行列A^(-1)を求める
4.x=A^(-1)yを計算し、表示する
116107:03/05/01 01:16
>114
おぉ、成る程
いい方法教えてくれて有難うございます
>82
#define NGAMES 10
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int
main(int argc, char **argv)
{
  unsigned long seed;
  int a = 0, b = 0, x, y, i;
  int p[3][3][2]={{{0,0},{1,0},{0,1}},{{0,1},{0,0},{1,0}},{{1,0},{0,1},{0,0}}};
  char *name[3] = {"goo", "choki", "paa"};

  seed = argc > 1 ? atoi(argv[1]) : time(NULL); 
  srandom(seed); printf("# seed = %ld\n", seed); 
  for (i=0; i<NGAMES; i++){
    x = random()%3; y = random()%3; a += p[x][y][0]; b += p[x][y][1];
    printf("turn %2d: A:%5s(%2d), B:%5s(%2d)\n", i+1, name[x], a, name[y], b);
  }
  if (a < b) puts("B won"); else if (a > b) puts("A won"); else puts("draw");
  return 0;
}
118102:03/05/01 01:30
>>112で俺が書いた連立方程式って

2x+2y+3z=10
3x+2y+3z=9
9x+2y+3z=8

って事だよね?

xの解が3個あるような...(°Д°)数学分かんね
>118
行列式は知ってる?
この場合行列式(detAと書く)が0になるから
解は無限に存在するんだよ
ゴメン、うそ書いたかも・・・
この場合、条件を満たすx,y,zは存在しないみたいね
121102:03/05/01 01:43
(°Д°)撃沈しました。寝ます。
122デフォルトの名無しさん:03/05/01 02:40
enum AHYA
{
 Mona, Giko, Shii
};

ってenumがあったとき、
関数(Mona) // 0を返す
関数(Giko) // 1
関数(Shii)  // 2

って関数がC++にあったような木がするのですが、
俺様の気のせいですか?
>>122

別に関数なんて使わないでも値指定しなきゃ
デフォで012,、って入ってる気がするが俺の気のせいですか?
124デフォルトの名無しさん:03/05/01 02:58
#define G 1
#define C 2
#define P 5
int win(int a, int b) {
return a == G && b == C || a == C && b == P || a == P && b == G;
}
if (win(a, b)) c += a;
else if (win(b, a)) d += b;
こんな感じでどう?
>>113
デフォ。1個目は省略すると0、2個目からは++していく。
>>82の2を見て「どうして“キーボードから入力”なんて書いてないのにscanf使ってんだ? おまえら文盲か?」と思う。
 ↓
「乱数つかえよ?アホ共」と思い、boost::mt19937にstd::timeで実装してみる。
 ↓
あいこの判定がないのに気づく。
 ↓
完成しレスするかと読み返していると、ふと「場合によっては10回ループ中で、あいこの無限ループ?」という事実に気づく。
 ↓
女々しくZThreadで逃げてみる。
 ↓
数レスでは収まらない馬鹿長いコードになっている。
 ↓
他人のために数時間を無駄にしていることに気づき、なにもかも忘れようとゲームを始める。
 ↓↑
なにか納得いかない。(繰り返し)
128デフォルトの名無しさん:03/05/01 05:46
>>119
蛇足だが、補足
行列式が0だからといって解が無限にあるという考えは間違い。
一般の非斉次の場合、解が無い場合がほとんど。
つまり連立方程式は
1)解が一組だけある。
2)解そのものが無い
3)無限組ある
の3つの場合が起こりえるが、このうち行列式=0で起こるのは2)3)
のいずれか。
高校での行列の扱いが20年前と比べてスゲエ減ってるのに衝撃を受けたが、
それでも>>128の内容は数Cの教科書に載ってますな。
130デフォルトの名無しさん:03/05/01 06:52
>>129
最近の中学校と高校の数学の教科書見ましたけど、こんなんで日本は大丈夫なのか?
って思っちゃいました。

これで思考力をつけるとか言ってるんだから正気じゃないね。

基礎力のないところに思考力もへったくれもないだろっての!
131102:03/05/01 07:04
(°Д°)私は理系の大学生ですが何か?
>>129
行列式(det)なんて、大学入るまで習ってねーぞー。
確か・・・。
電光掲示板みたいに文字を横に移動させるプログラムをlocateを使って
作りたいんですけど作れません。どなたか教えてくださいm(_ _)m
134デフォルトの名無しさん:03/05/01 09:58
オレニマカセロ!
>>134
マカセタ!
>>134
ガンバッテ!
どのレベルで聞きたいのかわかりません。
とりあえず、これだけ聞くと、memcpyで出来そうな気がするけど。
>>132
こないだ知合いの高3に数C教えたけど、逆行列は載ってたよ。
「行列式」という言葉や「det A」はなぜか書いてなかったけど、
同じものをΔと書いて>>128と同じことが説明してあった。
ついでにいうと、その数Cの教科書には掃き出し法による
連立一次方程式の数値解法のBASICのコードも載ってた。
つうか、今の数Cの教科書の行列のところは、和、積、ケーリーハミルトン、
逆行列、連立一次方程式、掃き出し法しかのってないんだけど。
線形空間の言葉が全然出てこなくておじさんクラクラしたよ。
void erase(char *s) {
for (; *s; s++) putchar(' ');
}
for (;; x++) {
locate(x, y);
puts(s);
if (end) break;
locate(x, y);
erase(s);
}
>>139
むぅ。
>>139
ありがd
142デフォルトの名無しさん:03/05/02 09:48
#include <stdio.h>
#define NUMBER 5
void one(int i, int vc[])
{
while(i < 2) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
i++;
} }
int main(void)
{
int i;
int vc[5];
i = 0;
puts("5個の整数を入力してください。");
while (i < 5 ){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
i++;
}
puts("逆に並べると");
one(i, vc );
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}
puts("となります。");
return(0);
}

143デフォルトの名無しさん:03/05/02 09:51
5個の整数を入力してください.
1番目: 5
2番目: 80
3番目: 110
4番目: 2200
5番目: 33000
逆にならべると
33000
2200
110
80
5
となります.


こんな風にしたいんですがおながいします
iの値を再初期化してへんやん
void one(int i, int vc[])
{
i = 0;
while(i < 2) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
i++;
} }
#include <stdio.h>
#define NUMBER 5
void reverse(int i, int *vc) {
for (; --i > 0;)
*vc++ ^= vc[i--] ^= *vc ^= vc[i];
}
int main(void)
{
int i, vc[NUMBER];
printf("%d個の整数を入力してください。\n", NUMBER);
for ( i = 0;i < NUMBER; i++){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
}
puts("逆に並べると");
reverse(NUMBER, vc);
for (i = 0;i < NUMBER; i++)
printf("vc[%d]=%d\n", i,vc[i]);
return 0;
}
147デフォルトの名無しさん:03/05/02 10:03
今のでやったんですが
5個の整数を入力してください。
1番目:1
2番目:2
3番目:3
4番目:4
5番目:5
逆に並べると
となります。 ←ここのところが抜けちゃう運ですよ



while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}

for (i=0; i<5; i++) printf("%d\n", vc[i]); 
>>146
> *vc++ ^= vc[i--] ^= *vc ^= vc[i];

また、「 未 定 義 」か...。
150デフォルトの名無しさん:03/05/02 10:07
>>146
whileぶんで作らなければならないんですよ
i=0;
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}
>>151
そりゃあ、その行には出力するための処理がないからね。
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
forを使え forを使え forを使え forを使え forを使え forを使え forを使え
>>149
for (; --i > 0; vc++, i--) *vc ^= vc[i] ^= *vc ^= vc[i];
これでいい?
>>151
ちょっともちつけ
何言ってるのかわからなくなってきてるぞ
156151:03/05/02 12:38
151は150にレスしただけで助けてほしいわけではないです。
コピペしたときに入っただけで。
157デフォルトの名無しさん:03/05/02 12:43
i=0;
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}


ここの部分をどうすればよいのでしょうか
教えてください
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}

i=0;
while (i < 5) { ←ここの部分が表示されないんだけど
printf("%d\n", vc[i]);     助けてください
i++;
}
もう一箇所ある予感!
printf("%d" , i);
161デフォルトの名無しさん:03/05/02 13:15
#include <stdio.h>
#define NUMBER 5
void one(int i, int vc[])
{
while(i < 2) {
int temp = vc[i];
vc[i] = vc[4 -i];
vc[4 -i] = temp;
i++;
} }
int main(void)
{
int i;
int vc[5];
i = 0;
puts("5個の整数を入力してください。");
while (i < 5 ){
printf("%2d番目:", i + 1); scanf("%d", &vc[i]);
i++;
}
puts("逆に並べると");
one(i, vc );
i = 0;
while (i < 5)
printf("%d", i);
printf("%d\n", vc[i]);
i++;
puts("となります。");
return(0);
}
こんどは、5番目まで入力したら、その後ずっと止まらなくなってしまいました
>>161

最後のwhileの中括弧が抜けてるよ
これだとprintf("%d",i);が無限にw
163デフォルトの名無しさん:03/05/02 13:30
t99j017@opbb076[ 19 ] kadai4-2
5個の整数を入力してください。
1番目:1
2番目:2
3番目:3
4番目:4
5番目:5
逆に並べると
01
12
23
34
45


手取り足取りで申し訳ないが今度はこんな風になってしまった。
この課題が終わったら少しまじめに取り組もうと思うのでこれだけはお願いします。
164デフォルトの名無しさん:03/05/02 13:40
すんませんできました。
本当にありがとうございました
またくるかもしれませんがよろしくね
アカウント名t99j017か
>逆に並べると
全然逆じゃないんだがいいのか?
99年度入学のj科17番さん?
>>167
大阪工大?
>>167
留年 or 院 ってことかな ?
藻前らみっともない
俺も身元探りレスしようとしたけど、皆でそんな事したら、
来れなくなっちゃうよ・・・
172172:03/05/02 21:23
生年月日を和暦で"S57/6/5"という書式で標準入力したとき、
西暦に変換し"1982年06月05日"という書式で標準出力する
プログラムを作成しなさい。ただし、生年月日は明治元年
以降に対応すること。

どのような条件式をつくればいいのでしょうか?
if elseで可能ですよね?
?format$("S57/6/5","yyyy年mm月dd日")
1982年06月05日
#include <stdio.h>
int main()
{
char c;
int year;
int month;
int day;

scanf("%c%d/%d/%d",&c,&year,&month,&day);
/* 元号を西暦に変換する処理は後回し */
printf("%d年%02月%02日\n",year,month,day);

return 0;
}
で、その変換処理だが・・・まあswitchを使うだろう。
何年から何年が明治で何年から大正とか知らないんだよな・・・
176172:03/05/02 21:39
>>175
1868年から明治、1912年から大正、
1926年から昭和、1989年から平成です
>>174
不正な入力で落ちまくり(w
平成1年1月1日は存在しないけどな。
>>177
気にするな(w
宿題じゃなきゃこんなコードかかん
>>178
そもそも平成1年が存在しない(よね?)
>>180
Excelでオートフィルかけたらこんなんなったが?
昭和64年1月6日
昭和64年1月7日
平成1年1月8日
平成1年1月9日
>>181
それはエクセルがおかしい。
平成元年ならあるが平成1年はない
今は元年が1年の別名だってことを知らない奴がいるのか。
別名ねぇ・・・平成1年なんて言ったら恥書くと思うけど。
その時に別名だからいいんだと言い張るのかい?
本題に戻そう

>>176
あり得ない日付を入力したらエラー処理をしろとか言われた?
186172:03/05/02 22:04
>>185
月別に日にちの制限を設ける必要はないと思います。ただ13月、
32日はさすがにエラー処理しないといけないでしょう
>>184
恥書くわけ無いでしょ。
普通に使われてるよ。
むしろあんたが恥。
オレの脳内ではできた。とりあえずスカラー波で送っとく。
白い服は着てないよね?
>>189
うん。普通に使われてるね。
この件数の差で普通か・・・
件数で計れるものではないかもしれないけど
NENGOU,NENSUU
平成,1
平成,2
平成,3
#というわけで、数字しかはいらないんだから、無茶を言うな。
普通じゃん。
1年という言い方が間違っているならそうとう減るはずだからね。
特にgo.jpなら。でもこの差はgo.jp以外でも一緒だし。



いいかい。1年という言い方は正しいんだよ。
>>192
変数の中身は1でも、表示を元年にすることはできますね。
195172:03/05/02 22:19
僕の課題は1年でOKですよ
明治='M'
大正='T'
昭和='S'
平成='H'
でいいの?
Masa='M'
Tyuu='T'
Settu='S'
Highschool='H'
if(year==1)printf("元年");
else printf("%d年",year);
これをつけるかつけないかだけだろ?
199194:03/05/02 22:28
あー、そういえば元年と表示することはないな。
表示は西暦だから。
>>1999
西暦元年
>>191
普通かどうかは別にしても、>>180=>>182=>>184 が主張するほどではないことは明白だわな。
>>184 は、何をもって恥を掻くと言ってんだろう ?
普通に考えたら、そこまで言っといて「恥を書く」と書くほうがよほど恥ずかしいと思うが。
>>199
でも、入力は「元年」にも対応しなくちゃね。
市役所に出した書類で「平成元年」と書いたら「1年」に修正されますた
お役所ですから(-_-;) y-。oO○
C言語の基礎を覚えた程度の私に、何か問題をいただけませんか?
C++ではありません。

【開発環境】
Visual Studio.NET(Not 2003)
OSはXP Home
エディタはK2Editerを使用してます。
どなたか、問題を出していただけませんか?
>>205
1から任意数までの素数を全部表示するプログラムとか?
207205:03/05/03 02:16
>>206
それは既にやったんですよ。任意の数字を変数に入れ、
それをfor文、if文でちょいっと…。
わがままで申し訳ありませんが、もう少しレベルの高いものって
ありませんか?
よろしくお願いします。
>>207
MSDN ライブラリを調べて API 使ってみたら?
プログラミングの幅が広くなって面白いよ。
試しに、あるディレクトリにある全てのファイルを表示させてみるとか。
>>205
int expand(double x, int base, char str, char *len)
0 ≦ x < 1 を base 進法で表した小数部を最大 len 文字で str に書き込む。
書き込んだ文字数を返す。
>>209
誤 int expand(double x, int base, char str, char *len)
正 int expand(double x, int base, char *str, char len)
>>210
もちつけ俺
誤 int expand(double x, int base, char str, char *len)
正 int expand(double x, int base, char *str, int len)
>>205
多倍長演算の実装やって、円周率を下1000桁ぐらいまで求めるとか
>>205
アルゴリズムイントロダクションを買ってきて、
最初から順に実装していく。
>>200
明治以降に西暦元年はないわな。
それに西暦では1年なんでは・・・
#include <stdio.h>
char *me;
static void die(char *msg){fprintf(stderr, "%s: %s", me, msg); exit(1);}
int main(int argc, char **argv)
{
  char c;
  char s[BUFSIZ];
  int y,m,d;
  me = argv[0];
  if (fgets(s, BUFSIZ, stdin) == NULL) die("couldn't read input\n");
  if (sscanf(s, "%c%d/%d/%d",&c,&y,&m,&d) != 4) die("invalid format\n");
  switch(c) {
    case 'H': y += 1988; break;
    case 'S': y += 1925; break;
    case 'T': y += 1911; break;
    case 'M': y += 1867; break;    
    default: die("unknown first letter\n");
  }
  printf("%d年%02d月%02d日\n", y,m,d);
  return 0;
}
>>215
exitを使うときはstdlib.hをインクルードせよ。
217デフォルトの名無しさん:03/05/03 08:35
visualC++.netインストールしようとしたら
「ファイルが見つかりません」ってでるんですが
どうしたらインストールできますか?」
>>217
インストールしろという宿題なのか?
マイクロソフトに聞けよ。
219205:03/05/03 08:37
みなさんアドバイスありがとうございます。
>>208
初心者本を読破した程度でAPIが理解できるものなのでしょうか?
まぁせっかくVisual Studio.NETがあるので、見てみたいと思います。

>>209
ああ・・・全然理解できん・・・

>>212
面白そうですね。
多倍長演算は名前だけ聞いたことがあるのですが、実際に使ったことはありませんし、
すごく面白そうです。

>>213
そろそろアルゴリズム云々を勉強しようとしてたので、やってみたいですね。
実際に力もつきそううですし。

みなさん、こんな初心者に丁寧にアドバイス本当にありがとうございました。
>>219
http://www.linux.or.jp/JM/
http://www.bohyoh.com/CandCPP/C/Library/index.html

ここでCの標準関数を調べて、自分で書いてみるってのはどう?
とりあえずはシステム依存の知識がいらないstr系関数から。
平成元年はほぼ1年あったからそれでいいとして、
昭和元年は確か半月もなかったと思うのだが
1926年=昭和元年でいいのか?
うちの甥っ子が昭和64年1月2日生まれだから気になるのかもしれんが。
昭和64年なんて数日
その時に作られた貴重な硬貨があるYO
漏れ、昭和65年の硬貨もってたよ
224sage:03/05/03 16:17
int main(void){
 const int TARGETVALUE=100;
 const int HALFTARGETVALUE=TARGETVALUE/2+1;
 const int UNPRIMENUM=3;
 int i;
 int j;
 bool blnPrimeFlg[TARGETVALUE];
 for(i=0;i<TARGETVALUE;i++){
  blnPrimeFlg[i]=false;
 }
 for(i=UNPRIMENUM;i<TARGETVALUE;i+=2){
  blnPrimeFlg[i]=true;
 }
 blnPrimeFlg[2]=true;
 for(i=UNPRIMENUM;i<HALFTARGETVALUE;i+=2){
  j=i*(i-1);
  while(blnPrimeFlg[i]){
   j+=i;
   if(j<TARGETVALUE){
    blnPrimeFlg[j]=false;
   }
   else{
    break;
   }
  }
 }
 for(i=0;i<TARGETVALUE;i++){
  if(blnPrimeFlg[i]){
   cout<<i<<"\n";
  }
 }
}
225sage:03/05/03 16:17
すみません224です。送信ミスしました(つдT)
あらためて。
1>>様、その他の先生の皆様。Cをはじめて半年の未熟者です。ご意見をいただ
きたいのですが、おながいします。
目的の値までの素数を表示させるプログラムについて課題がでておりまして、
以下のようなコード書いたのですが、問題なく素数は表示される状態です。
ただし、可能であればもう少しスマートに進めたいのですが、なにか改善可能
な場所、方法はありませんでしょうか。よろしくおながいします。

for(i=UNPRIMENUM;i*i<TARGETVALUE;i+=2){
if (blnPrimeFlg[i])
for(j=i*i; j < TARGETVALUE; j+=i)
blnPrimeFlg[j]=false;
}
int prime;//任意の数
int tmp;
(省略)
for(tmp=2; tmp<prime/2; tmp++)
{
   if(tmp == prime) printf("素数\n");
   if else((prime%tmp) == 0) printf("素数ではありません\n")
}

かなり略したけどこんなのじゃだめ?
列挙したいならこれ全体をforで囲むとか
エラトステネスのふるい
226様>>
感動しました!
実際、コードみると納得なんですが、そこまで思いつくのが難しいんですよね。。
どうもありがとうございました。すごくためになりました。また何か在りましたら、
よろしくお願いします。

227様>>
即レスありがとうございます。
今回はmodしようせずに(授業中にmodでおこなうような様誘導があったため。)
あえて進めてみようと思っておりました。ただ、mod使用の際にはかなり、行数を短く
提出できるタイプみたいなので、ありがたく頂戴させていただきます。
どうもありがとうございました。
225です。
228様>>
"エラトステネスのふるい”こういったアルゴリズムが存在してたんですね。
勉強不足でした。。。。
ありがとうございました。
int main(void){
const int TARGETVALUE=100;
const int UNPRIMENUM=3;
int i;
int j;
bool blnPrimeFlg[TARGETVALUE];
for(i=UNPRIMENUM;i<TARGETVALUE;i+=2){
blnPrimeFlg[i]=true;
}
cout<<2<<"\n";
for(i=UNPRIMENUM;i*i<TARGETVALUE;i+=2){
if (blnPrimeFlg[i]){
for(j=i*i; j < TARGETVALUE; j+=2*i)
blnPrimeFlg[j]=false;
cout<<i<<"\n";
}
}
for(;i<TARGETVALUE;i+=2){
if (blnPrimeFlg[i])
cout<<i<<"\n";
}
}
宣伝かよ・・・
234230:03/05/03 20:51
たびたび申し訳ございません。230です。
231様>>
ありがとうございます。最終的にそのような形で固まりました。
232様>>
さっそくチェキしてみます。ただ、先に答えがあると、考える前にみそうな感じがして怖いです。丸写しになりそうで・・・精神力弱いんです(つдT)

前回、226様よりお教えいただいた方法で実行すると、100に含まれる素数を判断するために、条件分岐がfor(i=UNPRIMENUM;i*i<TARGETVALUE;i+=2)のなかで8回、for(j=i*i; j < TARGETVALUE; j+=i)のなかで54回となるのですが、さらにこれを少なくする事は可能でしょうか。
私てきにはこれで限界と思えるため、この状態で提出を考えておりますが、可能であればコードでなくても、結構です。可能とだけお教え願えないでしょうか。
大変お手数おかけしますが、どうぞよろしくお願いします。

素数 "列挙" アルゴリズムを極めるスレ
http://pc2.2ch.net/test/read.cgi/tech/1018657457/
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>

void filter(int limit, char *filename);
int isprime(int *discoverd_prime, int chknum, int dis_num);

/* mainがやるのは、引数チェックのみ。 */
void main(int argc, char *argv[]){
int limit;//この数までの素数を調べる。
char filename[10];//ファイル名

/* 上限数とファイル名の設定。 */
if(argc == 1){//引数無し
limit = 1000;
strcpy(filename,"nanashi.txt");
}else if(argc > 2 && (isdigit(*argv[1])) ){//第1引数が数字で、ファイル名の指定あり
limit = atoi(argv[1]);
strcpy(filename,argv[2]);
}else if(argc >= 2 && (!isdigit(*argv[1])) ){//第1引数が数字でない
limit = 1000;
strcpy(filename,argv[1]);
}else if(argc >= 2 && (isdigit(*argv[1])) ){//第1引数が数字で、ファイル名の指定無し
limit = atoi(argv[1]);
strcpy(filename,"nanashi.txt");
}
if (limit >= 131071){limit = 131071;}//一応の上限
filter(limit,filename);
}
void filter(int limit, char *filename){
FILE *fp;
int num;
int p,i;//ループ処理などに使う汎用変数。
int m;//現在までに発見した素数の個数
int a = limit/2+1; // 素数の最大個数。
int prime[65536]; //素数を格納する配列。とりあえずこんだけ確保しとく。
if((fp = fopen(filename,"w")) == NULL){ //ファイルを作る。
fprintf(stderr,"ファイルが作れませんでした。");
}
printf("%d までの素数を計算し、ファイル名 %s で保存します。\n",limit,filename);

/* 作業開始 */

for(p=0; p < a ; p++){//prime配列の初期化
prime[p]=1;
}
p = 0;
prime[p] = 2;p++; m=1;//偶数はチェックしないので、あらかじめ2を検出したことにしておく。
/* 篩の本体 */

for(num = 3; num <= limit ;num += 2){//偶数はチェックするだけ時間の無駄だ。
if((isprime(prime,num,m))== 0 ){
prime[p] = num; m++; printf("%d ",prime[p]);p++;
}
}
for(p = 0; p< m ;p++){
fprintf(fp," %d",prime[p]);
}
printf("\n以上の素数を保存しました。\n作業が終了しました。\n");
fclose(fp);
}

/* 与えられた数が素数か調べる。 */
int isprime(int *discoverd_prime, int chknum, int dis_num){
int p;
for(p=0; p<dis_num; p++){

if(chknum % *discoverd_prime != 0){
discoverd_prime++;
continue;
}else{
return 1;
}
}
return 0;
}
239239:03/05/04 15:00
int data[4]={1,-2,3,-4};という配列があるとき、いかの値はいくつになるか答えなさい
i=2のとき、data[i++] data[++i]
変数aからjがint型としたとき、下記の式において演算の順序はどうなるか答えなさい。また、a=0b=1c=2…j=9を初期値とするときこの式の実行結果はどうなるか答えなさい。
a = b = c == d && e | |f < g % h / i + j ;
よろしくお願いします。
>>239
なぜ実行して確かめない?
>>239
死んだ方が良いな。
演算子の優先順位なんてこと細かく覚えていられるか。
心配なら括弧を付ける。
>>243
それに関しては激しく同意だが、悲しいけどこれって宿題なのよね。
a = b = (((c == d) && e) | |(f < ((g % h / i) + j))) ;
こうじゃないかな。
文法違反なんだけどね
>>246
えっ、どこが ?
思いっきり初心者の質問だけど

a = b = c
って何?
b=c;
a=b;
>>247
| |
>>248
a, b, c が全て等しい時に真になる新しい比較演算子。
>>250
ああ、なるほど。了解した。
しかし、よく気付いたな、コンパイルしてみたのか ?
>>252
等幅のフォントならひと目で分かるんだが
>249
thx
255デフォルトの名無しさん:03/05/04 18:57
>>239
data[i++] = 3
data[++i] = -4 (ただし上式を行った後なら変な値を返す)

まず (左結合)
 g % h / i (6 % 7 / 8 = 0) ・・・(1)
次に
 (1) + i (0 + 9 = 9) ・・・(2)
でもって
 f < (2) (5 < 9 = 1) ・・・(3)
さらに
 d && e (3 && 4 = 1) ・・・(4)
これから
 (4) || (3) (1 || 1) ・・・(5) *この時orの左側が真なので右は評価されない
最後に (右結合)
a = b = (5) (b = 1, a = b)

ってか演算子の優先順位ぐらいは知ってるだろ


 
256デフォルトの名無しさん:03/05/04 19:02
嘘付いた

c == d が抜けてら

さらに
 c == d (2 == 3 = 0) ・・・(4)
となると
 (4) && e (0 && 4 = 0) ・・・(5) *この時andの左側が偽なので右は評価されない
これから
 (5) || (3) (0 || 1 = 1) ・・・(6)
最後に (右結合)
a = b = (5) (b = 1, a = b)
258デフォルトの名無しさん:03/05/04 20:46
後置インクリメントはPostincrementというのか
259デフォルトの名無しさん:03/05/05 13:34
9.2 12.3
8.3 9.0
8.8 10.3
・・・

上のような1行にスペース区切りで、複数行にデータが入っている
ファイルから、データを分割してそれぞれの
総和をもとめたいんですが
どうすればいいですか?

PerlでいうところのSplit関数ってないんですが?
あるよ。strtok
正規表現みたいな頭のいいことは出来ないが。
fstream s("hoge.txt");
vector<double> values;

while(s){
double sum=0;
for(int i=0; i<2; i++){
ddouble val=0;
s>>val; sum+=val;
}
values.push_back(sum);
}

でけた!! 駄目だこりゃ!
include<stdio.h>
main()
{
FILE* file;
int ret;
double f=0,s=0;
if( (file=fopen("data.txt","r")) == NULL )
return 0;
do{
s+=f;
ret = fscanf(file,"%ld",&f);
}while(ret != EOF);
printf("%ld",s);
fclose(f);
return 0;
}
改行とか入れてなけりゃこれでできるとおもうが
各行ごとに総和だすのか?
STRTOK
バグ
これらの関数は絶対に使用しないこと。もし使用する場合は、以下のことに注意すること。

これらの関数はその最初の引数を変更する。
これらの関数は const な文字列では使えない。

終端文字はすべて \0 になってしまう。

strtok() 関数はパーズに静的バッファを用いるので、スレッドセーフでない。もしこれが問題になる場合は strtok_r() を用いること。
例えば1クラス20人の生徒の身長と体重の
それぞれの総和を求めたいのです。
#include <iostream>
#include <fstream>
#include <vector>
#include <numeric>
using namespace std;
int main()
{
  vector<double> m, kg;
  ifstream s("hoge.txt");
  while(s)
  {
    double val;
    s >> val;
    m.push_back(val);
    s >> val;
    kg.push_back(val);
  }
  m.pop_back();
  kg.pop_back();
  cout << "身長の和は" << accumulate(m.begin(), m.end(), 0.0) << endl;
  cout << "体重の和は" << accumulate(kg.begin(), kg.end(), 0.0) << endl;
  return 0;
}
267デフォルトの名無しさん:03/05/05 14:44
#include <stdio.h>
main()
{
 FILE *fp;
 double height, weight, h_sum = 0, w_sum = 0;
 char buf[256];
 
 if ((fp = fopen("filename.txt", "r")) == NULL) {
  printf("ERROR\n"); exit(1);
 }

 while (fgets(buf) != NULL) {
  sscanf("%lf%lf", &height, &weight);
  h_sum += height;
  w_sum += weight;
 }
}
268267訂正:03/05/05 14:48
#include <stdio.h>
main()
{
 FILE *fp;
 double height, weight, h_sum = 0, w_sum = 0;
 char buf[256];
 
 if ((fp = fopen("filename.txt", "r")) == NULL) {
  printf("ERROR\n"); exit(1);
 }

 while (fgets(buf, 255, fp) != NULL) {
  sscanf(buf, "%lf%lf", &height, &weight);
  h_sum += height;
  w_sum += weight;
 }
}
>>259
C の勉強/宿題なの ?
実務で使う & Perl がわかるなら、Perl でやったほうがいいんじゃないのか ?
>>259
C++なら準標準ライブラリboostのregex.hppの中にsplitと同じ事が出来る
メソッドがあります。
regexはDLLをビルドしなきゃいけないからちょっとめんどくさいですよね
リスト構造なんですけど,最初に入れたリストを表示したいのですが
一番最後に入れたリストが表示されてしまいます(FIFOというやつでしょうか)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list {
char *name;
char *tele;
struct list *nextlist;
};

>>274
>>273

main()
{
struct list *a, *b;
char *n,*t;
int fig = 0;
b = NULL;

while(1) {
printf("名前キボンヌ。終了:e\n");
scanf("%s", n);
if(n[0] == 'e') break;
a = (struct list *)malloc(sizeof(struct list));
a->name = (char *)malloc(strlen(n)+1);
strcpy(a->name,n);
printf("電話キボンヌ。終了:e\n");
scanf("%s", t);
if(t[0] == 'e') {
fig = 1;
break;
}
これだけでどうしろと(怒)
>>274

a->tele = (char *)malloc(strlen(t)+1);
strcpy(a->tele,t);
a->nextlist = b;
b = a;
}
printf("名前 電話番号\n");
a = b;
while (1) {
if (a == NULL)
break;
printf("%s %s\n", a->name,a->tele);
a = a->nextlist;
}
}
>>275
スマソ。ソースちょっと長くなった。

構造体は名前のポインタと電話番号のポインタの2つです。
scanfつかってデータを入力する。eで終了します。
>>273
リストの最初を保持する変数がない。

a はmallocで確保した要素を保持している。
b はリストの最後を保持している。

表示はaを表示しているから、一番最後に確保した要素に
なるのは当たり前。
279278:03/05/05 21:10
解釈間違えた。
> a->nextlist = b;
> b = a;
これはLIFOのやり方だ。
双方向じゃないのがつらいが・・・やってみるか
>>273
278のいうことももっともだが
それ以前にどうしてsにmallocしないんだ。
確実にメモリー参照エラーっぽ。
失礼。
char *n;
scanf("%s",n);
これまずいでしょ。
ちゃんとコンパイルして実行してみた?
最後に入れた要素を表示する前に落ちると思うんだけど。
>>283
それ以前に、最初の scanf() で落ちたよ。
(Win2KPro, VC++6, Debug Build)

まあ、>>282 が書いてる通り当たり前なわけだが。
画像ってcで表示できますか?
>>285
できる。
ちょっと自分でなんとなくいい宿題を思いついたので。
初心者向けでスマソ。
1〜任意の数字までの階乗を表示するプログラム。

・・・15!ぐらいになるとCでは扱えない数字になっちゃうかも
288280:03/05/05 22:22
>>273
長いので2回に分ける。
どういうわけか構造体を次のようにあらかじめ
サイズきめとかないとエラー出るのでそこはかんべん。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<conio.h>

typedef struct{
char name[256];
char tel[256];
void* nextpoint;
}LIST;

void movenext(LIST** pplist)
{
LIST* sub;
sub = (LIST*)((*pplist)->nextpoint);
free(*pplist);
*pplist = sub;
}

main()
{
char n;
char name[256],tel[256];
LIST *lpbottom=0,*lptop=0,*sub=0;
lpbottom = lptop = (LIST*)malloc(sizeof(LIST));

289280:03/05/05 22:24
つつきでちゅ。やっぱり長いんで分けます。
while(1)
{
printf("------------------\n");
printf("どれよ?\n");
printf("1:入力\n");
printf("2:出力\n");
printf("other:終わり\n");
printf("------------------\n");
n = getch();
if(n == '1')
{
printf("名前キボン\n");
scanf("%s",lptop->name);
printf("電話番号キボン\n");
scanf("%s",lptop->tel);
lptop->nextpoint=malloc(sizeof(LIST));
lptop=(LIST*)lptop->nextpoint;
}
290280:03/05/05 22:25
これで最後。切れて長くて流してスマソ
else if(n=='2')
{
if(lpbottom==lptop)
break;
printf("名前 %s\n",lpbottom->name);
printf("電話番号 %s\n",lpbottom->tel);
movenext(&lpbottom);
}
else
break;
}
while(lpbottom != lptop)
movenext(&lpbottom);
free(lpbottom);
return 0;
}
int main()
{
int n;
int64 ret = 1;
cin >> n;
for(int i=2; i<=n; i++)
  ret *= n;
cout << ret << endl;
return 0;
}
int64 ってなに?
sizeof(long) = 4のときの
long long のこと?
int64は64bitの整数型だけど、
sizeof(long) = 4のときの
long longのサイズって一意に決まってるの?
>>288
> typedef struct{
> char name[256];
> char tel[256];
> void* nextpoint;
> }LIST;

name, tel を固定長で持つ是非は別にして、void* nextpoint ってなんだ ?
こんなこと書く奴を俺は信用しない。
295292:03/05/05 22:34
はぅあ
.NETだと long longでエラー出して
確認できねぇ・・・
誰か回答キボン
296288:03/05/05 22:37
LIST* nextpoint
とおいていいのかわからなかったんで
void* で妥協。
297273:03/05/05 22:37
>>280
ありがとうございます。
双方向リストもこれの応用と考えればいいんでしょうね。
今度は自力で頑張ってみまつ。
298288:03/05/05 22:40
void* がつかえない
Cコンパイラってないよね?
念のため
>>294
>>272
スタティックリンクも出来ますよ。LIBをビルドする事になるけど。
winsockまたはUNIX socketを使ってCまたはC++で
http://chart.yahoo.co.jp/t?c=2003&a=4&b=1&f=2003&d=4&e=30&g=d&s=6701.t&y=0&z=6701.t
を取得し終値の平均値を出しなさい。
難しすぎるか…
>>291
わっちの使っているコンパイラにint64なかったんで
結果が正確ではないが次のようにしますた。
main()
{
int n;
double i,t=1;
scanf("%d",&n);
for(i=2;(int)i<n;i++)
t*=i;
printf("%ld",t);
return 0;
}
>>300
かききれないような・・・
303301:03/05/05 22:56
失礼−
次のとこ訂正
×printf("%ld",t);
○printf("%lf",t);
"winsockまたはUNIX socket"
これじゃ書ききれないな。wininetとboost使えれば書ききれるけど。
#include<stdio.h>

int f();

main()
{printf("%d\n",f(3.14));}

int f(int a)
{return a*3.14*2;}
306305:03/05/05 23:03
かき忘れた
この結果がなぜ6になるのか教えてください
>>305
18か19
すれちがいになったし違うし
18になったけど
>>306
×int f();
○int f(int)
つーかエラーでコンパイルできないだろ多分
>>305
int f()
int f(int a)
は引数が違うので別物と見られます。
使うときに引数によってどっちが使われるか決まります。
で、f(3.14)なので引数がある
int f(int a)が使われ。
3.14がintにキャストされ a=3状態に。
で、a*3.14*2で18.28に。
値返すときにやっぱりintにキャストされるので
18になるってこった。
切り上げの場合は19か。コンパイラによるだろうが。
>>310
コンパイラによっちゃ
仮想関数ってことでOK。
だめなほうが少ないかしら?
C++ならね。

Cなら、doubleの引き数を渡し、intの引き数を受け取ると言う事態が発生する。
>>313
Cでも自動的にキャストしてくれないのでつか?
コンパイラによるのかな。
>>311
> int f()
> int f(int a)
> は引数が違うので別物と見られます。

これはあってるけど...

> int f(int a)が使われ。

アホか。そういう状況 (=C++) なら、int f(int a) はまだ宣言されてないから、単にそんな関数は無いと怒られるだけのことだよ。

>>312
仮想関数 ? C++ の初歩からやり直すべし。

>>313
これが、正解。

>>314
キャストしようが無いだろ。
f(3.14) をコンパイルしている時点では、f(int) なのか f(double) なのかわからんのだから。

次の式が成り立つとき、a+bがもっとも小さいときの
aとbを求めなさい。
a*b=2450448
こんな問題どうでしょ。宿題ってわけじゃないんですが。
>>316
それ、C/C++の問題なのか?
318315:03/05/05 23:36
>>315
はて、VCなら通ったんだが・・・
VCが特殊なのかねぇ。
ところでポケコンのCコンパイラでやってみたところ
これだめでした
int f();
int f(int a)
{
return a*3.14*2;
}
fが再定義されてるとのことでだめでした。
たんにへっぽこコンパイラなのかもしれないけど。
>>316
a+bが尤も小さくなるようにaとbを選べばいいんだな?
a=-1,b=-2450448でどうだ。
>>315
VCはCコンパイラでもあるからな。
321316:03/05/05 23:38
>>319
ウマヒ!
でも自然数限定ってことで。
>>319
いやいや、例えばa=-1e-100,b=-2450448e100の方が小さくなるぞ。
ということで、解が得られないじゃぁないか。>>316
|a+b|って書けば良かったのにね
324318:03/05/05 23:40
スマン名前間違えた。
311です。
>>323
|a| + |b|だろ
>>325
(゚Д゚)ハァ?
327316:03/05/05 23:43
いいたいことは325だったんだが
323も間違えでもないような・・・
a+b=整数 だから
aの符号=bの符号
よって
|a|+|b| = |a+b|
ってことでよい?
329328:03/05/05 23:46
しつれい。a+b=正の整数
>>327
> いいたいことは325だったんだが
> 323も間違えでもないような・・・

はぁ ?

>>321
> でも自然数限定ってことで。
>>325
|a| + |b|だろ

全然違うじゃねーか。
331327:03/05/05 23:59
>>330
両方符号が同じなら正でも負でもよくなっちまいますな
スマソ
計算手法はあまりかわらんと思ったもんで
別にいいかなと。
332316:03/05/06 00:08
最終的にはこうしました。
ともかく整数aとbが次の関係を持つとき、|a+b|がもっとも小さくなる時の
aとbの絶対値を求めよ。
a×b=2450448
ややこしくてすみません。言うまでもないがCかC++で書いてけれ。
ところでさっきつっこまれたんですがここは
文法に関する問題のみでつか?
妥当にプログラムくんでやってみたが
a=1547 b=1584で合計3131が最小らしい。
かなり適当に作ったからウソかも?w
#include <stdio.h>
int main(void){
int a, b, x;
for (x = 2; x < 10000000; x++)
for (a = 1, b = x - a; a <= b; a++, b--)
if (a * b == 2450448) {
printf("%d %d\n", a, b);
return 0;
}
return 0;
}
>>334
コンパイルしたら>>333と同じ結果が出た
俺は頭悪いからこうやったけど

#include <stdio.h>
#define NUM 2450448
int main(void)
{
int a,b,ma,mb,min=NUM;
for(a=1;a<NUM/2;a++) {
if(NUM%a==0) {
b=NUM/a;
if(min>a+b) {
ma=a;
mb=b;
min=a+b;
}
}
}
printf("%d %d",ma,mb);
return 0;
}
#include <stdio.h>
#include <math.h>
int main()
{
int const num = 2450448;
int a = floor( sqrt( (double)num ) );
for( ; a > 0 ; --a )
{
int const b = num / a;
if( a * b == num )
{
printf( "a = %d , b = %d\n" , a , b );
return 0;
}
}
return 1;
}
なめてかかってたら
商の整数チェックわすれて違う答えが出た
…フカク
#include <stdio.h>
#include <math.h>
#define NUM 2450448
int main(void){
int a = sqrt(NUM), b;
while (a * (b = NUM / a) != NUM) a--;
printf("%d %d %d", a, b, a + b);
}
#include <stdio.h>
#include <math.h>
#define N 2450448
int main(void){int a=sqrt(N);while(a>1&&(N%a)!=0)--a;printf("%d %d",a,N/a);return 0;}
while(N%a)--a;
#include <stdio.h>
#include <math.h>
#define N 2450448
int main(void){int a=sqrt(N);while(N%a)--a;printf("%d %d",a,N/a);return 0;}
このスレの>316はいいことしたな。
いい流れ。
こんな感じで誰か問題だしてくれぃ
344343:03/05/07 00:51
・・・と思ったけど、やっぱり他力本願はいけないので自分で探しました。
ピタゴラス数をどんどん出していくやつとか。
あとは、完全数を列挙していくものとか。

ピタゴラス数・・・各辺の長さが整数で表される直角三角形。3:4:5とか。
完全数・・・約数のうち、その数自身以外の物の和がその数になるもの。
例えば、6。これの約数は1,2,3,6。ここから自身の数、6以外の和を出す。
1+2+3 つまり6(自身の数)

こんなん面白そうなんで出してみました。
俺もちょっと考えてみまふ
345343:03/05/07 01:10
階乗列挙プログラムとか。
なんか問題が欲しいって言うのならこれはどう。

n 路盤に次の条件を満たすように石をおくとき、
おくことのできる碁石の最大数を求めよ。
条件: どの4つの碁石も路に平行な辺を持つ長方形にならない。

なお、路とは碁盤に引かれた線のことで、
縦横に n 本の路がある碁盤を n 路盤と言う。
石は路と路の交点におく。条件を無視すれば n*n 個の石がおける。
>>346
長方形以外ならいいのね
>>347
yes
なお長方形とは4つの角が等しい四辺形なので正方形も長方形とみなす
>>344
// 単純にどんどん出すけど全てを列挙しているわけではない
#define LIMIT (10000)
int main(void)
{
 for (int ic = 1; ic < LIMIT; ic++) {
  int num = 2 * ic * (ic + 1);
  printf("%d, %d, %d\n", 2 * ic + 1, num, num + 1);
 }
 return 0;
}
#include <stdio.h>
int main(void)
{
int i;
i=0;
do{
printf("%d\n",i);
i++;
}while(この中身がわかりません);
return 0;
}
1から400まで+1づつ表示したいです
よろしくおながいします
1回目のループで0が出力されるがいいのか?
>>351
はい、よろしくおながいします
はあ・・・
次のプログラムの実行結果を調べよ

for(i=1;i<=10;i++){
for(j=1;j<=10;j++){
System.out.print("\n");
}
プログラムの出力を次のように修正せよ

● 出力の横幅を40に変更
● 出力の縦幅を20に変更


この問題の解答おながいします
355354:03/05/07 15:55
上の文ですが
for(i=1;i<=10;i++){
for(j=1;j<=10;j++){
System.out.print("*");
}
System.out.print("\n");
}
でした
ネタが増えてきたな
それはCの宿題なのかと小一時間(ry
>>354
宿題以前の問題だよ。それくらいは自力で理解できないと、
ネタとマジの区別もつかなくなるぞ。

>>350
普通はforループを使うケースだな。
なんでdo-whileループなんだ?

>>345
多桁演算クラスを用意してくれたらすぐにでも書くぞ。w
#確か700!くらいで2000桁近く入ったような記憶がある。
>>350
#include <stdio.h>
int main(void)
{
int i;
i=0;
do{
printf("%d\n",i);
i++;
}while(i < 400);
return 0;
}
for(i=1;i<=20;i++){
for(j=1;j<=40;j++){
System.out.print("*");
}
System.out.print("\n");
}
>>359
それだと0〜399だべ
362デフォルトの名無しさん:03/05/07 18:53
標準入力から文字列を最低でも5個以上
読み込んだものを戻り値とする関数を
reallocを使って作成せよ。

お願いします
オレニマカセロ!
>>362
 関数の終了条件が不十分。
vector<string> readstringfromcin()
{
void *dummy = malloc(50);
vector<string> strs;

for(int i=0;i<5;i++)
{
std::string t;
cin >> t;
strs.push_back(t);
dummy = realloc(dummy, t.size());
}
free(dummy);
return strs;
}

ダミーかよ
>363
オマエニマカセタ!
>>366
realloc使えというから使ってやったんだ。感謝しろ。
369デフォルトの名無しさん:03/05/07 19:09
#include <stdio.h>
void main(void)
{
int a,b,c,d,e,f,g;
printf("===============================================");
printf("いまから四則演算をする数値2つ入れなさい");
printf("===============================================");
printf("1つ目");
scanf("%d",&a);
printf("二つ目");
  scanf("%d",&b);
c=a + b;
d=a - b;
e=a * b;
f=a / b;
g=a % b;
printf("演算結果");
  printf("%d + %d=%d\n",a,b,c);
printf("%d - %d=%d\n",a,b,d);
printf("%d * %d=%d\n",a,b,e);
printf("%d / %d=%d\n",a,b,f);
printf("%d % %d=%d\n",a,b,g);
printf("\n");
printf("\n");
printf(" 以上\n");

なぜエラー11も?
>>369
エラーの内容読めよ
標準入力から文字列を最低でも5個以上
てのはどういう意味?文字列の区切りは改行?

返り値の型は char **でいいの?
>369
まるちすんなっちゅーの
改行くらいいれようぜ
374362:03/05/07 19:19
>>371
書いてなかったけど改行だと思う
問題があいまいな気が
じゃあ5行なかったらどうするんだろう。
つーか質問する時はCかC++か書けよ。
書かないから>>365みたいな教師をおちょくるような答えが出てくるんだよ。
>>369
そんなに変数いらない
378362:03/05/07 19:28
>>376
すみません、Cでお願いします
>>365
realloc()の使い方が×です
380うんこ:03/05/07 19:47
>369
「error C2018: 文字 '0x81' は認識できません。」
文字列リテラルとか文字定数とか以外で全角文字使うと、
こういうのが出てくる。全角文字を消せ。使うな。

これが出ると、続けて似たようなのがもう一つ出る。
「error C2018: 文字 '0x40' は認識できません。」
と。ちなみに、そのソースだと全角スペースが入ってる。
インデントはタブで付けるんだ
>>380
やさしいヤツだなオマエ。
ヘルプも活用できないクソ野郎はほっとけばいーのに
382369:03/05/07 20:00
やさしい方々ありがとう。クラスで俺よりできない奴たくさん。
あっ、目くそ鼻くそですか。すいません
専門学校?
384369:03/05/07 20:11
2chで質問する俺は出来る男だぜ
385369:03/05/07 20:15
384の言うとおりです(^^
1から100までの乱数を1000個ふり、その中にどの数字が
何個あるのか数えなさいとの問題がでました。
入力ファイルは1000個の数字であり、出力ファイルは
2列で数字とその個数をかいたものとします。
よろしくおねがいします。
387369:03/05/07 20:18
工業高校
入力の1000個の数字は何に使うんだ?
乱数の種か?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
int result[100],i;
FILE *fp;
srand((unsigned int)time(NULL));
for(i=0;i<100;i++) result[i]=0;
for(i=0;i<1000;i++) result[rand()%100]++;
fp=fopen("out.txt","w+");
for(i=0;i<100;i++) if(result[i]!=0) fprintf(fp,"%d %d\n",i+1,result[i]);
fclose(fp);
return 0;
}
適当に書いたからコンパイル通るかわからん(藁
>>386
int main()
{
std::ifstream if(in.txt);
 std::map<int, int> intmap;
 for(int i=0;i<1000;i++)
 {
  int val;
  if >> val;
  intmap[i]++;
  
 }
 
 std::ofstream of(out.txt);
 for(std::map<int, int>::iterator it=intmap.begin(); it!=intmap.end(); ++it)
 {
of << (*it).first << " " << (*it).second << std::endl;
 }
 return 0;
}
高校生にもなって英語も読めなきゃ口の聞き方も知らないと。

反論する前に自分のミスのフォローをするべきだろ?
392390:03/05/07 20:28
×intmap[i]++;
○intmap[val]++;
>>386
宿題丸投げですか…まあ、そーゆースレだが…
それくらいはやったほうが…
>>390
×
std::ifstream if(in.txt);
std::ofstream of(out.txt);

std::ifstream if("in.txt");
std::ofstream of("out.txt");
課題:
任意の省略型学籍番号(例:M02121)を文字型で入力し、
イニシャルから学科を判定し、学科名、入学年度(西暦下2桁分)及び学籍番号を次のように印刷せよ

学科名:Management
入学年度:’02年度
学籍番号:02175121

この問題で学科はChemistry,Electricity,Architecture,Design,Managementの五つあります。
学籍番号は省略型で読み込んだ02と121の間に17は各学科共通で
17の後に学科別にChemistryは1、Electricityは2となりManagementは5となり
この数字が入ります。
条件として省略学籍番号は文字型で読み込み、最後に正式学籍番号を単一の文字列として完成させる。

一応ここまではできたのですが、学籍番号を出すところがイマイチわかりません
ご教授お願い致します。Cです。
#include <stdio.h>
#define N 5
int main()
{
char a[80];
static char *name[]={"Chemistry","Electricity","Architecture","Design","Manegement"};
int i;
printf("省略学籍番号:");
scanf("%s",a);
for(i=0;i<N;i++){
if(name[i][0]==a[0])
printf("学科名:%s\n",name[i]);

}
396395:03/05/07 20:53
上の課題はポインタ配列の課題です。
ポインタの使い方がまだ良く分からないので
ご教授お願い致します
省略学籍番号の意味がわからん。
02175121の省略形は
175なの?
398397:03/05/07 20:57
ああ分かった。
>>396
×if(name[i][0]==a[0])
○if(!strcmp(name[i], a))
以上。
printf("入学年度:’%c%c年度",a[1],a[2]);
printf("学籍番号:%c%c17%d%c%c%c",a[1],a[2],i,a[3],a[4],a[5]);
じゃだめ?
401395:03/05/07 21:02
省略学籍番号は各学科のイニシャルの頭文字と175を抜いた数字です。
学籍番号の内容的に
最初の02は入学年、17は各学科共通、次の数字が学科判別の数字で
Chemistryなら1、Managementなら5となります。ラストの3桁は生徒番号です。
M02121が省略学籍番号で、これを入力すると
学科名:Management
入学年度:’02年度
学籍番号:02175121
と結果がでます。
説明が下手で申し訳ないです
>>399
いや、どっちでも動くし。
403395:03/05/07 21:04
<<400
入学年度に関してはそれでいいといってましたが
学籍番号でそれはダメだ。といってました。
他の方法ないでしょうか?
>>399
違うでしょ
> 条件として省略学籍番号は文字型で読み込み、最後に正式学籍番号を単一の文字列として完成させる。
がわからん。
1文字ずつ読む条件ならscanf("%s",a)はおかしいし。
>>395
>>400は無難だと思うけど何で駄目なんだ?
あ、判った。
char str[9];
sprintf(str, "%c%c17%d%c%c%c",a[1],a[2],i,a[3],a[4],a[5]);
printf("学籍番号:%s",str);
ってことか?
それでいいのかよ
409395:03/05/07 21:19
>>405
ただ文字型で出せってことだと思うんですが、
>>406
それだと簡単にできるからとの理由でダメなんです。
>>400の方法なら

if (a[0] == name[i][0]) {
printf("学科名:%s\n", name[i]);
i++;
continue;
}

にしないとな
ようするに[a-z]*printf使用禁止ってことかな
#define N 5
for(i=0;i<N;i++){
よりも、
#define numberof(x) (sizeof(x)/sizeof(*(x)))
for (i = 0; i < numberof(names); i++) {
とするべきだが、それを言い出すとscanf()も使うべきではない。
>>410
飛ばしちゃうのかよ!!!
>>411
それでどうやって数値を文字に返るの?
itoaは機種依存だよ。
複雑な文字列を生成するのにsprintf()以上にまともな手段はない。
一文字ずつコピーしたりstrcpy()やstrcat()を駆使するコードを書いたら馬鹿だ。

char number[80], bak;

a++;
bak = a[2];
strcpy(number, a);
strcat(number, "17");
a += 2;
a[0] = bak;
strcat(number, a);
printf("学籍番号:%s",number);
417410:03/05/07 21:26
あぁ
s/continue/break/
だな
418416:03/05/07 21:26
馬鹿だぜ
419395:03/05/07 21:38
>>416
これでいけますか?
じゃあこれでどうよ。
memmove(a+5,a+3,3);
memmove(a,a+1,2);
a[2]='1';a[3]='7';a[4]='0'+i+1;
printf("学籍番号:%s",a);
あ、a[8]=0も要るな
422395:03/05/07 21:53
'memmove' : 定義されていない識別子です。
というエラーがでてきました。
どうすればいいんでしょうか?
すまんかった。忘れてくれ。
424395:03/05/07 22:24
ポインタ使ってできそうなんですがどう思いますか?
>>424
>>416でポインタの移動してますが…
char r[9],t[9];
int num,r_num;
num = atoi(a+1);
r_num = num/1000*1000000+num%1000+170000+i*1000;
memset(r,0x30,8);
r[8]='\0';
itoa(r_num, t, 10);
if(r_num < 10000000) {
memcpy(r+1,t,7);
} else {
memcpy(r,t,8);
}
printf("学籍番号:%s",r);

memory.hとstdlib.hをinclude
>>426
itoaは機種依存ですよ。
428395:03/05/07 22:40
このようにやってみました。エラーが下の2つ出てきました、どう修正すればいいでしょうか?

'++' には左辺値が必要です。
'+=' : 左のオペランドが、左辺値になっていません。

プログラム
#include <stdio.h>
#include <string.h>
#define N 5
int main()
{
char a[80],number[80], bak;
static char *name[]={"Chemistry","Electricity","Architecture","Design","Manegement"};
int i;
printf("省略学籍番号:");
scanf("%s",a);
for(i=0;i<N;i++){
if(name[i][0]==a[0])
printf("学 科 名:%s\n",name[i]);
}
printf("入学年度:'%c%c年度\n",a[1],a[2]);
a++;
bak = a[2];
strcpy(number, a);
strcat(number, "17");
a+=2;
a[0] = bak;
strcat(number, a);
printf("学籍番号:%s",number);

return 0;
}
>>428
a++の前の行でで
char *b = a;
とやってbで処理する。
a++とかa+=2の意味は?
>>428
配列とポインタは別物です
432395:03/05/07 22:56
自分の作ってたプログラムに>>416にあるプログラムを組み込んだんです。
今ポインタとか配列とか理解しきれてないのでなかなかうまいことできないんです。
>>426にあるプログラムを組み込んで実行したところ学科別の番号が識別されてませんでした。
難しいですね・・。
for(i=0;i<N&&name[i][0]!=a[0];i++) ;
printf("学 科 名:%s\n",name[i]);
printf("入学年度:'%c%c年度\n",a[1],a[2]);
printf("学籍番号:%c%c17%1d%s\n",a[1], a[2], i, a+3);
434395:03/05/07 23:03
>>433
printf("学籍番号:%s",number);
のように文字列で出さないといけないと言われました。
%1dの時点でやり直して来いと言われると思います。
>>432
そのまま組み込みたいなら、char a[80];
ってのを
char *a;

a = (char*)malloc(80);
にして、最後にfree(a);をするようにすると通るかと。
sprintf(number, "%c%c17%1d%s",a[1], a[2], i, a+3);
>>435

char temp_buf[80];
char *a=temp_buf;

こっちの方がよいと思う。
sprintf(number, "%c%c17%1d%s",*(a+1), *(a+2), i, a+3);
char *s=a, *t=number;
*t++ = *s++;
*t++ = *s++;
*t++ = '1';
*t++ = '7';
*t++ = '0'+i;
while (*t++ = *s++) ;
これで動いたけど

#include <stdio.h>
#include <string.h>

#define N 5
int main()
{
char a[80];
static char *name[]={"Chemistry","Electricity","Architecture","Design","Manegement"};
int i;
printf("省略学籍番号:");
scanf("%s",a);
for(i=0;i<N;i++){
if(name[i][0]==a[0]){
printf("学科名:%s\n",name[i]);
printf("入学年度:'%c%c年度\n",a[1],a[2]);
memmove(a+5,a+3,3);
memmove(a,a+1,2);
a[2]='1';a[3]='7';a[4]='0'+i+1;a[8]=0;
printf("学籍番号:%s",a);
}
}
}
441395:03/05/07 23:40
皆さんどうもありがとうございました!
無事完成させることができました!
Cの知識があまりないので
memmove(a+5,a+3,3); と
memmove(a,a+1,2);
はプログラム上どういうことを行っているのか教えていただきたいのです。
memmove(a,a+1,2);はどういうこと?と聞かれると答えられないので
ぜひご教授お願い致します。
manとかしないの?
a+3から3バイトをa+5に移動
a+1から2バイトをaに移動

444395:03/05/07 23:51
>>443
なるほど!分かりました!ありがとうございました!
皆さん本当にありがとうございました
445デフォルトの名無しさん:03/05/08 00:04
問題文にちと謎があるかもしれんが・・・。

1.1を読んだら「グー」、2を読んだら「チョキ」、3を読んだら「パー」と表示せよ。
 (多分岐処理、switch文、case文、break文、default文 がキーワード)

2.10人分の英語と数学の点数を2次元配列に入れ、それぞれの平均を求めよ。
 各点数は2次元配列に初期値として格納する。

3.入力した数字が配列中にあるかどうか調べ、見つかれば○、見つからなければ×を
 表示せよ。検索は0を入力するまで続ける。配列中の数値は初期値として設定。
 キーワードはbreak
>>445
1,

#include <string>
#include <iostream>

void main()
{
int i;
std::string out;
std::cin >> i;
switch(i)
{
case 1:
out = "グー";
break;
case 2:
out = "チョキ";
break;
case 3:
out = "パー";
break;
std::cout << out << endl;
}
}
最後の三行は

std::cout << out << endl;
}
}

じゃなくて
}
std::cout << out << endl;
}
2.10人分の点数をファイルから読むか自分でつくるのか分からないので回答不能
3.

#include <iostream>
#include <algorithm>

void main()
{
 int values[] = { 7, 41, 552, 61, 889, 1024, 26 };
 int in;
 for(;;)
 {
  std::cin >> in;

  std::cout << std::find(values, values + 7, in) == (values + 7) ? "×" : "○" << endl;
  if(!in)
   break;
 }
}
endlはエラーが出るならstd::endlに置き換えて。
451445:03/05/08 00:17
>>448
スマソ、自分で入力するっぽい。
>>451
コマンドラインから入力するの?それともソースの中に書いちゃっていいの?
453445:03/05/08 00:23
コマンドラインからみたい
よく見たら,各点数は2次元配列に初期値として格納する。とか書いてあるけど
本当にコマンドラインからなの?
まあいいや、

2
#include <iostream>
#include <numeric>

using namespace std;
void main()
{
 int in[2][10];
 for(int i=0;i<10;i++)
 {
  cout << i << "人目の英語の点数入れてね" << endl;
  cin >> in[0][i];
  cout << i << "人目の数学の点数入れてね" << endl;
  cin >> in[1][i];
 }
 cout << "英語の平均点は" << accumulate(in[0], in[0] + 10, 0.0) / 10 << "点" << endl;
 cout << "数学の平均点は" << accumulate(in[1], in[1] + 10, 0.0) / 10 << "点" << endl;
}

あと言い忘れてたのを2つ。
これらのソースはC++
全角スペースはタブに置き換えろ
もしコンパイラに`main' must return `int'とか怒られたら
void main()を
int main()に置き換えて
最後にreturn 0;で0返してあげてね。
×cout << i << "人目の○○の点数入れてね" << endl;
○cout << i+1 << "人目の○○の点数入れてね" << endl;
457445:03/05/08 00:37
なるほど
親切かつ迅速にありがとう
3.
#include <iostream>
#include <algorithm>
int main()
{
 int values[] = { 7, 41, 552, 61, 889, 1024, 26 };
 int* const values_begin = &values[0];
 int* const values_end = &values[ sizeof( values ) / sizeof( values[0] ) ];
 std::sort( values_begin , values_end );
 for( int in ; ( std::cin >> in ) && ( in != 0 ) ; )
  std::cout << ( std::binary_search( values_begin , values_end , in ) ? "○" : "×" ) << std::endl;
 return 0;
}
いきなりすみません。
課題なのですがVC++を使って、
サーバーからファイルをDLするプログラムを教えてください。
アドレスを入力してそのファイルをDLする感じのプログラム
なのですが、よくわかりません;;よろしくお願いします。
何使えって言われたの?
wininet? winsock?
wchar_tを使った場合半角と全角が混在してても問題無いの?
wchar_t *wc = "ち0こ";
wc[1] = 'ん';
wc[2] = 'げ';

ちんげになるの?'
誤爆した…
>>459
プロトコルは?
おまいはどこまで作った?
#include <windows.h>
#include <wininet.h>
#include <string>
#include <iostream>
#pragma comment(lib, "wininet.lib")
int main()
{
 std::string url;
 std::cout << "『えっとね、URLを入力してほしいの』" << std::endl;
 std::cin >> url;
 HINTERNET hSession = InternetOpen( "Mio", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0 );
 if(hSession){
  HINTERNET hService = InternetOpenUrl( hSession, url.c_str(), NULL, 0, 0, 0 );
  if(hService)
  {
   for(;;)
   {
    char buf[1025];
    DWORD readbyte = 1024;
    InternetReadFile( hService, buf, 1024, &readbyte );
    if( readbyte == 0 ) break;
    buf[readbyte] = 0;
    std::cout << buf << std::endl;
   }
  }
  InternetCloseHandle(hService);
 }
 InternetCloseHandle(hSession);
 return 0;
}
点(a,b)が三角形(x1,y1)(x2,y2)(x3,y3)の内部にあるか判定するルーチンキボン
c1 = (y1-y2)*(a-x2)-(x1-x2)*(b-y2)
c2 = (y2-y3)*(a-x3)-(x2-x3)*(b-y3)
c3 = (y3-y1)*(a-x1)-(x3-x1)*(b-y1)
((c1<0)&&(c2<0)&&(c3<0)) || ((c1>0)&&(c2>0)&&(c3>0))
467459:03/05/08 05:29
レスありがとうございます。
>>460
特に指定はありませんでした。

>>463
プロトコルはhttpかと思います。
僕はDLしてくれる命令がわからなくてgetstoreってのが
そうじゃないかとか探してる最中でした。;;

>>464
ありがとうございます。
えっと、実行してみました。そして
DL先のアドレスはどこになるのでしょうか?
468459:03/05/08 05:37
連続でカキコすみません。

>>464
すみません、表示されました。^^;
わけがわからないこといってすみません。
ありがとうございました!
もう少しまじめにCの勉強をして見ます。
ホントにありがとうございました。
469デフォルトの名無しさん:03/05/08 11:11
int main(void)
{

char str[] = "abcde";
char *ptr = str;

以上のような変数宣言をしたときの
・ポインタ変数のアドレス
・ポインタ変数に格納されている値
・ポインタ変数が参照する配列変数の先頭アドレス
・ポインタ変数の参照先データ

をそれぞれポインタ変数を用いてポインタの位置を文字数分まで
1つずつ進めながら16進数で確認するプログラムを作成せという問題がでました。

これからまじめに講義聞きますので、教えてください。先生・・・許してね。




470bloom:03/05/08 11:13
何を16進数で確認するんだ?
>>471
書いてあるやろ
あげ足を取るならむしろ、
> 確認するプログラム
こっちを。
さて、どういう処理をすれば「確認」した事になるかというと
ポインタ変数に格納されてる値ってなんぞや?
>>469
 あんたもアホだが問題もアホだ。
 ポインタ変数をptrだと考えると
#include<stdio.h>
int main(void)
{
char str[] = "abcde";
char *ptr = str;
int i;

printf( "ptrのアドレス=%p(インクリメント無意味)\n", &ptr );
printf( "ptr参照する配列変数の先頭アドレス=%p(インクリメント無意味)\n", ptr );
for( i = 0; i < 5; i++ )
{
printf( "ptrに格納されている値=%p\n", ptr );
printf( "ptrの参照先データ=%x\n", (int)*ptr );
ptr++;
}
return( 0 );
}
>>475
だよな…
配列の先頭アドレスがインクリメントするごとに変わるのかと思って自分を疑った
>>475
変わらないのを確かめろ、って意味なんじゃない?
478デフォルトの名無しさん:03/05/08 13:47
宿題じゃないけど、助けてください。

5.438,6.546
3.846,5.478
5.154,5.433
6.516,3.937
....
....

こういう座標のデータが入っているファイルが100個くらいあるんですが、
7x7の空間を0.1ずつに区切って、その区切った升目に、点がいくつあるか
を求めたいんです。

70x70の2次元配列を作って、何とかすればいいのかな、とは思うんですが
プログラム作ったことがないので、まったくどうしていいのかわかりません。

どなたか、助けてください、おねがいします。
g < x < g + 0.1
とかでカウントしてけばいいんでないか
>をそれぞれポインタ変数を用いてポインタの位置を文字数分まで

これだとやっぱり、「ポインタ変数のアドレス」と
「ポインタ変数が参照する配列変数の先頭アドレス」も
インクリメントしながら確認せにゃいかんのじゃない?

もっとも前者は「変わらん」でいいとして、
後者をどうやれというのか俺には理解できんけど。

やっぱり問題作成者がポインタを理解してないか、日本語を理解してないかのどっちかだな。
後者
&str[0]
>>478
丸投げしたいならファイルの内容を晒すこと
自分でやりたいならわからない部分をはっきりさせること
>>478
プログラムを組みたい!というのが目的でなければ
エクセル等表計算ソフトを使ったほうが速い
>>480
例示されてるコードにはポインタ変数は一つしかないし
「ポインタの位置を文字数分まで1つずつ進めながら」だから、
配列変数の先頭アドレスをどうこうしなかy、と読むのはおかしい
485478:03/05/08 14:11
>479

そうなんですけど、それを「どうやってCで書くか?」
が、わからないんですわ。
ほんとに初心者ですみませんが、よろしくお願いします。
>>485
#include <string>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
 int point[70][70] = {0};
 ifstream ifs("in.txt");
 while(ifs)
 {
  double x, y;
  ifs >> x;
  ifs.get();
  ifs >> y;
  point[int(floor(x*10))][int(floor(y*10))]++;
 }
 for(int i=0;i<70;i++)
 {
  for(int j=0;j<70;j++)
  {
   if(point[i][j])
    cout << 0.1*i << "-" << 0.1*(i+1) << "," << 0.1*j << "-"
     << 0.1*(j+1) << "=" << point[i][j] << endl;
  }
 }
}
>>486
おまえ嫌なヤツだな
宿題じゃないんですけど、友人からVBのカウントダウンのプログラムで相談されました。
それはできたんですけど、これをCでやるとどうなりますか?
・秒数を入力。Enterでカウントダウン開始
・0になったらビープ音が鳴り、TimeOverと表示
489478:03/05/08 14:46
>486
>487

ありがとうございます。
gccではコンパイルできませんでしたが、g++でコンパイルできました。
実際は360*900に分けないといけなかったので、
これで何とかなりそうです。
ほんとに助かりました、ありがとうございました。

>483
ファイルサイズが結構でかいのと、処理するファイルがたくさんだったので、
excellではちょっと大変そうだなあ。と思いまして。
awkを少し使えるので、試しに作ってみたんですけど、うまくいかなかったのと、
遅かったので、こちらに泣きついてしまいました。
レスをくれた皆様、ありがとうございました。

>>488
それは実際のカウントダウンなのか?
それとも秒数関係なく数字だけを表示してビープ音を鳴らすのかね
>>488
#include <windows.h>
#include <iostream>
#include <time.h>
using namespace std;
int main()
{
 int sec;
 cin >> sec;
 DWORD endtime = GetTickCount() + sec*1000;
 int tick;
 while((tick = endtime - GetTickCount()) > 0)
 {
  if(tick / 1000 < sec)
  {
   cout << sec << endl;
   sec--;
  }
  else
   Sleep(1);
 }
 Beep(4000, 1000);
 cout << "TimeOver" << endl;
 
}
この2つの行逆だわ。

Beep(4000, 1000);
cout << "TimeOver" << endl;
GetTickCount()はclock使ってもいいんだけど、
どうせBeepはAnsi C++にないからGetTickCount使っちゃいました
494478:03/05/08 15:20
たびたびすみません。

486さんのプログラムを使ってみたところ、
最後の行を一回多くカウントしているようなんですが、これはどういうことなのでしょうか?

せっかくなので、勉強のために、どうしてそうなるのかを教えていただけたら幸いです。
よろしくお願いします。
>>494
5
4
3
2
1
1
TimeOut
となるって事ですか?
>>494
意味がよく分からないのだけどこうしろって事?
#include <windows.h>
#include <string>
#include <iostream>
#include <time.h>
#include <math.h>
using namespace std;
int main()
{
 int sec;
 cin >> sec;
 DWORD endtime = GetTickCount() + sec--*1000;
 int tick;
 while((tick = endtime - GetTickCount()) > 0)
 {
  if(tick < sec * 1000)
   cout << sec-- << endl;
  else
   Sleep(1);
 }
 cout << "TimeOver" << endl;
 Beep(4000, 1000);
}
>>493
'\a' 使えよ
>>497
すっかり忘れてました。
499478:03/05/08 15:49
>495,496

ええと、「カウントダウン」のプログラムではなくって、
その前の「座標」のプログラム。のほうです。

>>486さんのプログラムを使うと、
in.txtにある座標のデータの、最後の行を2回カウントしてしまうんですよ。

たとえば、in.txtの中身が
3.846,5.478
5.154,5.433
6.516,3.937
だとすると、

3.8-3.9,5.4-5.5=1
5.1-5.2,5.4-5.5=1
6.5-6.6,3.9-4=2

という結果が出力されてしまうんです。
よろしくお願いします。
>>499
#include <string>
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
 int point[70][70] = {0};
 ifstream ifs("in.txt");
 while(ifs)
 {
  
  double x, y;
  ifs >> x;
  ifs.get();
  ifs >> y;
  if(ifs.fail())
continue;
  point[int(floor(x*10))][int(floor(y*10))]++;
 }
 
 for(int i=0;i<70;i++)
 {
  for(int j=0;j<70;j++)
  {
   if(point[i][j])
    cout << 0.1*i << "-" << 0.1*(i+1) << "," << 0.1*j << "-"
     << 0.1*(j+1) << "=" << point[i][j] << endl;
  }
 }
}
501478、499:03/05/08 16:27
>500

ありがとうございます。うまくいきました。
ソース見てもちんぷんかんぷんですが、
どんなことをしているのか、勉強してみます。
502デフォルトの名無しさん:03/05/08 17:20
S=x/1!+xの2乗/2!+xの3乗/3!+・・・・・・xのn乗/n!
を解くプログラムがわかりません。教えてください
俺、別スレで答えたんだが・・・。
504343:03/05/08 17:29
簡易ですがピタゴラス数を出すプログラムを書いてみました。
#include <stdio.h>
int main()
{
   int a,b,c;
   for(a=2; a<10000; a++)
   {
      for(b=2; b<10000; b++)
      {
         for(c=1; c<10000; c++)
         {
            if(a*a==(b*b)+(c*c))
            {
            printf("%d:%d:%d\n",a,b,c);
            }
         }
       }
   }
return 0;
}
まだ色々改善しなくちゃだめだけどもっともっと簡単にできたりできませんか?
>>504
別の変数を使ってやる方法があったとおもうよ。
u+vとu*vから求めるとかいうの。
506343:03/05/08 17:37
>>505
え・・・?どういうことでしょうか?
スマソですが、教えていただけませんか?
>>505
aを長辺に固定してるからb<a,c<a
またc<=bとしても一般性は失われない。

ってのでループの条件を修正
508デフォルトの名無しさん:03/05/08 17:46
>>503
いろんなパターンのプラグラムが知りたいんですけど....
ただのマクロリン展開じゃん
(u^2-v^2, 2u*v, u^2+v^2)
色んなパターンのプラグラムが知りたいなら検索くらいしろ
512デフォルトの名無しさん:03/05/08 18:46
日本ロジテム(みずほの融資先)の子会社せいも素(みずほの融資先)
で過労による自殺者が出た。
http://www.samos.co.jp
http://society.2ch.net/test/read.cgi/traf/1046749189/l50
http://tmp.2ch.net/test/read.cgi/company/1046775680/l50 
              ,.-、
           /.n l  /⌒ヽ
             | l l | ,' /7 ,'
        , '' ` ー ' '-' /
       /  、_,       `ヽ  
         l   , .-. 、`´    l
         ヽ  ヽ ̄フ     / また死んだ〜〜〜!
        丶、 ̄____,/
         /  ,. - 、  )
      (( ( n ([N],ハ_う
         ゝ)ノ  ̄   ヽ     
            /   _   l ))  
            〈__ノ´   `(_ノ
513名無し@沢村:03/05/08 20:20
おれは就職してから1ヶ月目に絶対に会社をやめないという誓約書を書かされたよ。
会社をやめたら膨大な違約金を取られてしまうんだよ。
また自宅にあるPCも会社に没収されてしまったよ。尾行をつけられたり、電話も盗聴されているんだよ!
会社はおれが他の会社に移ったり自宅でこっそりプログラムをつくったりすることをとても怖れているよ。
困ったもんだね…
514デフォルトの名無しさん:03/05/08 20:29
catでテキストの中身を出力し、パイプライン処理で
標準出力及びファイルに出力するプログラムをシステムコールを
使って作成したいのですが・・・例えば
cat foo.txt | ./a.out
というコマンドを入力とすると、foo.txtの中身が標準出力に出力され、
さらにファイルhoge.txtに格納されるという感じです。
コンパイルはできたのですが、実行するとどうしても
”/0=/dzy#”という変な文字しか出力されません。
どこがおかしいのでしょうか?よろしくお願いします。

#define SIZE 100

int main(void){
int n;
int fd;
char buf[SIZE];

creat("hoge.txt",0644);
fd = open("hoge.txt",1);

while(n = read(0, buf, sizeof buf) > 0){
write(1, buf, n);
write(fd, buf, n);
}
close(fd);
return 0;
}
>>514
n初期化しなさいよ。
> creat("hoge.txt",0644);
> fd = open("hoge.txt",1);
ここがおかしい
> int n;
size_t n;
というか
while(n = read(0,bufm sizeof(buf) > 0) なんてやったら
nには1か0かしか入らない気がするが?
それ以前になぜ低レベルIO?
520514:03/05/08 21:37
御回答ありがとうございます。
>>516の部分、fd = creat("test2.txt",0644);に直してみました。
他で指摘いただいた部分も直しましたがやはり全く同じ結果になります。
本当にわからないです・・・
whileの中もちゃんとなおしたかい?
バグだらけだな
環境を書きなさい。
シェルがパイプエラー出してないかい?
>>520

>while(n = read(0, buf, sizeof buf) > 0){

while((n = read(0, buf, sizeof buf)) > 0){
にしたか?
525デフォルトの名無しさん:03/05/08 21:47
whileの中の人も大変だな。
>>525
いや、コンパイラの中の人の方が。
まあな
素直に tee を使ったほうが百万倍も楽チンなのに。
529514:03/05/08 21:59
>>521-524
できました、どうもありがとうございます。

>>523
すみません、UNIXの場合どう環境を説明すれば良いか
分かりませんがとりあえずパイプエラーは出てなかったです。
530369:03/05/08 22:11
>>391
スマソ。気をつけます。
531デフォルトの名無しさん:03/05/09 05:58
ファイルの属性を表示させてUNIXの ls -l コマンドと同様の機能を
実現したいのですが、関数などの使い方がよく分からず
ls_l()の中身をどのようにすればよいか苦戦しております。
どうか指南いただけないでしょうか。以下は滅茶苦茶ですが途中まで書いたやつです。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>

int main(int argc, char *argv[]){

if( argc != 2 ){
fprintf(stderr,"Usage: %s filename \n",argv[0]);
exit(0);
}

ls_l(argv[1]);

}
532デフォルトの名無しさん:03/05/09 05:58
ls_l(char *path){

struct stat buf;
if(lstat(const path, &buf) == -1)
{
perror(path);
exit(1);
}

printf("%d",readlink(path));
printf("%s",getpwuid((int)path));
/*printf("%s",getgrgip(buf.st_gid));*/
/*printf("%d",buf.st_size);*/
printf("%s",ctime(&buf.st_ctime));
printf("%s\n",path);
}
>>531
manを引きながらBSDとかGNUのソースを見ればいいのでは?
っつーか、車輪を再開発する理由が判らん。
system("ls -l dir");
するとか、
popen("ls -l dir", "r");
すれば事足りるんでないの?

どうしてもってことならUnixならソースがあるんだから>>533の言うとおり。
535531:03/05/09 09:01
すみません、探してみます。
536デフォルトの名無しさん:03/05/09 18:32
VC6でやってる初心者です。
テンプレートとフレンド関数の問題なんですが、

friend void C2< T1 >::F3( C1< T1 > &);

が入るときの各クラスを求めよというものです。

Cx : クラス Tx : 型パラメータ Fx : 関数 で
xはクラスごとに異なります


#include <iostream.h>

template <typename T3>
class C3{
public:
void F3(C3< T3 > &a){;}
};

template <typename T2>
class C2 : public C3< T2 >{
};

template <typename T1>
class C1{
friend void C2< T1 >::F3(C1< T1 > &);
};

だと F3(C1< T1 > &) が F3(C3< T1 > &) じゃないとダメだし…
ホントわけ分からなくなりました。よろしくお願いします。
537デフォルトの名無しさん:03/05/09 18:38
どなたか助けてください。問題はコレです。。。
入力した文字列から指定した文字を検索するプログラムを作れ。
ただしポインタ変数を用いよ!

要は、こんな感じで実行結果が出ればいいようですが・・・。
文字列を入力してください:abcabc
検索文字を入力してください:b

文字列"abcabcに"b"は
2番目 5番目
にあります.

文字列を入力してください:abcde
検索文字を入力してください:z

そんな文字は入っていません

時間がなくて困ってます。お願いしますtt
>>531
man stat
>>537
#include <stdio.h>

int main()
{
char s[100];
char ch;
printf("文字列を入力してください:");
gets(s);
printf("検索文字を入力してください:");
ch = getchar();
540539:03/05/09 19:11
もう7時すぎてるよ。
途中だけど帰る。
#include <stdio.h>

char *mystrchr(char *p, int ch)
{
while (*p) {
if (*p == ch) {
return p;
}
++p;
}
return NULL;
}

int main()
{
char buf[256];
char ch;
char *p;
int offset;

printf("文字列を入力してください:");
scanf("%256s", buf);
printf("検索文字を入力してください:");
scanf(" %c", &ch);
if ((p = mystrchr(buf, ch)) != NULL) {
printf("文字列\"%s\"に\"%c\"は\n", buf, ch);
while (p != NULL) {
offset = p - buf + 1;
printf("%d番目 ", offset);
p = mystrchr(p + 1, ch);
}
printf("\nにあります.\n");
}
else {
printf("そんな文字は入っていません\n");
}
return 0;
}

キーボードの右を押すとカーソルが右に移動するにはどうしたらいいの?
教えてください。。
>>543
C FAQ読み直して来い
C FAQってなんでしょうか?
google に聞け
char=1byteとは限らない(へりくつ)なので、わざわざ別にチェック用の変数を用意しました。

#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE (1024)
#define TRUE (0)
#define FALSE (!TRUE)

int main(){
char buffer[BUFSIZE]; // for fgets&sscanf

char strSearchData[BUFSIZE];
char chrQuery;
char *pSearch;

int iCheck[BUFSIZE];
int iCount;
int i;

// init
for(i=0;i<BUFSIZE;i++){
iCheck[i]=FALSE;
}
iCount=0;

// input
printf("文字列を入力してください:");
fgets(buffer,BUFSIZE,stdin);
sscanf(buffer,"%s",strSearchData);

printf("検索文字を入力してください:");
fgets(buffer,BUFSIZE,stdin);
sscanf(buffer,"%c",&chrQuery);

// search
i=0;
for(pSearch=(char *)strSearchData;*pSearch!='\0';pSearch++,i++){
if(*pSearch == chrQuery){
iCheck[i]=TRUE;
iCount++;
}
}

// result
if(iCount==0){
printf("そんな文字は入っていません\n");
}else{
printf("文字列\"%s\"に'%c'は\n",strSearchData,chrQuery);
for(i=0;i<BUFSIZE;i++){
if(iCheck[i]==TRUE){
printf("%d番目",i+1);
}
}
printf("\n");
printf("にあります");
}
}

>>542の方が綺麗だけどさ・・・
っていうか、この回答だとポインタを(無理に?)使う意味がわからないね…… スマソ
#include <stdio.h>
int main() {
char s[100];
char ch, *t;
printf("文字列を入力してください:");
gets(s);
printf("検索文字を入力してください:");
ch = getchar();
for (t = s; *t && *t != ch; t++) ;
if (!*t) {printf("そんな文字は入っていません\n"); return 0;}
printf("文字列\"%s\"に\"%c\"は\n", s, ch);
for (; *t; *t++)
if (*t == ch) printf("%d番目 ", t-s+1);
printf("\nにあります.\n");
return 0;
}
惜しい。
tを巻き戻せ。
charは1バイトです。むしろ、sizeof(char)を1バイトと呼ぶのです。
>>553
1バイト=8ビットとは限らない、って言いたかったんだろう
きっと
ちがうなあ。wchat_tを言いたかったのか。
>>552
tを巻き戻すってどこ?
>>547
配列に入れる代わりにフラグを使ってみました

#include <stdio.h>
#include <string.h>

int main()
{
 char InputString[512], SearchString[512], *Position;
 int Matched;

 fprintf(stderr, "文字列を入力してください:"); gets(InputString);
 fprintf(stderr, "検索文字を入力してください:"); gets(SearchString);
 Matched = 0;
 for(Position = InputString; (Position = strstr(Position, SearchString)) != NULL; Position++){
  if(!Matched){
   printf("文字列\"%s\"に\"%s\"は", InputString, SearchString);
   Matched = 1;
  }
  printf(" %d", Position - InputString + 1);
 }
 if(Matched){
  printf(" 番目にあります\n");
 } else {
  printf("そんな文字は入っていません\n");
 }
 return 0;
}
558デフォルトの名無しさん:03/05/09 21:33
よろしくおながいします。(言語はCで)

3次元空間上の4点
A (10,135,14), B (73,-16,-22), C (27,-21,96), D (-50,-32,-43),
で構成される3角錐、及びその3角錐内の点 P を考える。
今、点 P が始点 O (0,0,0)にあり、1秒毎に
ベクトル V(1,2,3) 分だけ移動し続けるとする。
但し、もし P が3角錐の面と交差した時には、
P はその面に対して垂直に反射するように移動方向を
変えるものとした場合、1年(365日)後の点 P の
座標を求めよ。
なかなか面白いけど、これは数学的にエレガントに解くの?
それともシミュレーションでゴリゴリやっていいの?
>>537
#include <string>
#include <iostream>
using namespace std;
int main()
{
 string str, fstr;
 char c, *pc = &c;
 size_t pos;
 cout << "文字列を入力して下さい" << endl;
 cin >> str;
 cout << "検索文字を入力して下さい" << endl;
 cin >> *pc;
 fstr = *pc;
 if((pos = str.find(fstr)) != string::npos)
 {
  cout << "文字列\"" << str << "\"に\"" << *pc << "\"は" << endl;
  do
  {
   cout << pos + 1 << "番目 ";
  } while((pos = str.find(fstr, pos+1)) != string::npos);
  cout << "\nにあります" << endl;
 }
 else
  cout << "そんな文字は入っていません" << endl;
}
561560:03/05/09 22:46
1個以上の整数コマンド行から入力したとき、それらの和を標準出力するプログラムを作成しなさい。
ヒント関数atoiを用いると容易。

お願いします
562r:03/05/09 22:52
>>561
これを参考にして。

#include <cstdlib>
#include <iostream>
int main( int argc, char* argv[] ) {
  int sum = 0;
    while( int i = 1; i < argc; i++ ) {
      sum += std::atoi( argv[i] );
    }
    std::cout << sum;
  }
}
>>561
#include <cstdlib>
#include <iostream>
int main(int argc, char** argv)
{
 int value=0;
 for(int i=1; i<argc; i++)
  value += std::atoi(argv[i]);
 std::cout << value << std::endl;
 
 return 0;
}
先を越されたぜ
565草鍋春樹:03/05/09 23:22
>>564
どんまい
>>559
解ける方法で解いてください。
567561:03/05/10 10:08
>>562>>563
ありがとうございました
568デフォルトの名無しさん:03/05/10 14:08
C言語でよろしくおねがいします。

まず50個のデータ(数字)を入力し、昇順に並べ替える。
そのなかに好きな数字を入れて、その数字がどこにあるのかを探し、
その進行状況を表示するプログラムを作成せよ。
(例えば、すべてのデータが50個であり、二分探索で25番目を検索している時は、25と表示。)
>>568
めんどいからバカソートで良いじゃん。
>>569
ソートはqsortでいいだろ。
サーチはbsearch使うわけにはゆかないけど。
>>570
じゃあ線形探索だ。for一個で楽ちん。
>>568
Hash 表作って一発サーチすれば、進行状況の表示がサボれるかもしれない。
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
inline int icmp(const int *x, const int *y){return *x - *y;}
int ibsearch(const int key, const int *base0, size_t nmemb) {
int i, base = 0; size_t lim;
for (lim = nmemb; lim != 0; lim /= 2) {
i = base + lim/2; printf("[%d]", i);
if (key == base0[i]) return i; if (key > base0[i]) { base = i+1; lim--; } }
return -1; }
int main(int argc, char **argv) {
int n, i, *base; char buf[BUFSIZ];
n = argc-1;
if (0 == n){ fprintf(stderr, "usage: %s numbers...\n", argv[0]); return 1; }
base = (int*)malloc(sizeof(int)*n);
for (i = 0; i < n; ++i) base[i] = atoi(argv[i+1]);
qsort(base, n, sizeof(int), (int(*)(const void*, const void*))icmp);
while (fprintf(stderr, "input target: "), fgets(buf,BUFSIZ,stdin))
puts(ibsearch(atoi(buf), base, n) < 0 ? " not found" : " found");
return 0; }
574デフォルトの名無しさん:03/05/10 16:22
Cだと言われているのに、inline を使い、
あまつさえ、それを qsort の引数にしている >>573 に小一時間(ry
>>572
ハッシュがかち合ったとき、どのみち表示しないとダメでしょ
>>575
オーバーフロー領域の検索なんて所詮数回でしょ ?
(そうでないときは、ハッシュの設計ミスだし。)

表示なんかしても一瞬だからいらんと思うけど。
>>576はネタなのか真性なのか理解に苦しむ
578558:03/05/10 18:06
>>570
比較関数内に状況を表示させる機能をつければ bsearch を使っても良いと思われ。
(但し、それがC言語の規約上、動作が「保証」されているかどうかは怪しいが・・・)

そんな事より、誰か >>558 の解答、よろしくおながいします。
Cだと考える気にならん
>>576は畑を耕すのに戦車を使おうと考えるようなやつかも
>>579
じゃあ、何だったらいいでしか?
C++!
c--
D
while program
>>558
三角錐の面と交差するか調べる関数と
垂直に反射する関数を書けばいいのだよ。
俺は数学が分からないから書けないが。

緯度と経度で表したり、外積を使えば簡単に書けるかもしれん。
587デフォルトの名無しさん:03/05/10 19:40
^Mの文字列を削除するにはどのようにしたらよいのでしょうか?
588デフォルトの名無しさん:03/05/10 19:49
Cなんですが、
順次探索のsearch関数、insert関数、delete関数を配列ではなくリストで
プログラムを書かないといけないのですが、
どのようなプログラムになるか教えてくださいm(_ _)m
589558:03/05/10 19:52
>>582
とリあえず C++ でもいいです。

>>586
要するにレイトレするのと同じなのは分かっていますが、
もっと単純&エレガントな方法があればなお良いのです。
Cを使って2chの1レス内にコピペできるくらいのが希望です。
結構簡単だと思うよ。引っ掛け問題みたいだけど。
> P はその面に対して垂直に反射するように
              ^^^^^^^^

あるデータファイルをヒストグラムが書けるデータファイルに
したいのですが。データの数は決まってないです。
よろしくお願いします。
>>578
比較関数に渡される要素ってどっちが探索中の要素で、どっちが比較対照要素になるかって決まってるのか ?
俺も一瞬考えたけど、そこら辺がわからんかった。

>>577, >>580
畑って言ってるけど、進行状況を表示するぐらいの規模だぜ。
まあ、>>568 はなんかの宿題だろうから、>>572 は当然ネタだけど、実際のプログラムなら Hash は検討すべきだと思うよ。

>>587
もうちょっとなんか書けよ。
>>588
とりあえず、これで必要最小限の実装になっていると思うが、どうよ。

typedef struct List_ {struct List_ *n;void *e;} List;
typedef int ListCmp(void *a,void *b);

List *Search(List *h,void *e,ListCmp p)
{while(h!=NULL&&p(h->e,e))h=h->n;return h;}
List *Insert(List *h,void *e)
{List *l=(List *)malloc(sizeof(List));l->n=h;l->e=e;return l;}
List *Delete(List *h,List *d)
{if(h==d)return h->n;while(h)if(h->n==d){h->n=d->n;break;}return h;}
>>574
C99ならinlineがサポートされているよ
595558:03/05/10 20:35
>>590

垂直方向に方向を変えるのではありません。
あくまでも「反射」です。
よろしくお願いします。
>>594
なら、qsort に inline 関数を渡したとき、
その関数はインライン展開されるのか?
>>592
>比較関数に渡される要素ってどっちが探索中の要素で、どっちが比較対照要素になるかって決まってるのか ?
進行状況を表示するだけならば、それらの情報は全く要らないと思うが。
598デフォルトの名無しさん:03/05/10 20:51
おながいしまる。

これを実行すると 合計は[2550] と表示される。
4行目の宣言を消してforヘッダの中でnumを宣言するようにすると
合計は[2] になってしまう。理由を述べよ。

#include <stdio.h>
int main()
{
int sum;
int num; /* 4行目 */
for (/*int*/ num = 2, sum = 0; num <= 100; num += 2)
sum += num;
printf("合計は[%d]\n", sum);
return 0;
}
>>598
うちでは、0 になりましたが。
0が定義されるかどうかの違い
>>598
正確にいうと出力される数字は不定

for (int num = 2, sum = 0; num <= 100; num += 2)

こうした場合sumは2回目の宣言となる
1個目のsumは隠されるためアクセスできない

1個目のsumは値が代入されないので値は不定
>>596
qsortの中にってこと?されるはずがない。
ちなみに私は>>573じゃないよ。
>>598
糞みたいな宿題だな。
604593:03/05/10 21:06
うわ、よく考えたら Delete の引数の双方ともに NULL が
渡されたら(まぁ、普通起こらないとは思うが)、ぬるぽが出ちゃうよ!
やっぱり本能に任せたままのコーディングはいかんな。

悪い、>>588 よ、そこら辺はてきとーに直しておいてくれ。
605デフォルトの名無しさん:03/05/10 21:08
順次検索ってシーケンシャルサーチ? つまりは線形探索?
糞みたいな宿題に答えていただきありがとうございます。。。m(_ _)m
3行目のint sumとforヘッダのsumは別物なんでつね。
たまたま偶然2だったと、フみたいなもんでつか。
ちなみ3行目を int sum = 55; にしたら
合計は[55] になりますた。
607動画直リン:03/05/10 21:13
>>604
ガッ
609デフォルトの名無しさん:03/05/10 21:18
ファイル(ファイル名はfile.txt)の中に数字があれば「数字がありました。」と表示し、
なければ「数字がありませんでした。」と表示するプログラムをつくれ。

C言語です。よろしくお願いします。
inlineはコンパイラに対するヒントでしかないから
関数のポインタ渡しと化する場合は当然展開されない版が
リンクされる。
>>609
isdigit
>>593
Delete() で、ルートがさす要素以外の要素を指定したら無限ループ。
Insert() で、malloc() する割には、Delete() で free() しないと言う変なインターフェース。

>>604 以前に、よくこんなものネットに晒せたもんだな。
strchr
>>612
そこまで言わなくてもいいじゃん。
だからいつも一言多いと言われるんだよ。
>612は「インターフェイス」の使い方を勉強しる。

そんな文章よくネットに晒せたもんだな。
616593:03/05/10 21:47
>>612
>Delete() で、ルートがさす要素以外の要素を指定したら無限ループ。
お、ほんとだ、ありがと。で修正。
{if(h==d)return h->n;while(h)if(h->n==d){h->n=d->n;break;h=h->n;}return h;}

>Insert() で、malloc() する割には、Delete() で free() しないと言う変なインターフェース。
ここは趣味の問題。
617593:03/05/10 21:49
>>616
うわ、修正にもなっていないよ(w
{if(h==d)return h->n;while(h){if(h->n==d){h->n=d->n;break;}h=h->n;}return h;}
どこでfreeするの?
>>615
ぷぷっ、釣りですか ?
>>618
利用者がやるんだと思う。
ルートポインタの更新も利用者任せみたいだから、正直ちょっとどうかと思う。
621デフォルトの名無しさん:03/05/10 22:07
http://www.zdnet.co.jp/help/tips/linux/l0034.html
にある処理をC言語でするとどうやればいいのでしょうか?
>>621
system("perl -i.bak -npe 's/\r\n/\n/' hogehoge.txt");
623593:03/05/10 22:09
>>618
プログラムが終了するまで free しないんでつ。
InsertDeleteを繰り返すとどんどん使用メモリが増えていくって事ですか?
625デフォルトの名無しさん:03/05/10 22:15
>>621
read(s,buf,sizeof(buf));
のbufを変換する場合は?
>>601 そうなんですか?
for(1;2;3) {4} なら 1→(2→4→3→2→4→3)・・・
と言うのは分かるのですが。初期値代入は複数書くのは処理系依存なのですか?
パット見102*25==2550と思ったのでよく宿題の意味がわからなかったのですが。
>>622
×: system("perl -i.bak -npe 's/\r\n/\n/' hogehoge.txt");
○: system("perl -i.bak -npe 's/\\r\\n/\\n/' hogehoge.txt");
>>609 てきとうですが。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
FILE*fp;char s[1024];int i,l,ok;
if((fp=fopen("file.txt","rb+"))==NULL){puts("ファイルオープン失敗");exit(1);}
fread(s,sizeof(s),1,fp);fclose(fp);
for(i=0,l=strlen(s),ok=0;i<l;i++){if(isdigit((int)s[i])){ok=1;break;}}
if(ok)puts("数字あり");else puts("数字なし");
return 0;
}
629629:03/05/10 22:48
日曜日を0として、n日目の曜日名を返す関数char *DayName(int n)を作成しなさい。ただし、0≦n≦6とし、関数DayName(n)内では以下のポインタ配列宣言を行うこと。
Static char *name[7] = {“Sunday”,”Monday,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”};n

お願いします
>390
の考え方がわかりません。どなたかおしえてください
631593:03/05/10 22:50
>>624
なら、 free すれば使用メモリが減るという保証でもあるんでしか?
また、(実は)下の件にも関わってくるでし。

>>620
>ルートポインタの更新も利用者任せみたいだから、正直ちょっとどうかと思う。
実際に何度かリストをいじったことがあればすぐに気づくと思うが、
リストという香具師は、必ず先頭から辿りたい時ばかりとは限らない
(言語処理系の変数のスコープの実装などが良い例)。
ならば、「リストを管理する構造体」などという殻で全体を囲わずに
実際に扱う対象はリストの先頭のポインタのみで、
後の細かな管理は使用する側にまかせるのが吉、という事もある。
まあ、これも趣味の問題だが・・・
>>628
普通EOFまで一文字ずつ読み込んで処理しないか?
>>629
#define Static static

char *DayName(int n)
{
Static char *name[7] = {“Sunday”,”Monday,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”};
if(n<0||n>6) return NULL;
return name[n];
}
>>626
こう書き換えるとわかるかな?

int sum;
for (int sum = 0, num = 2; num <= 100; num += 2)


int sumが2回宣言されてるよね
電源を切るとfreeされます。
636633:03/05/10 22:57
コピペしたから気づかなかったが、”と全角じゃだめじゃん。
>>629 そのままだと思うのですが。
#include <stdio.h>
char*DayName(int n)
{
static char*name[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
return name[n%7];
}
int main(void)
{
printf("%s\n",DayName(14));
return 0;
}
638626:03/05/10 23:01
>>634 初期化を複数行うことではなくて途中宣言の事の方ですか。分かりました。ありがとうございました。
>>633 StaticのSが大文字であるのが意地悪問題ではないと思うけど。
640628:03/05/10 23:06
>>632 ファイル操作は殆ど使ったことが無かったので本当にてきとうでした。
>>631
> なら、 free すれば使用メモリが減るという保証でもあるんでしか?

毎回こう言うこと言う奴がでてくるな...。
まあ下の件も含めて、趣味の範疇なんだろうからどうでもいいけど、正直こう言う奴とは組みたくないな。
642593:03/05/11 00:19
>>641
>まあ下の件も含めて、趣味の範疇なんだろうからどうでもいいけど、正直こう言う奴とは組みたくないな。
世の中には奇妙な事や変な事を考えている奴は意外と多いもの。
あなたには、たまには普段と違う世界・パラダイムを覗いてみる事を
お勧めするでつ。
InsertDeleteを繰り返すとどんどん使用メモリが増えていくって事ですか?
と聞いてるんだよ。
質問を質問で返すなよ。
644643:03/05/11 04:36
とっとと答えねーかーーっ!!
この糞度もがぁーーーーっ!!!!!
こんな時間に・・・しかもsageで・・・・・
まあ644はsageてない時点で偽者なわけだが。
class CTest* p_tst;
というクラスがあって、これを削除したい場合は
delete p_sts;
ですむのだけど、これをたとえば、自殺したい場合はどうすれば
いいのですか?

たとえば、CTestのメンバ関数内で、自殺したい場合です。
delete this; では、まずいですよね?
>>647
自殺なんてできない。
>>648
えと、ではいつもどうしてます?
ちなみに自分は、KillRequest() というメンバ関数を設置して、
自殺したい場合はこのメンバ関数を呼び出してます。
この関数内では、boolフラグをたてて、
あとで、別の場所でこのboolフラグを監視し、もしたっていれば
そこで delete かけることで実装してます。

が、これは非常にコーディングに注意力が必要で、
油断してると、すぐにdelete漏れしてしまうのです。

どうしたものだか・・・
>>649
それは生成元で管理しきれないから
GCっぽいことしてるってこと?
そのフラグ監視してるのが自前GC?
>>650

んー、そうなのかなー、自前GCというのだろうか?
自分の中ではグルーピングと呼んでいて、
一応、それ専用の監視クラスが存在してはいるんだけど・・・

>>それは生成元で管理しきれないから
そのとおりですー
小規模なら、注意力喚起して、生成元で管理しきれるのだけど
最新のPCでビルドに3分以上かかるような規模になると
もう、生成元では管理できなくて・・・
本当に管理できないなら、その自前GCで良いのではないかと。
ただ、自信が無かったりするなら↓とかチェックしてみれ。
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
(boolフラグ立て忘れたらどうしよう・・・とか)
よくあるスマートポインタじゃいかんのかな?
654593:03/05/11 07:41
おはよございます。

>>643-644
夜遅くまでご苦労さん(w
いちお解答しますけど、当然ふえていきます。
ただし、これが問題となるような状況が発生した時に
それを解決するための方法は、>643タン は真っ先に free を
思いつくのかも知れませんが、私ならまず、

1.(OS側の管理情報を減らす為)List 構造体用のメモリ管理を
アプリケーション内で行う
2.GCを実装する

という(比較的効果が高いと思われる)対策を取ったあと、
最後のおまけとして free をくっつけまつ。

今回の件では、ここまでやる必要性は無いと判断したのですが・・・
>>654
> 1.(OS側の管理情報を減らす為)List 構造体用のメモリ管理を
> アプリケーション内で行う

よくこう言う奴がいるけど、大体 malloc()/free() ライブラリよりヘボイもの書いて自己満足してる奴が多い。
大体は、まともに free() するプログラムが書けない奴だと思う。

> 2.GCを実装する

だったら初めから、C/C++ なんか使わん方がいいと思うけどね。

別に、>>593 がそうだと言ってるわけじゃないけどさ。
そんなにfreeが嫌いならBoehm GC使えよアフォども。
>>654
> 今回の件では、ここまでやる必要性は無いと判断したのですが・・・
じゃぁ真っ先に思いつく最後のおまけのfreeくらいつけとくもんだ。
658デフォルトの名無しさん:03/05/11 11:04
このスレのレベルが循環参照を起こしまくるようなコードを書くほど
高いとは思えん。shared_ptrで十分。
ちゅーか、たんに書き忘れただけだろうと思う
604のケアレスミスを見てると
>>647
仮にdelete thisで自殺ができたとすると、
p_sts(p_tst?)が参照切れを起こす。
自殺時にp_stsを書き換えるようにすると、外部との結合度が高くなりよろしくない。
自殺したこを示すフラグを用意する手もあるが、わざわざ自殺しなくても、
そのフラグをチェックしたときにdeleteすればよい。

外部から参照されていない場合は、そもそもメンバ関数が呼ばれないはず…
661あふぉ:03/05/11 11:21
xのn乗を計算するプログラムを教えて下さい。
2進数表示を利用する奴です。
662593:03/05/11 11:33
>>657
あのー、しっかりと>>631
>また、(実は)下の件にも関わってくるでし。
とコメントつけといたんですけど・・・

Delete した構造体が "必ず" free するべき対象となるとは
限らないことは結構あるものです。

>>659
あなた、ケアレスミスの "亡霊" に取り付かれていませんか?
なにか辛い事でもあったんでしか?
// 2進数表示を利用するって何だろ
double power(double x, double n)
{
FILE *fp;
char buf[100];
sprintf(buf, "awk 'BEGIN{print %g^%g}'", x, n);
fp = popen(buf, "r");
fgets(buf, sizeof(buf), fp);
pclose(fp);
return atod(buf);
}
664593:03/05/11 11:39
>>659
そんな点より、free の前の malloc でメモリが確保できなかったときの
対応がぬけていると責める人が現れなくなった、というのは
時代の流れを感じるでつ。

隔世の感がありまつな・・・
宿題でエラー処理しろと言われてないのにやる奴は馬鹿
>>664
ここは宿題スレ。
> 後の細かな管理は使用する側にまかせるのが吉
こういうスタンスに立つなら、mallocするのがおかしいような気がする。
すげー饒舌になったな(w
今はfree()の話をしてるんで、malloc()の件は後で
669デフォルトの名無しさん:03/05/11 12:18
ケアレスミスの "亡霊"って何?
670デフォルトの名無しさん:03/05/11 12:33
Cなんですが、

#include<stdio.h>
#include<stdlib.h>

#include"list_appli_header.h"
#include"liststructure.h"

int init(void)
{
head=NULL;
return 1;
}
671デフォルトの名無しさん:03/05/11 12:34
●上のプログラムの続き
nodetype* search(keyType a_key) {
........
}

int insert(dataType *dp) {
........
}

int delete(keyType a_key) {
........
}

void printAllData(void) {
nodeType *p=head;
  while(p!=NULL){
  printkey(p);
  printf(",");
  p=p->next;
  }
 printf("\n");
}

このプログラムの........の部分の順次探索の
search関数、insert関数、 delete関数をリストで書かないといけないのですが、
どのようなプログラムになるのか教えて下さい。
#include"list_appli_header.h"
#include"liststructure.h"
の中身は自分で想像しろってことかな?
list_appli_header.hとliststructure.hの中身もさらせよ。
>>670
>>588 と同じ課題?
593に聞け
676デフォルトの名無しさん:03/05/11 15:01
すいませんでした。
list_appli_header.hとliststructure.hの中身は、

●list_appli_header.h
typedef int keyType ;

typedef struct {
keyType key ;
} dataType ;

typedef struct node {
dataType data ;
struct node *next ;
} nodeType ;

int less(keyType, keyType) ;
int equal(keyType, keyType) ;
keyType key(dataType *p) ;
keyType key2(nodeType *p) ;

void printKey(nodeType *p);
677デフォルトの名無しさん:03/05/11 15:02
●liststructure.h
static nodeType *head ;

int init(void) ;
int insert(dataType *p) ;
nodeType* search(keyType) ;
int delete(keyType) ;
void printAllData(void) ;

です。
宜しくお願いします。
>>662
> Delete した構造体が "必ず" free するべき対象となるとは
> 限らないことは結構あるものです。

はぁ ?
だったら、なぜ Insert する構造体は必ず malloc() するんだ ?
free してない構造体は何に使うんだ ?

設計ミスの言い訳は見苦しいぞ。

(InsertWithoutMalloc() を作るとか言い出しそうだな...。(藁 )
次のプログラムをwhileを使い、かつ、ファイル名を標準入力、
データ数がいくつでも可能というように書き換えて

#include<iostream.h>
#include<fstream.h>
#include<map.h>

int main()
{
std::ifstream fin("in.txt");
std::map <int,int> intmap;
for(int i=0;i<5000;i++)
{
int val;
fin >> val;
intmap[val]++;
}
std::ofstream fout("out.txt");
for(std::map<int, int>::iterator it=intmap.begin();it!=intmap.end(); ++it)
{
fout << (*it).first << " " << (*it).second << std::endl;
}
return 0;
}
ファイル名を標準入力、
> #include<iostream.h>
> #include<fstream.h>
> #include<map.h>


    ぐはっ

682初心者の名無しさん:03/05/11 15:52
> Delete した構造体が "必ず" free するべき対象となるとは
> 限らないことは結構あるものです。

全然思いつかないんだけど例えばどういうとき?
>>679>>390に凄く頭悪そうなincludeを付け足したものですか?
つまり>>386==>>679ですか?
>>670
nodeType* search(keyType a_key) {
  nodeType* p = head;
  while (p != NULL) {
    if (p->data.key == a_key) break;
    p = p->next;
  }
  return p;
}

int insert(dataType *dp) {
  nodeType* node;
  if ((node = (nodeType*)malloc(sizeof(nodeType))) == NULL) return 0;
  node->data = *dp;
  node->next = NULL;
  if (head == NULL) {
    head = node;
  } else {
    nodeType* p = head;
    while (p->next != NULL) p = p->next;
    p->next = node;
  }
  return 1;
}
>>679
#include <iostream>
#include <fstream>
#include <map>
#include <string>
int main()
{
 std::string filename;
 std::map <int,int> intmap;
 while(1)
 {
  std::cin >> filename;
  if(std::cin.fail())
   break;
  std::ifstream fin(filename.c_str());
  std::map<int, int> intmap;
  for(;;)
  {
   int val;
   fin >> val;
   if(fin.fail())
    break;
   intmap[val]++;
  }
 }
 std::ofstream fout("out.txt");
 for(std::map<int, int>::iterator it=intmap.begin(); it!=intmap.end(); ++it)
 {
  fout << (*it).first << " " << (*it).second << std::endl;
 }
 return 0;
}
687685:03/05/11 16:32
int delete(keyType a_key) {
  nodeType* node;
  if (head->data.key == a_key) {
    node = head;
    head = node->next;
    free(node);
    return 1;
  } else {
    nodeType* p = head;
    while (p->next != NULL) {
      if (p->next->data.key == a_key) {
        node = p->next;
        p->next = node->next;
        free(node);
        return 1;
      }
      p = p->next;
    }
  }
  return 0;
}
688686:03/05/11 16:35
>>679へ >>686は1行間違ってるのでこっちで
#include <iostream>
#include <fstream>
#include <map>
#include <string>
int main()
{
 std::string filename;
 std::map <int,int> intmap;
 while(1)
 {
  std::cin >> filename;
  if(std::cin.fail())
   break;
  std::ifstream fin(filename.c_str());
  for(;;)
  {
   int val;
   fin >> val;
   if(fin.fail())
    break;
   intmap[val]++;
  }
 }
 std::ofstream fout("out.txt");
 for(std::map<int, int>::iterator it=intmap.begin(); it!=intmap.end(); ++it)
 {
  fout << (*it).first << " " << (*it).second << std::endl;
 }
 return 0;
}
無限ループ+breakキモイ

 std::map<int,int> intmap;
 std::string filename;
 while(std::cin >> filename)
 {
  std::ifstream fin(filename.c_str());
  int val;
  while(fin >> val)
  {
   intmap[val]++;
  }
 }
>>686
ありがとうございます。

クラスとか使わないでできないですかね?
>>690
出来るけどやる気無いから他の人にやってもらって
>>690
> クラスとか使わないでできないですかね?
意味わからん。
>>692
頭悪いな
>>693
意味わかったの?おしえて。
「クラスとか」ってやつを具体的にしてもらえれば分かるような気はするんだ。
>>694
ifstreamはbasic_ifstreamのtypedefでbasic_ifstreamはクラスだよ。分かる?
ofstreamはbasic_ofstreamのtypedefでbasic_ofstreamはクラスだよ。分かる?
さすが宿題スレだな。精神年齢が低い香具師ばかり。
>>695
それはわかります。
streamクラスを使わないとして、FILE*は使っていいってことですかね?

stringもmapもクラスです。
stringのほうはchar*でいけそうだけど、
mapのほうは構造体を使わないとムリなんじゃないですか?

あ、もしかして、
int intmap[INT_MAX];ですか?
さすが宿題スレだな。精神年齢が低い香具師ばかり。
>>697
int* mapindex;
int* mapvalue;
ええ、>>698を筆頭にね。
mapのほうは構造体を使わないとムリなんじゃないですか?
mapのほうは構造体を使わないとムリなんじゃないですか?
mapのほうは構造体を使わないとムリなんじゃないですか?

int intmap[INT_MAX];int intmap[INT_MAX];int intmap[INT_MAX];
702697:03/05/11 17:26
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎
やはり >>1 が宿題やらないのがムカツク
>679用に
下のプログラムを書いたんだけどエラーでちゃったどう書き直せばいいの?
main( int argc, char *argv[])
{
int dat[1];
int i, ii;
int time;
int G=[200000];
if(argc!=2)
{
printf("<execute file> <input filename>\n");
exit(1);
}
if( argc < 2)
{
cerr << "You must specify a filename" << endl;
exit(1);
}
ifstream fin(argv[1]);
while(1)
{
fin >> dat[0];
if(!fin.eof())
break;
for(time=0; time < 100000;time++)
{
if(dat[0]==time)
G[time]++;
}
cout << dat[0] << setw(4) << G[time] << endl;
}
}
>>704
ifstreamは使っちゃ駄目なんじゃないの?
ifstream fin(argv[1]);
関係ないがdat[1]って何?
int G=[200000];
ワラタ
>>707
dat[1]と書けばdat=3;などとやってしまったときにエラーにしてくれる。
711697:03/05/11 19:19
みなさんにヒントをいただいたおかげで、できました。
#include <cstdio>
#include <cstdlib>
#include <limits>
#include <algorithm>
int main()
{
 using namespace std;
 size_t mapsize = 0;
 int* mapindex = 0;
 int* mapvalue = 0;
 size_t filenamecapacity = 1;
 char* filename = static_cast< char* >( malloc( filenamecapacity ) );
 if( filename == 0 ) abort();
712697:03/05/11 19:19
 for(;;)
 {
  size_t filenamesize = 0;
  for(;;)
  {
   int c = getchar();
   if( c == EOF )
    goto END_OF_INPUT;
   else if( c == ' ' || c == '\n' || c == '\t' )
    c = '\0';
   if( filenamecapacity <= filenamesize )
   {
    size_t n = filenamecapacity * 2;
    filename = static_cast< char* >( realloc( filename , n ) );
    if( filename == 0 ) abort();
    filenamecapacity = n;
   }
   filename[ filenamesize++ ] = c;
   if( c == '\0' ) break;
  }
713697:03/05/11 19:20
  FILE* const in = fopen( filename , "r" );
  if( in != 0 )
  {
   size_t const bufsize = std::numeric_limits< int >::digits10 + 1;
   char buf[ bufsize ];
   for(;;)
   {
    size_t read = 0;
    for(;;)
    {
     int c = fgetc( in );
     if( c == EOF )
      goto END_OF_FILE;
     else if( c == ' ' || c == '\n' || c == '\t' )
      c = '\0';
     if( read < bufsize )
     {
      buf[ read ] = ( read < bufsize - 1 ) ? c : '\0';
      ++read;
     }
     if( c == '\0' ) break;
    }
    if( read == 0 || bufsize < read ) goto END_OF_FILE;
714697:03/05/11 19:21
    char* endptr;
    long val = strtol( buf , &endptr , 0 );
    if( *endptr != '\0'
     || val < std::numeric_limits< int >::min()
     || std::numeric_limits< int >::max() < val )
     goto END_OF_FILE;
    size_t pos = distance( mapindex , lower_bound( mapindex , mapindex + mapsize , val ) );
    if( pos == mapsize || mapindex[pos] != val )
    {
     size_t n = mapsize + 1;
     mapindex = static_cast< int* >( realloc( mapindex , sizeof( int ) * n ) );
     mapvalue = static_cast< int* >( realloc( mapvalue , sizeof( int ) * n ) );
     if( mapindex == 0 || mapvalue == 0 ) abort();
     copy_backward( mapindex + pos , mapindex + mapsize , mapindex + n );
     mapindex[ pos ] = val;
     copy_backward( mapvalue + pos , mapvalue + mapsize , mapvalue + n );
     mapvalue[ pos ] = 0;
     mapsize = n;
    }
    ++mapvalue[ pos ];
   }
  END_OF_FILE:
   fclose( in );
  }
715697:03/05/11 19:22
 }
END_OF_INPUT:
 free( filename );
 FILE* const out = fopen( "out.txt" , "w" );
 if( out != 0 )
 {
  for( size_t i = 0 ; i < mapsize ; ++i )
   fprintf( out , "%d %d\n" , mapindex[ i ] , mapvalue[ i ] );
  fclose( out );
 }
 free( mapindex );
 free( mapvalue );
}

はぁ。C++標準ライブラリは偉大だなぁ。
p=realloc(p,n);

こういう書き方をしちゃいけないと何度言ったら(ry
宿題だから許されるんだろうけど
>704を書き直せ!!!!
FILE* const out = fopen( "out.txt" , "w" );
FILE使ってるけどいいの?
システムコール使えよ。
>>718
はぁ?死ね。
721697:03/05/11 20:12
やっぱりFILEもダメだったのかよ。先に言ってくれよな。
numeric_limitsとかクラスだろ。
723697:03/05/11 20:49
あぁ・・・
>>685
どうもありがとうございました。
725デフォルトの名無しさん:03/05/11 22:32
#include <stdio.h>
#define N 128
void defvec(double [N]);
int N;
double A[N];
void defvec(double A[N]){
void main(){
double k,d;
double A[N];
double B[N];
int i;
defvec(A);
defvec(B);
k=0;
for(i=0;i<N;i++)
k=k+(A[i]-B[i])*(A[i]-B[i])
d=sqrt(k);
double distance(double A(N),double B(N));
return (d);
}
これではしらないのですが、どこがおかしいのでしょうか?
おながいします。
>>725
はぁ ?

> #define N 128
> int N;

そもそもコンパイルできるとも思えないんだが。
727725:03/05/11 22:42
>>726
そうですね・・・すいません。

>double k,d;
ってのは合ってるんですかね?
728__:03/05/11 22:43
>>725

パッと見あやしいのは
726が言ってた場所と
double distance(double A(N),double B(N)); ←ここ

>>727
なんでint N;がエラーになるかわかっている?
731725:03/05/11 22:48
>>730
分からないです・・・教えてください。
void defvec(double A[N]){

何も問題ないけど、普通はdouble A[]と書くかdouble *Aと書く。
>>725
何する(したい)プログラム?
>>731
#define N 128ってやっているでしょ。こうすると以降のNは(undefされるまで)全て128に置き換えられるの。
つまりint 128;となるわけ。変数名(識別子)の先頭は英字かアンダーバーしか使えないから。
735725:03/05/11 22:55
>>733
1:実数要素N個からなるベクトルAを定義する関数defvecを作る。
2:次にdefvec関数を2回呼び出しA,Bを定義するmain関数を作る。
3:そのmain関数のなかでベクトルA,B間の距離を計算する。
4:次にこの距離の計算部を関数にする。
 という問題なんですが。
736731:03/05/11 22:57
>>734
なるほど!ありがとうございます。
ベクトルわからないんですけど。vector?配列?とか思ってしまうんですけど。
泣きそうなんですけど。  ・・・ごめんなさい。
これはmallocで確保しろとか言われた?
構造体でするとか・・・。
739デフォルトの名無しさん:03/05/11 23:11
>>738
特には言われなかった気がします。
740デフォルトの名無しさん:03/05/11 23:12
>実数要素N個からなるベクトル
ってところでわけわかめ

単に2点間の距離を求めるということとは違うんだよね?
742bloom:03/05/11 23:13
違うかもしれないけど
要はN次元での2点間の距離を求める問題とは違うのん?
>725のプログラムめちゃくちゃすぎ!
defvecが何をすればいいのか解らないんだよね。
領域を確保するだけでいいのか、
確保して値もstdinとかから読み込むのか、
main内で配列として持っておいて値を入れるだけなのか。
とりあえず。
defvec関数は何を入れたらいいのか分らんから、とりあえず0で埋めた。

#define N 128

void defvec(double A[]){
int i;
for(i=0; i<N; i++)
A[i]=0;
}
double distance(double A[],double B[]){
int i;
double k=0;
for(i=0;i<N;i++)
k+=(A[i]-B[i])*(A[i]-B[i]);
return sqrt(k);
}
int main(){
double A[N];
double B[N];
defvec(A);
defvec(B);

printf("%f\n",distance(A,B));
return 0;
}
747デフォルトの名無しさん:03/05/11 23:33
すいません。わたし自身がどうしていいのか理解できてません・・・
>735しか言われなかったもので。
言い換えれば、その仕様さえ満たしていればどう作ろうが出題者は文句を言えないわけか。
N次元ベクトルの各要素を配列に入れなさいってことではないかと思ふ
あぁその値がどこから来るのかが不明なわけか…
751あふぉ:03/05/12 00:27
xのn乗を求めるプログラムを教えて下さい。
2進数表示を利用する奴です
オレニマカセロ!
7537:03/05/12 00:52
文字列sを逆順にして出力する関数void reverse(char s[])を作成しなさい。
ヒント:関数strenを用いてあらかじめ文字列sの長さを測ると容易。
お願いします
#include <algorithm>
#include <stdlib.h>
#include <iostream>
void reverse(char s[])
{
 std::reverse(&s[0], &s[strlen(s)+1]);
std::cout << s << std::endl;
}
オレニマカセロ!

>>751
int power(int x, int n) {
int r = 1;
for (; n; n>>=1, x*=x)
if (n&1) r *= x;
return r;
}
void reverse(char s[]) {
char *t = s + strlen(s) - 1;
for (; s < t; s++, t--) {
char tmp = *s;
*s = *t;
*t = tmp;
}
}
757あふぉ:03/05/12 01:13
ありがとん!!
758動画直リン:03/05/12 01:13
>>755
符号付きのものを右シフトして、0になることを期待するなよ。
ごめん。
if (n < 0) return 0;
とかいれて、はじいといて。
761デフォルトの名無しさん:03/05/12 04:13
みんなー、ちんぷんかんぷんなオラに力を貸してくれ

Cなんですけど

int 型の配列 a[MAX] (MAX は 10〜100000 の間で適当に動かしてみる) に,昇順で整数を代入しておく.
配列 a[MAX] に代入される整数は,1,3,9,12 などのように飛び飛びでもよく,また,8,10,10,10,14 などのように同じ値が連続してもよいとする.
以下の仕様に従って,a[l]〜a[r] (l ≦ r) の中に値 k が存在するならばその位置を返す再帰関数 int binary_search(int a[], int k, int l, int r) を作成し,プログラムと実行結果を示せ.

 関数 int binary_search(int a[], int k, int l, int r) は,a[l]〜a[r] (l ≦ r) の中に値 k が存在するならばその位置を返す.

 a[l]〜a[r] (l ≦ r) の中に値 k が存在しない時は,関数 int binary_search(int a[], int k, int l, int r) は -1 を返す.

 関数 int binary_search(int a[], int k, int l, int r) は,以下のような再帰関数とせよ:

  a[l] == k ならば,l を返す.

  a[l] < k ≦ a[(l + r) / 2] ならば,binary_search(a, k, l, (l + r) / 2) を再帰的に呼び出しその値を返す

  a[(l + r) / 2] < k ≦ a[r] ならば,binary_search(a, k, ((l + r) / 2) + 1, r) を再帰的に呼び出しその値を返す.

  それ以外の場合,-1 を返す.

比較的小さな MAX に対しては,計算の過程において関数 int binary_search(a, k, i, j) (0 ≦ i < MAX, 0 ≦ j < MAX) がどのように呼び出され,どのような値を返したのかを,printf などを用いて画面に出力すること.
また,MAX を 10〜100000 の間で適当に動かして

 関数 binary_search(a, k, i, j) (0 ≦ i < MAX, 0 ≦ j < MAX) が呼び出された回数

 関数 binary_search(a, k, i, j) の中で k と配列の要素が大小比較された回数

がどのように変化するかについて考察すること (大ざっぱなオーダーだけではなく,係数・定数の値まで見積ること).

って宿題があるんですが、さっぱりわからないのでお願いします。
ホントにさっぱり判らないならここで聞くだけ無駄だ。あきらめろ。
(゚∀゚)シープラプラ!!
>>761
>大ざっぱなオーダーだけではなく,係数・定数の値まで見積ること

無茶言うなよ・・・
川合堂ライセンス(´_ゝ`)
766デフォルトの名無しさん:03/05/12 10:05
学校で情報処理やっているから、良スレ発見。
767488:03/05/12 11:01
非常に亀レスすいません。突然ネットワークに接続できなくなったので...

>>491
ありがとうございます。その通りです。
ただ、C++じゃなくてCのソースが欲しいです。
最初に書かなかった私が悪いんですが、勉強のため、よろしくお願いします。
>>767
cinとcoutをそれぞれstdinからの入力とstdoutへの出力に置き換えるだけじゃん。
自力で何とかしなさいよ。
769488:03/05/12 12:34
>>768
すいません。Cしか使ったことないんで...
調べたんですけど、良くわからなくて...
もうちょっと調べてみます。
770デフォルト名無しさん:03/05/12 13:07
Sample:
最初の #: 1(scanf)
次の #:   3(scanf)
三番目の #:  4(scanf)

最初の2つの#を入力してください:  1 3 (scanf)

最初の#は1、次は3、 三番目は 4ですね? (printf)

というプログラム。(ノードを使って)
ノードって何?
772動画直リン:03/05/12 13:13
>>761
とりあえずbinary_searchは書けるだろ。
>>767
ちゃんと書いてるから気にするな。
このスレは「C」って言われてもC++で書く、字の読めない馬鹿がいるだけだ。
>>771
リスト構造のことじゃねーの?
>>770を読んでも意味がわからないんですけど。
>>770
ニホンゴワカリマスカ?
ワーカリーマセーン
>>488 処理系に依存する。
>>779
どこが?ビープ音? それは処理系というか他の環境によるのでは。
>>779>>780
timeとclockの事では?winでは暦時間、プロセス時間だけど、unix?何かでは
違うらしいです。
783デフォルトの名無しさん:03/05/12 19:54
2分木探索のdelete関数のプログラムを
ポインタのポインタを使って書かなければいけないのですが、
どのようなプログラムになるか教えて下さい。
お願いします。

>>782
僕のパソコン(winMe)だとミリ秒を返してくれるのですが、返してくれない機種も
あると言われたことがありました。
>>784
CLOCKS_PER_SECで割ればいいだけ。
まあ実時間であるとは限らないからだめと言う人もいるかもしれないけど。
>>784
CLOCKS_PER_SECで割るんだけど。馬鹿?
787デフォルトの名無しさん:03/05/12 20:09
相乗平均を求めるプログラムってどうすればいいのですか?
二つの時はルート取ればいいのですが
三つ以上になるとどうすればいいのかわかりません。
>>787
#include <math.h>
double
geometric_mean(double *a, int n)
{
int i;
double x = 0.0;

for(i=0; i<n; i++) x += log(a[i]);
return exp(x/n);
}
>>785>>786
1000/1秒を返す機種ならCLOCKS_PER_SECが1000になり
100/1秒を返す機種なら100になり、割ることで結果的に秒単位の
プロセス時間を得れるって事?
791デフォルトの名無しさん:03/05/12 20:41
>>788
ありがとうございます。そっかlogから考えれば良いのか。
792568:03/05/12 20:45
>568です。遅くなりましてすみません。
レスくださった方、有り難うございます

>568とほとんど同じなのですが…、
まず50個のデータ(数字)を入力し、昇順に並べ替える。
そのなかに好きな数字を入れる。そして、その数字がどこにあるのかを最初(1番目)から探し、
探している進行状況を表示するプログラムを作成せよ。
(例えば、好きな数字25を入力した場合、まず1番目を検索し、25でなければ「1 NG」と表示。
2番目を検索し、25でなければ「2 NG」と表示…… と続いて、x番目にあれば「x OK」と表示。」

C言語です。プログラムよろしくお願いしますm(__)m
>>792
それは二分探索を使わなければならないの?
>>792
>>573を改造すればいいだろ?
795568:03/05/12 21:18
>>793
二分探索は使用しても、しなくてもどちらでも良いですm(__)m

>>794
すみません。さっぱりわからないんです。
>>795

#include <stdio.h>
#include <stdlib.h>

static int icmp(const void *,const void *);

int main()
{
int ia[50],i,search;

for(i=0;i<50;i++){
printf("%2d個目のデータ : ",i+1); fflush(stdout);
scanf("%d",ia+i);
}
qsort(ia,50,sizeof(int),icmp);
printf("\n\n探索する数字 : "); fflush(stdout);
scanf("%d",&search);
for(i=0;i<50;i++){
if(ia[i]==search){
printf("%2d OK\n",i+1);
return 0;
}
printf("%2d NG\n",i+1);
}

return 0;
}
797つづき:03/05/12 21:29

static int icmp(const void *x,const void *y)
{
const int *xp=(const int *)x;
const int *yp=(const int *)y;

return *xp==*yp?0:*xp<*yp?-1:1;
}
798798:03/05/12 21:38
文字列sを逆順にして出力する関数void reverse(char s[])を作成しなさい。
ヒント:関数strenを用いてあらかじめ文字列sの長さを測ると容易。

お願いします
>>798

#include <stdio.h>
#include <string.h>

void reverse(char s[])
{
int i;
for(i=strlen(s)-1;i>=0;i--)
putchar(s[i]);
}
>>799
strenを使うんだろ。
strlenではないかと思われ

int stren(char *s)
{ return strlen(s); }
を使うべし
>>800
#define stren(x) strlen(x)でいいだろ。
マクロ関数とはかいてねーからさ
>>802
うるせー馬鹿!

ところで、戻り値の型はsize_tにしたほうがいいと思う。
size_t (*stren)(const char *)=strlen;

stren(s);
>796
有り難うございました!
マクロ関数って聞いたことないな。
>>801で言ってるのは引数つきマクロなんだが、これのことか?
俺は関数風マクロと呼んでいるが何か?
引き数つきマクロの関数的用法と呼んでいるが何か?
マクロって読んでますが何か?
>>761
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100000
int compare(const void*, const void*);
int binary_search(int*, int, int, int);
int main(void) {
static int a[MAX]; int i, n;
srand( (unsigned int)time(NULL) );
for (i=0 ;i < MAX; i++) { a[i] = rand(); }
qsort((void*)a, (size_t)MAX, sizeof(int), compare);
printf("Input:"); scanf("%d", &n);
if ( binary_search(a, n, 0, MAX-1) == -1) printf("not found\n");
}
int compare(const void* left, const void* right) {
return (*(int*)left == *(int*)right)? 0 : (*(int*)left < *(int*)right)? -1 : 1;
}
int binary_search(int* a, int k, int l, int r) {
static int ct=1;
if (a[l] == k) { printf("%d OK\n", ct); return l; }
if ( (a[l] < k)&&(k <= a[(l+r)/2]) ) { printf("%d NG\n", ct++); return binary_search(a, k, l, (l+r)/2); }
if ( (a[(l+r)/2] < k)&&(k <= a[r]) ) { printf("%d NG\n", ct++); return binary_search(a, k, (l+r)/2+1, r); }
return -1;
}
>>810
お前の冗長なコードもなー
int compare(const void* left, const void* right) {
return (int*)left-(int*)right;
}
>>811
よく確認しないで書いてしまうおまえもなー
int compare(const void* left, const void* right) {
return *(int*)left-*(int*)right;
}
Cの宿題で、与えられた年が閏年か判定するプログラムを作れってのが出たんだが
関数uru_year()は整数型の引数をもらい、閏年なら1、違ったら0を返すらしいんだが
if文でやるぐらいしかワカンネ。
こんな簡単なのもわからん漏れに誰か教えてくれ。
uru_yearの中でifを使えばイーンジャネーノ?
815813:03/05/13 11:40
>>814
整数型の引数をもらうところがわからん。
816デフォルトの名無しさん:03/05/13 12:38
bool leap_year(unsigned int year){
 if(yeaar>西暦何年だが忘れた)
  return (year % 4!=0)?false:((year%100!=0)?false:*));
 else{
  printf("当時は閏年という概念は無かった\n");
  exit(-1);
 }
}
*は普通はtrue,しかし厳密には更に(year%うんたらかんたら!=0)?false:...
が続く。(ほぼ無限)
キーワード「閏年 判定」
上から5件目

だからなぁ、ぐぐれよ・・・
(ぼそっ)おいおい、西暦指定間違えただけでプログラム停止かよ……
ずいぶんユーザーに厳しいな
int uru_year(int year);
/* yearは現行西暦を仮定 */
int uru_year(int year)
{
 if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
  return 1;
 }
 return 0;
}
>>818
それ以前に間違ってるんだからどうでもいいじゃん。
>>820
ま、確かに。
822デフォルトの名無しさん:03/05/13 12:51
>>821
そりゃ2chなんだから、falseとtrueが入れ替わることは
大いにあり得るな。ビットにして1ビットしか違わないんだし...
いやいや、bool型なんてものはANSIのC言語には存在しないでしょ?
yeearなんて未定義の変数を使ってみたり、、、

普通は>>819さんのプログラムで正解と思われ。
エラー処理も必要(?)なんだが。
824わか:03/05/13 13:04
不況に負けていませんか?インターネットでお金を稼いで
人生をバラ色にして、年商1000万円ほど稼ぎませんか?
ただし、多少の営業努力が必要です。ノルマ無し、料金回収無し
クーポン屋 「2003年」
営業が得意な方は、年商1000万円稼げます。
私と仲良くビジネスをしませんか?
http://www.c-gmf.com/index1.htm
http://www.c-gmf.com/index2.htm
http://www.c-gmf.com/index3.htm
http://www.c-gmf.com/mail.htm
クーポン屋でございます。貴方のHPにバナーを貼るだけで
稼げます。本当にお金が欲しい方は、相談にのります。キャッシュバック制度!
>>823
おまえもエラーだな
○yeaar
×yeear
826デフォルトの名無しさん:03/05/13 13:08
もう、いやーーーーーー
>>819 勝俣のところ、括弧もう一個いらなかったけ?
828デフォルトの名無しさん:03/05/13 13:33
>>823
あなたの頭はどんな石で出来てますか?もしかしてコンパイラさんでっか?
>>828
プ
830デフォルトの名無しさん:03/05/13 14:00
C言語でお願いします。

長さが32の0と1の列
se7e6…e1e0d1d2d3…d23
を入力してこのビット列の表す実数値

(-1)^s*(1+M)*2^E if -127<E<128
(-1)^s*M*2^(E+1) if E=-127
Inf(無限大) if E=128,M=0
NaN(非数) if E=128,M≠0
ここで、M=琶=1~23 di*2^-i , E=琶=0~7 ei*2^i−127

を出力するCプログラムを作成せよ。
>>830
問題が理解できない
馬鹿
>>830
float
str2float(char *str)
{
  union strflo {unsigned int u; float f;} x; x.u = 0;
  while (*str != '\0'){x.u <<= 1; x.u |= *str++ == '1' ? 1 : 0;}
  return x.f;
}

#include <stdio.h>
int
main(int argc, char **argv)
{
  if (argc < 2 || strlen(argv[1]) != 32) return 1;
  printf("%.8e\n", str2float(argv[1]));
  return 0;
}
>>833
ついでに、文字列のチェックも入れといて
>長さが32の0と1の列
>se7e6…e1e0d1d2d3…d23

0と1の列とか言ってるけど、例はそうなってないし、ようわからんね。

ああ、わかった。
つまり、たとえば以下のbit列を、
0 1  0  1011010101001001
~ ~  ~  ~
S e7 e6 e5...
とするって事か。
>>833
intとfloatは同じ大きさなの?
>>837
C言語では定義されていないInfやらNaNが指定されている時点で可搬ではない。
>>838
ん?
840デフォルトの名無しさん:03/05/13 19:21
void main(void)
{
char x='A';
int a=5,b=32;
printf("@",x);
printf("%d+%d=(A)x\n",B)
printf("%dC%d=%d\n",D);
printf("変数%cの初期値は%dです\n",x+E,a);
}
実行結果
変数xの初期値はAです
5+32=(0025)x
32%5=2
変数aの初期値は5です
Eの答えがわかりません
>>840

(-x)+'a'
>>840
bなんだろうけど、>>841 にすべきだね。
843840:03/05/13 19:38
なるほど。ありがとうごさいます
844デフォルトの名無しさん:03/05/13 20:13
VCでapiのpeekmessage()を使って押された、
キーコードを2文字以上を、
同時に取れる事で出来るんですか?
また方法を教えていただけますでしょうか?
845デフォルトの名無しさん:03/05/13 20:15
ある乱数を発生させてそれぞれに条件式をつけるにはどうすればいいですか?

乱数で1から100までの数字を発生させて
1〜40ならA
41〜50ならB
50〜99ならC
100ならD
といったような具合に場合分けしたいときって どうすればいいんですかね?
1<X<40
こういった条件式をプログラム上で行いたいんだけど
良いほうが思いつかないもので

初心者的な質問ですんません
C言語限定ってわけではないけどアルゴリズムが知りたいので書きました
良かったら 教えてください


>>845
あちこち同じカキコすんなや。
>>845
int r=ransuu;
if(r<=40){A();}elseif(r<=50){B();}elseif(r<=99){C();}elseif(r==100){D();}
848デフォルトの名無しさん:03/05/13 20:27
お願いします。

「英文字を入力すると読み込んだ文字を 50 個横に並べて表示する」プログラムを作れ。

入力される文字は A 〜 Z で、1文字であると仮定して良い。たとえば、G を
入力すると、

GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

と表示されるようにする。

なお、入力された文字の検査(A 〜 Z以外の文字が入力されなかったかどうか、
1文字であるかどうかの検査)は行わなくて良い。

また、入力された文字が変数 moji に格納されている時、この文字を表示するには、

printf("入力された文字は %c です。\n", moji);

と書くことができることをヒントにしても良い。ただし、解答として、

printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c...

のように %c を 50 個並べることは禁止する。


>>848
void print50char(int c){int i;for(i=0;i<50;i++)printf("%c");printf("\n");}
>>845

x=(rand()/100)+1;
if (x >= 1 && x <= 40) {
} else if (x >= 41 && x <= 50) {
} else if (x >= 51 && x <= 99) {
} else if (x == 100) {
} else {
}
>>848

char buf[51];
memset(buf,getchar(),50);
buf[50]='\0';
puts(buf);
>>849,851
848はバカだから、scanfのところも書いておいてあげなきゃ
char moji; int i; scanf("%c",&moji); for (i=0;i<50;i++) printf("%c", moji);
>>848

#include <stdio.h>

int main(void)
{
  int i;
  char c;

  c=getchar();
  for (i=0; i<50; i++)
    printf("%c", c);
  printf("\n");

  return 0;
}
実行すると文章の行ごとに左右反対になるプログラムを
ファイル構造体を使って作成しなさい
asupugqaudga9という文だと9aduaqgupusaとなるようにしなさい
文章がはいってるのはahya.txtとします
(´・ω・`)?

ab
cd

ba   dc
dc か ba か
どっち?
>854
コンパイラを教えて
>>856
icl
お願いします

3ケタの数字でそれぞれのケタを3乗したものの和が
元の3ケタの数字と同じになるものを全て探すプログラムを作成しなさい。
859854:03/05/13 22:50
asupugqaudga9という文だと9agduaqgupusadesaですた・・・
860854:03/05/13 22:56
追記
./a.out ahya.txt result.txt と実行すると
ahya.txtの中のそれぞれの文章の行について左右反対にした
resulet.txtというファイルを作成するプログラムでつ
(´・ω・`)わかりにくかったね・・・
861初心者の名無しさん:03/05/13 23:03
>>858
if (pow(100の位 , 3) + pow(10の位 , 3) + pow(1の位, 3) == 元の数)
{
同じでした
}
#include <stdio.h>
main(){
int dat,a[3];
scanf("%d",&dat);
a[0]=dat%10;dat/=10;
a[1]=dat%10;dat/=10;
a[2]=dat%10;/*datだけも良いかな*/
if((a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==dat)
printf("%d",dat);
return 0;
}
>>858
#include <stdio.h>
int main()
{
  int i, j, k;
  int cube[10];
  int value100, value10, value;
  int sum100, sum10, sum;
  
  for (i = 0; i < 10; i++) cube[i] = i * i * i;
  for (i = 1; i < 10; i++) {
    value100 = i * 100;
    sum100 = cube[i];
    for (j = 0; j < 10; j++) {
      value10 = value100 + j * 10;
      sum10 = sum100 + cube[j];
      for (k = 0; k < 10; k++) {
        value = value10 + k;
        sum = sum10 + cube[k];
        if (value == sum) {
          printf("%d = %d + %d + %d\n", value, cube[i], cube[j], cube[k]);
        }
      }
    }
  }
  return 0;
}
#include <stdio.h>
main(){
int data,dat,a[3];
for(data=100; data<1000; data++){
dat=data;
a[0]=dat%10;dat/=10;
a[1]=dat%10;dat/=10;
a[2]=dat%10;/*datだけも良いかな*/
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
printf("%d ",data);
}
return 0;
}
4つでしょ?
void reverseoutput(char *s, FILE *outfp)
{
    int i;
    for (i = strlen(s) - 1; i >= 0; i--)
        putc(s[i], outfp);
}

int main(int argc, char **argv)
{
    FILE *infp = stdin, *outfp = stdout;
    char buf[256];

    switch (argc) {
    default:
    case 3:
        if ((outfp = fopen(argv[2], "w")) == NULL) {
            fprintf(stderr, "connot open file: %s", argv[2]); exit(1);
        }
    case 2:
        if ((infp = fopen(argv[1], "r")) == NULL) {
            fprintf(stderr, "connot open file: %s", argv[1]); exit(1);
        }
    case 1:
        break;
    }

    while (fgets(buf, sizeof(buf), infp))
        reverseoutput(buf, outfp);

    return 0;
}
What is >>866?
改行の取り扱いに難あり。
869デフォルトの名無しさん:03/05/14 00:09
文字列を扱うための2つの変数string1とstring2をつぎのように初期化する。
この初期化の仕方は何が違うのか詳細に述べよ。
メモリ上で文字列を格納する領域の取り方に注意。
それぞれの変数に適した使い方についても考えてみること。
char string1[]="Good morning";
char *string2="Good night";

↑ってのが課題ででました。
ちんぷんかんぷんです。教えてください。
Cの仕様書見れ。
871デフォルトの名無しさん:03/05/14 00:53
紀元後の任意の年、任意の月のカレンダーを表示する
プログラム組んでちょんまげ。
>>871
国は?
グレゴリオ暦の採用時期がそれによって大きく異なるのだが。
875871:03/05/14 01:45
日本です!
ってことは、紀元ってのは西暦紀元じゃなくて紀元節の方か?
誰がそんなもん作るってのよ。
>>876
まぁ、660を引くんだか足すんだかすればいいわけだし。
ちなみに、皇紀という呼称のほうが好きだ。
>>875
4000年分ぐらいのテーブルつくれ。先生もきっと許してくれる。
879デフォルトの名無しさん:03/05/14 02:01
実行した日より一週間分の天気予報を表示するプログラムを作成せよ。
なお、あくまでも予想なのではずれてもよいものとする。

さっぱりわかりません(T_T)
>>879
地球シミュレータをクラックすれば、何とかなるんじゃないか。
まずは socket の使い方から学べ。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
char w[] = {"晴","曇","雨"};
int i;
for(i=1;i<=7;i++)
printf("%d日後の天気は%sかも\n",i,w[rand()/(RAND_MAX/N+1)]);
return 0;
}
>>879
1.天気予報のページを探して、そのページをブラウザで表示するシェルなどを作る。
2.上記のページをパースして、その情報を任意の方法で表示する。
3.”晴れ”,”曇り”,”雨”などの天候文字列を乱数で選んで表示する。

1:学生ならば不正解。社会人なら大正解。
2:ヒマと興味があるならおすすめ
3:普通だね
>>871 間違っている所があるかも。
#include <stdio.h>
#include <stdlib.h>
int CheckUruuDosi(int year)
{if((year%4==0&&year%100!=0)||year%400==0)return 1;return 0;}
int main(void)
{
int a,i[2],y,m,d,w=0,u;char s[256];
const int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(a=0;a<=1;a++)
{puts(a==0?"year?":"month?");gets(s);i[a]=atoi(s);
if(i[a]<=0||(a==1&&i[a]>=13))a--;}
for(y=1;y<=i[0];y++)for(m=1,u=CheckUruuDosi(y);m<=(y==i[0]?i[1]-1:12);m++)
w=(w+day[m-1]+(u&&m==2?1:0))%7;
u=CheckUruuDosi(i[0])&&i[1]==2?1:0;
puts("\nSun Mon Tue Wed Tur Fri Sat");
for(d=0;d<=w;d++)printf("%4s","");
for(d=1;d<=day[m-1]+u;d++)
printf("%3d%s",d,(d+w+1)%7==0?"\n":" ");
printf("\n\n改行を押してください 終了します");getchar();return 0;
}
お願いします

inoue note 120
inoue envelope 80
inoue pencil 20
yamada note 120
yamada envelope 80
kawaguchi envelope 80
kawaguchi pencil 20
yamamoto note 100

という内容の、db.txtというファイルを用いて
品目、単価への射影を

note 120
envelope 80
pencil 20
note 100

のように出力させたいんです

射影とは関係表から属性を切り出し
もし重複があればそれを取り除いたものだそうです。
885858:03/05/14 03:26
#include <stdio.h>
main(){
int data,dat,a[3];
for(data=100; data<1000; data++){
dat=data;
a[0]=dat%10;dat/=10;
a[1]=dat%10;dat/=10;
a[2]=dat%10;/*datだけも良いかな*/
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
printf("%d ",data);
}
return 0;
}

で求める事ができました  協力頂いた皆様ありがとうございます

さらにここで見つけた解の個数も表示するにはどうすれば良いのですか。
結果は定数「4」でなく変数を用いて表すとするとどうなりますか、教えて下さい。お願いします。
886__:03/05/14 03:33
if文の内でカウントすればええやろ
888858:03/05/14 03:47
>>887
もうすこし詳しく教えて下さいませんか?
カウントすれって言われてもピンと来ない程度なので。。。
889871:03/05/14 03:53
>>883
完璧でした!!まじありがとうございました。
まいったなあ、カウントすれがわからないってか。
if文の内に入った回数を数えましょう、ならわかるか?
>>890
ホントにわかんないです。。。
何使って書くのかさえわかんないです。。。
>>891
1ずつ数えるなら変数の値に1足してゆく。
(解の数)++って書けばよいのだと思うのですが、
解の数の表現方法がわかりません。。。

解というかif文に入った回数ですか?

あぁホント情けないです。。。
解の数は0から899を表現できる型ならなんでもいいでしょ。
普通はint型を選ぶよね。
int 解の数;で宣言して、if文の内で(解の数)++てやって
最後に表示すればいいでしょ。
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
printf("%d\n",data);
printf("%d個です",i++);}

ってやってみたらメチャクチャたくさん表示されるのはどうしてでしょうか?
1. iは初期化してますか?
2. {}で囲まれていないif文の範囲はわかりますか?
>>858
#include <stdio.h>
int SZ(int num){return num*num*num;}
int main(void)
{
int num[3]={0};int a;
for(;num[2]<=9;)
{
if(num[2]*100+num[1]*10+num[0]==SZ(num[2])+SZ(num[1])+SZ(num[0]))
printf("%d%d%d ",num[2],num[1],num[0]);num[0]++;
for(a=0;a<=1;a++)if(num[a]==10){num[a]=0;num[a+1]++;}
}
puts("\n改行を押してください 終了します");return 0;
}
なるほど、わかりました。ありがとうございますです
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
{printf("%d\n",data);
printf("%d個目\n",i++);}
初期化の後、こうして記述すると個数が表示できました。

この場合の実行結果は
(数字)1個目
(数字)2個目
・・・・・・・・・・・
となりました。

ここで結果として「何個あったか」のみを表示するためにはどこをいじれば良いのですか?
899897:03/05/14 04:40
>>897
最後にgetchar()を付け忘れてました。
後、num[0]++が変な位置にありますが、前のifとは関係ありません。
>>898
i++はif文の内に残して、for文の外でprintfすれば良い
i++だけ残してっていうやり方が。。。 

うわぁ、、もう朝の準備せんと。。。 あとひといきお願いします!
if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==data)
{printf("%d\n",data);
i++;}
}
printf("%d個\n",i);
903動画直リン:03/05/14 05:13
>>902
できました! 長々とありがとうございました!
インデントが気持ち悪いよぉ。

だから最初からifやwhileはブロックにしろと・・・
907こんぴゅーた-:03/05/14 10:11
ポインタ変数を使って作成しろって課題が出たんですが、
実行すると
文字列を入力してください:tokyo
反転文字列は"oykot"です.
ってなるようにプログラムを作成しなければならないのですが、
最近printfとかcharの使い方を最近になって理解したばっかなのに、
こんな課題出されてこまっております。
だれか救って下さい。ぼくはパソコンむいてないかも(*-*)
/* >>907 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(int argc, char **argv)
{
  char buf[BUFSIZ];
  int n;

  fputs("文字列を入力してください:", stderr);
  fgets(buf, BUFSIZ, stdin);
  fputs("反転文字列は\"", stderr);
  for(n=strlen(buf)-1; n>0;) putc(buf[--n], stderr);
  fputs("\"です.\n", stderr);
  return 0;
}
909こんぴゅーたー:03/05/14 16:48
ありがとうごザいます。
やってみます
>>908
末尾につくであろう改行文字を考慮しているんだろうけど、なんか・・ちょっと・・・
おまえら、Windowsでは改行は\r\nだぞ。
入出力関数がうまくやってくれる。
俺もたいした技術じゃないけど、配列に順に入れて
ケツから出せばいいだけでは?
>>913
>>908にはそう書いてあるようには見えないのか?
私は907ではないんですが
こういうソースを書いたら上手くいきませんでした
どこがおかしいのでしょうか?

#include <stdio.h>
#include <string.h>

int main(){
char *str,*str1;
int len,i;

puts("文字列を入力して下さい");
gets(str);
len=strlen(str);
for(i=0;i<=len-1;i++){
*(str1+i)=*(str+len-1-i);
}
printf("反転文字列は %sです",str1);
return 0;
}
>>915
コンパイラの警告は無視しないように。
str,str1が初期化されていないのに使われていると言われなかったか?
char str[1000],str1[1000];
while (1) {
if (a[i] == key)
break;
i++;
}

において、whileではなく、forを使うとどうなりますか?
for(; a[i] != key; i++);
for(;;) {
  if (a[i] == key)
    break;
  i++;
}
ファイル処理の問題で、30行ほどの英文が書かれたunix.txtを1行ずつ逆に表示したresult.txtを作るプログラムをお願いします。(例:I am が ma I と表示される)

下のソースを改造するようなのですが・・・。

#include <stdio.h>

void main (void)
{
unsigned char moji[10];
FILE *fp;

if ((fp = fopen ("unix.txt", "r")) == NULL)
{
printf(" FILE OPEN ERROR\n");
}
else
{
if(fgets (moji , 2, fp) !=NULL)
{
printf ("FILE ROAD OK\n");
printf ("READ DATA -> %s\n", moji);
}

else
{
printf ("FILE READ ERROR\n");
}

fclose (fp);
}
}
919さん、920さんありがとうございました。
こんな短いプログラムも書くことが出来ないなんてダメですよね。

ですが、もう1問だけ質問させてください。

要素数がnである配列aからkeyと一致する要素数の添え字を配列idxの先頭から
順に格納し、一致したよう素数を返す以下の関数を作成するという問題です。
272625という配列で2を指定すると3が導かれると言うものです。

int searchidx(int a[], int n, int key, int idx[]);

main関数は次の書き込みにします。
int main(void)
{
int i, ky, idx;
int x[7];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);

idx = search(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */

if (idx == -1)
puts("探索に失敗しました。");
else
printf("%dは%d個あります。\n", ky, idx + 1);

return (0);
}
>>921
#include <stdio.h>
#include <algorithm>

void main (void)
{
unsigned char buf[32768];
FILE *fp;

if ((fp = fopen ("unix.txt", "r")) == NULL)
{
printf(" FILE OPEN ERROR\n");
}
else
{
while(fgets(buf , 32767, fp) !=NULL)
{
std::reverse(buf, buf + strlen(buf));
std::cout << buf << std::endl;
}

fclose (fp);
}
}
925924:03/05/14 22:16
#include <string.h>
#include <iostream>

入れ忘れた
このスレだけでreverse問題は何問でてきたのか・・・・・
>>922です。
補足すると線形探索でするそうです。
928デフォルトの名無しさん:03/05/14 22:20
>>921
適当にだけどこんな感じ?

void main()
{
char str[256];
int i;
FILE *fp;

if ((fp = fopen("unix.txt", "r") == NULL) {
printf("error\n");
exit(1);
}

while(fgets(str, 255, fp)) {
for (i = strlen(str - 1); i >= 0; i--) {
putchar(str[i]);
}
putchar('\n');
}

fclose(fp);
}
>>921
良く読んでなかった。result.txt作るのね。

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <iostream>
#include <fstream>

void main (void)
{
unsigned char buf[32768];
FILE *fp;

if ((fp = fopen ("unix.txt", "r")) == NULL)
{
printf(" FILE OPEN ERROR\n");
}
else
{
std::ofstream ofs("result.txt");

while(fgets(buf , 32767, fp) !=NULL)
{
std::reverse(buf, buf + strlen(buf));
ofs << buf << std::endl;
}

fclose (fp);
}
}
930デフォルトの名無しさん:03/05/14 22:25
>>921
課題1
./a.out unix.txt result.txt と実行すると
unix.txtの各行について左右反対にしたresulet.txtというファイルを
作るようなプログラムを作成しなさい

もとの課題はこれ?
931デフォルトの名無しさん:03/05/14 22:26
>>928
訂正
fopenでresult.txtをwで開いて
fputcで書き込みかな
>>922
int searchidx(int a[], int n, int key, int idx[])
{
  int i, j;

  j = 0;
  for (i = 0; i < n; i++) {
    if (a[i] == key) {
      idx[j] = i;
      j++;
    }
  }
  return j;
}
>>931
ありがとうございます。ちょっとやってみます。

>>930
それですw
>>905
#define p3(xx) (xx*xx*xx)
if(p3(a[0])+p3(a[1])+p3(a[2])==data)
{printf("%d\n",data);
i++;}
}
printf("%d個\n",i);
>>933
>>860 見ろ。
おまいらの学校はどうなってるんだ?
>>935
すいません、よく見てませんでした。以後気をつけます。

言い忘れてましたが>>929氏もありがとうございました。
937922:03/05/14 22:58
932さん、書き込みありがとうございます。

早速、関数を置き換えてみました。
ですが、呼び出し時のパラメータが足りないと出てしまいます。
たしかに3つしかSearchidx関数に渡していないのですが
解決方法が分かりません。
どうしたらいいのですか?
938922:03/05/14 22:58
int main(void)
{
int i, ky, idx;
int x[7];
int nx = sizeof(x) / sizeof(x[0]);

printf("%d個の整数を入力してください。\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d]:", i);
scanf("%d", &x[i]);
}
printf("探す値:");
scanf("%d", &ky);

idx = searchidx(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */

if (idx == -1)
puts("探索に失敗しました。");
else
printf("%dは%d個あります。\n", ky, idx + 1);

return (0);
}
3つしか受け取らない関数として書きなおすか
十分な領域を確保して関数に渡す。
int searchidx(int a[], int n, int key, int idx[])
関数の定義では、引数を4つとることになっている。
idx = searchidx(x, nx, ky);
関数呼び出し時に引数が3つしか指定されていない。1つ足らない。
939さんへ

もし、書き直すとすれば、main関数だけです。
何処を書き換えるのですか?
>>922
これでどう?
int searchidx(int a[], int n, int key)
{
  int i, j;

  j = 0;
  for (i = 0; i < n; i++) {
    if (a[i] == key) {
      j++;
    }
  }
  return j;
}
int hoge[7];
idx = searchidx(x, nx, ky, hoge);
>>941
idx = searchidx(x, nx, ky);/* 配列xから値がkyである要素を線形探索 */



int *idxbuf = new int[x];
idx = searchidx(x, nx, ky, idxbuf);/* 配列xから値がkyである要素を線形探索 */
delete[] idxbuf;
int searchidx(int a[], int n, int key)
{
return n?(searchidx(a+1,n-1,key)+(*a==key?1:0)):0;
問題文で引数は4つと決められてるんでしょ?
じゃあ、呼び出し元がおかしいでしょ。
>>944
int *idxbuf = new int[x];



int *idxbuf = new int[nx];
948941:03/05/14 23:18
皆さんのお力でどうにか解くことが出来ました。
短い時間にたくさんのご指導をありがとうございました。

全ての解答を試してスキルアップしてみます。
>916
今、理解しました
ありがとうございます
950デフォルトの名無しさん:03/05/15 01:10
宿題でなくてもいいでしょうか。
駄目です
952950:03/05/15 01:21
(。>0<。) びええん
次スレを立てるプログラムはどう書きますか?
Thread2ch thread("http://pc2.2ch.net/test/read.cgi/tech/1051594046/");
Board2ch board("http://pc2.2ch.net/tech/")
if(thread.GetResCount > 950)
{
 board.CreateNewThread(thread.GetTitle() + " Part2", thread.GetRes(1).GetBody());
}
955デフォルトの名無しさん:03/05/15 16:23
>>954
山崎渉
Thread2ch thread("http://pc2.2ch.net/test/read.cgi/tech/1051594046/");
Board2ch board("http://pc2.2ch.net/tech/")

for(;;)
{
 thread.Update();
 if(thread.GetResCount() > 950)
 {
  board.CreateNewThread(thread.GetTitle() + " Part2", thread.GetRes(1).GetBody());
  break;
 }
 Sleep(300 * 1000);
}
for(;;)
{

Board2ch board("http://pc2.2ch.net/tech/")
board.Update();
Thread2ch &thread = board.FindThread("C/C++の宿題", Thread2ch::latest);

for(;;)
{
 thread.Update();
 if(thread.GetResCount() > 950)
 {
  board.CreateNewThread(thread.GetNextPartTitle(), thread.GetRes(1).GetBody() +
   "前スレ:" + thread.GetURL);
  break;
 }
 Sleep(300 * 1000);
}

}
958958:03/05/15 20:18
1から5の総和を求めるプログラムを作成したが、下記のプログラムではうまく動かない場合が生じる。誤りを指摘し1行だけ直して正しいプログラムにしなさい。

int add(int);

int main(void)
{
add(1);
add(2);
add(3);
add(4);
printf(“%d\n”,add(5));
return 0;
}
int add(int n)
{
int sum;
sum += n;
return (sum);
}

お願いします。
int sum; -> static int sum = 0;

こんな糞コード仕事で書くなよな。
int add(int);

int main(void)
{
add(1);
add(2);
add(3);
add(4);
printf("18\n");
return 0;
}
int add(int n)
{
int sum;
sum += n;
return (sum);
}
961958:03/05/15 21:04
>>959>>960
ありがとうございました
文字列sを逆順にして出力する関数void reverse(char s[])を作成しなさい。
関数strlenを用いてあらかじめ文字列sの長さを求めると容易。
お願いします。
>>958
>>959のが普通だと思うけど、””が間違いだし、戻り値が役に立っていない。
笑ってしまう>>960のが正解っぽい。意地悪問題か?ただ、総和は15だと思う。
ごめん。もうだめ。丸投げ。
for文かwhile文による繰り返しの問題です。

ボールを水平面に落とすと、元の高さの0.75倍の高さまで跳ね返る。
10回水平面にバウンドした後、最高地点に到達した瞬間までのボールの動いた
総距離を計算せよ。
初期高さは80mで、各回の高さも出力表示せよ

多分基本問題なんだろうけど、おながいします。
965964:03/05/15 21:16
あ、↑ふつうのCです。よろしくお願いします。
ただの等比数列じゃねーか
int x,y,t;
for(x=1; x<=10; x++)
{
   t = 80*0.75;
   printf("%d回目のバウンド時のボールの高さは%dです。\r\t",x,t);
}

コンパイルしてないし、漏れも初心者なのであってるかワカラン。
誰か上級者教えてくたされ
#include <iostream>

main()
{
 double total = 0;
 double height = 80;
 for(int i=0; i<10; i++)
 {
  total += height;
  height *= 0.75;
  std::cout << i+1 << "回目" << height << "m" << std::endl;
  total += height;
 }
 std::cout << "合計" << total << "m" << std::endl;

}
逆順が今の流行なのか?
>>967-968
はやっ!ありがとうございます。たすかりました。

>>969
同一学校と思われ
普通のC

#include <stdio.h>

float bound( float height )
{
return height * 0.75;
}

int main( void )
{
float height = 80;
float total = 0;
int counter;

for( counter=0; counter<=10; counter++ ) {
if( 0 != counter ){
height = bound( height );
total += height;
}
total += height;

printf( "%2d回目 %f m\n", counter, height );
}

printf( "ボールの動いた総距離: %fm\n", total );

return 0;
}
なぜdoubleではなくfloat?
なぜ片道しか加算しない?
doubleはfloatよりメモリ消費が烈しいからだろ。
>>972
出来ないならそんな無理しないで素直に>>968のcoutだけprintfに書換えとけよ。
976デフォルトの名無しさん:03/05/15 22:56
関数電卓のソースがあるところ知りませんか?
#include<stdio.h>
#include<math.h>
int func(double param1,double param2,double *souka,double *soujou)
{
*souka = (param1+param2)/2;
*soujou = sqrt(param1*param2);
return 0;
}
int main(void)
{
double a,b,c,d;
scanf("%f %f",&a,&b);
func(a,b,&c,&d);
printf("相加平均%f 相乗平均%f",c,d);
return 0;
}

どこが間違っているのかが分からないんです!教えてください!
978デフォルトの名無しさん:03/05/15 23:46
>>977
doubleなら
%f→%lf
C FAQを読みましょう。
scanfはdoubleに対しては%lfを使います。
980977:03/05/15 23:50
>>978>>979
助かりました!ありがとうございます!
思い込みによるバグ注入だな。
電脳土方にはよくある事
>>974
馬鹿?
たったの4バイトで「烈しい」と言うのか?
あぁ、変数が2つあるから8バイトか。
しかも、スタックは節約できても実コードは却って増える罠。
普通のC
#include <stdio.h>
#include <math.h>
#define START 80
#define RATE 0.75
#define TIMES 10

double gettotalmove(double start,double brate,int ntimes)
{
double d = pow(brate,(double)ntimes);
return start * (1 + brate) * (1 - d) / (1 - brate);
}

int main(void)
{
int i;
for (i = 1;i <= TIMES;i++){
printf("%d times, bound = %f,total = %f\n",
i,START * pow(RATE,i),gettotalmove(START,RATE,i));
}
return 0;
}
せめて
get_total_move
にしてホシイ
985デフォルトの名無しさん:03/05/16 00:39
>>984
漏れは字数が伸びてアンダースコア嫌い
GetTotalMoveにしてホシイ
>>984
javaっ娘なのでgetTotalMoveにしてホシイ
川合堂ライセンス(´_ゝ`)
>>985
字数を気にしてる時点でまだまだだな
俺もjava風味でgetTotalMoveとかがいいかな?
getが修飾してるってわかりやすいし
>>988
大文字小文字を混ぜるとき、先頭だけ小文字ではじめるのって、なんか利点があるんですか?
>>989
文字の量をそのままに単語の区切りを指定できる。
>>990
先頭だったら大文字小文字関係ないじゃん。
992デフォルトの名無しさん:03/05/16 07:29
カットオフを組み込んだクイックソートをプログラムとして実現せよ。ここで、要素数がM以下の部分ファイルに挿入整列法を使うものとする。そして、1000の要素のランダムなファイルに対して、最も速く走るようにMの値を定めよ。

問題の意味から教えて下さい。
>>992
quicksort cutoff >google
先頭小文字にするヤシは
JAVA厨ということでよろしいか?
995デフォルトの名無しさん:03/05/16 08:04
元に戻すちゃんねる
1000
997990:03/05/16 08:29
>>991
ごめんなさい。読み間違えてました。
>>989
先頭を小文字にするのは僕の場合、ローカル変数とグローバル変数を分ける
ため。特に仮引数に小文字ロングネーム変数を使う。僕が使っているVC6は、
関数を呼び出した時その名前が出るのでと言うのもある。グローバル変数を
使ってはいけないと言う説もありますが。
ローカル:yCountNum グローバル:YCountNum 関数:YCountNum() マクロ:Y_COUNT_NUM
        まもなくここは 乂1000取り合戦場乂 となります。

      \∧_ヘ     / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ,,、,、,,, / \〇ノゝ∩ < 1000取り合戦、いくぞゴルァ!!       ,,、,、,,,
    /三√ ゚Д゚) /   \____________  ,,、,、,,,
     /三/| ゚U゚|\      ,,、,、,,,                       ,,、,、,,,
 ,,、,、,,, U (:::::::::::)  ,,、,、,,,         \オーーーーーーーッ!!/
      //三/|三|\     ∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ∪  ∪       (    )    (     )   (    )    )
 ,,、,、,,,       ,,、,、,,,  ∧_∧∧_∧∧_∧ ∧_∧∧_∧∧_∧∧_∧
      ,,、,、,,,       (    )    (    )    (    )    (    )
(´∀`)ノ ハロハロ〜!
:::::::::::::::::::::::::::::::::::::/       \::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::/         :::::::::::::::::::::::::::::::::
:::::::::::::::::...... ....::::::|            |::::::::::::.. ...: ::::::::
:. .::::::::........ . .:::::::::::::::::::         | ........... ..:::::
:::: :::::::::... . .... .. . ヽ          / . . . ... ..::::: . .. .
            \      /
               −ー
       ∧_∧                    ./^^^^\
      ( ´∀`)               .   /      ;、 \
      (つ日 )              ⌒⌒/', ' ',;'', ;'',; '',;' ',' \
      | | |           ⌒⌒⌒/ ,          、  \⌒⌒
 TTTTTTTTTTTTTT.            /          、     \
  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|      ⌒⌒⌒⌒⌒⌒⌒⌒⌒ヽ
              .|               '⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒⌒
              .|                _      _
              .|    ',',',',', _  ,',',',',',' l^lニl ,',',',', l^lニl ',',',',',',',',',',',',',',',','
              .|     ',',' l^lニl ,',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',',','
1000ゲットは気持ち(・∀・)イイ!!
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。