x の2の補数は 1 0000 0000 - x と定義されている。 まあ要するに x と足して 1 0000 0000 になる数だ。 これを負の数と定義すると、オーバーフローを無視してしまえば、 x + (-x) = 0000 0000 になるため都合がいい。 そのため、2の補数表現が好まれている。 1 0000 0000 - x がなぜ ~x + 1 という形で求められるかだが、 これは 1 0000 0000 = 1111 1111 + 1 であるから、 1111 1111 - x = ~x となり、 1 0000 0000 - x = ~x + 1 となるのだ。 1111 1111 - x = ~x が分からなければ、 何か具体的な例を使って実際にやってみるといい。 すぐ分かる。
4 :
デフォルトの名無しさん :2007/07/10(火) 03:07:39
入力した10個の数値を昇順に並べ替えるプログラムを、バブルソート法を用いて作成せよ。 ※バブルソート法については、参考書やインターネット等を利用して調べること。 できません。。。 わかりますか?
5 :
デフォルトの名無しさん :2007/07/10(火) 03:09:34
6 :
デフォルトの名無しさん :2007/07/10(火) 03:15:38
#include <stdio.h> int BubSort(int x[ ], int n); void main(void); int BubSort(int x[ ], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (x[j - 1] > x[j]) { temp = x[j]; x[j] = x[j - 1]; x[j - 1]= temp; } } } } 今の現状です。。。見るも無残な姿です。。。
>>5 小学生でも分かると思うぜ・・・
落ち着いて読めば分かるはずだ。
8 :
デフォルトの名無しさん :2007/07/10(火) 03:35:01
10 :
デフォルトの名無しさん :2007/07/10(火) 03:42:28
これじゃまったく機能しないんですが・・・ 10こ数字を入力するプログラムを これにどう繋げればいいかわからなくて。。。
mainの中に配列要素10の配列に数値を入力していれればええやん・・・ってそれがわからんのか orz
12 :
デフォルトの名無しさん :2007/07/10(火) 03:47:21
なんか実行した画面で 「数字を10個入力してください」 見たいな感じなやつが出てきて、そこに10個数字入力してenter押したら結果が出てくるみたいなプログラム作るんですけど。。。
>>4 #include <stdio.h>
#define MAX 10
void BubSort(int x[], int n) {
int i, j, tmp;
for (i = 0; i < n - 1; i++) {
for (j = n - 1; j > i; j--) {
if (x[j - 1] > x[j]) {
tmp = x[j];
x[j] = x[j - 1];
x[j - 1]= tmp;
} } } }
int main(void) {
int a[MAX],i;
for(i=0; i<MAX; i++) {
printf("%d 番目の数値 > ",i+1);
scanf("%d",&a[i]);
}
for(i=0; i<MAX; i++) printf("%d ",a[i]);
printf("\n");
BubSort(a,sizeof(a)/sizeof(a[0]));
for(i=0; i<MAX; i++) printf("%d ",a[i]);
printf("\n");
return 0;
}
14 :
デフォルトの名無しさん :2007/07/10(火) 03:51:36
す。。。すごい。 何がなんだか。。。これって初歩的なんですかね? 自分には天才にしか見えないんですけど。。。
BubSort(a,sizeof(a)/sizeof(a[0])); BubSort(a,MAX); < ここはMAXで良いや。配列の要素の数を入れるんだが
16 :
デフォルトの名無しさん :2007/07/10(火) 04:16:44
携帯から書きます! 連続投稿ですか?5回みたいな規制がかかって書けません! そこのプログラムは変えても実行時に変化はないんですか?
あるないは実行して確認すりゃええやろ。。。
18 :
デフォルトの名無しさん :2007/07/10(火) 04:37:17
そうですねwww ありがとうございました! ちゃんと調べて自分なりのプログラムもちゃんと作ります!!!
19 :
デフォルトの名無しさん :2007/07/10(火) 07:56:16
#include <stdio.h> void BubSort(int x[10], int n) { int i, j, tmp; for (i = 0; i < n - 1; i++) { for (j = n - 1; j > i; j--) { if (x[j - 1] > x[j]) { tmp = x[j]; x[j] = x[j - 1]; x[j - 1]= tmp; } } } }
20 :
デフォルトの名無しさん :2007/07/10(火) 07:57:48
int main(void) { int a[10],b,i; printf("10個の数字を入力してね!"); printf("\n"); for(i=0; i<10; i++) { printf("%d個目",i+1); scanf("%d",&a[i]); } BubSort(a,10); for(i=0; i<10; i++) printf("%d ",a[i]); printf("\n"); return 0; } 授業で習っていない文字を省いて自分なりに出来ました! ありがとうございました!
fgetsは使いだね。
int num[]={1,2,3,4} main() { srand( (unsigned)time( NULL ) ); for(j= 0; j < 6;j++){ if(p==711) printf( " %d ", num[rand()%43] );
int num[]={1,2,3,4} main() { srand( (unsigned)time( NULL ) ); for(i= 0; i < 6;i++){ printf( " %d ", num[rand()%4] ); } これでrandで同じ数字をかぶらないようにするにはどううすればいいでしょうか?
4つで6回回したら必ずかぶると思うが。 実行するたびに要素減らして乱数の最大も減らしてけば?
>>23 #include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 4
int main(void) {
int a[MAX],i,pos,swp;
for(i=0; i<MAX; i++) a[i]=i+1;
srand((unsigned)time(NULL));
for(i=0; i<MAX; i++) {
pos=rand()%MAX;
swp=a[pos];
a[pos]=a[i];
a[i]=swp;
}
for(i=0; i<MAX; i++) printf("%d ",a[i]);
printf("\n");
return 0;
}
>>23 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MAX 4
int main(void){
int i, r, num[MAX];
srand(time(NULL));
for(i=0;i<MAX;i++) num[i]=i+1;
for(i=0;i<MAX;i++){
r=rand()%(MAX-i);
printf("%d\n", num[r]);
num[r]=num[MAX-i-1];
}
return 0;
}
>>25-26 ありりん^^
数字は1度ではなく何回か欲しいんです
これだと1回目が同じ数値になってしまうんですが
どこが間違っているのでしょか?
int num[]={ 2,3,9,6,92,4,27,4,6,7,1,98,7,8,1,3,0,51,35,13…}
int main()
{
int i,j;
int p=1,o,t=1;
int x[10]={0},y,s,k=0;
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10000;i++ ){
for(j= 0; j < 10;j++){
while(t==1) {
o=num[rand()%25];
for(s= j; s> 0; s--){
if(x[s]==o) k=1;
}
if(k!=1) { x[j]=o; t=0;}
k=0;
}
printf( " %d ", x[j] );
t=1;k=0;
}
printf("\n");
p++;t=0;
}
}
28 :
デフォルトの名無しさん :2007/07/10(火) 15:55:58
どうして1回目の数字が同じになるの(><; #include<stdio.h> #include<stdlib.h> #include<time.h> int num[]={ 2,3,9,6,92,4,27,24,6,17,11,98,7,8,13,23,0,51,35,1}; int main() { int i,j; int p=1,o,t=1; int x[10]={0},y,s,k=0; srand( (unsigned)time( NULL ) ); for( i = 0; i < 100;i++ ){ for(j= 0; j < 10;j++){ while(t==1) { o=num[rand()%20]; for(s= j; s> 0; s--){ if(x[s]==o) k=1; } if(k!=1) { x[j]=o; t=0;} k=0; } printf( " %d ", x[j] ); t=1;k=0; } printf("\n"); p++;t=0; } }
>>28 #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define swap(type,x,y) { type tmp=x; x=y; y=tmp; }
int num[]={ 2,3,9,6,92,4,27,24,6,17,11,98,7,8,13,23,0,51,35,1};
int num_sz=sizeof(num)/sizeof(num[0]);
int a[sizeof(num)/sizeof(num[0])];
int main(void) {
int i,j,pos;
int x[10]={0};
srand( (unsigned)time( NULL ) );
for( i = 0; i < 10; i++ ){
for(j=0; j<num_sz; j++) a[j]=num[j];
for(j=0; j<num_sz; j++) {
pos=rand()%num_sz;
swap(int,a[pos],a[j])
}
for(j= 0; j < 10;j++) {
x[j]=a[j];
printf( " %d ", x[j] );
}
printf("\n");
}
return 0;
}
>>29 すごい出来てる
ありがとございます
でもswapで一体何をしているのかが分からない(><;
2ちゃんもそろそろム板とマ板だけでも半角インデント使える用にしてくれよ
ブラウザの仕様だし。。。。どうしろと に変換?
メ欄にpreって書けばpreタグで囲ってくれるとか
専ブラが対応しなくてかえって大変になるかも
独自datパーザ入れてる専ブラなら単に <pre> ソースコードざんす </pre> って出るか、もしくは単にpreタグなんてシラネと無視されるっしょ IEのエンジン借りてる専ブラのなら問題ないっしょ
専ブラなら自前でDATを解析するもんだろ。 でないとなんのための専ブラなんだか。
<code>で囲えるようになったらいいのに
今いまんとこ書込時に空白とタブを に置き換えてくれるギコナビの機能を使っている。 よそのブラウザでも似たような機能はあるんじゃないの?
書き込みはそれでいいが問題はコピペする時
> 991 From:デフォルトの名無しさん Date:2007/07/10(火) 00:32:55 Mail:sage > すいませんマージソートの非再帰的なプログラムってどうすればいいですか? マージソートの再帰ってそんなに深くならないはずだよね? 非再帰にする必要あるのかな
必要云々より、それが課題になっているんでは?
>>40 スタックもケチりたいくらいワークエリアが狭いとか?
まあ、再帰にしなくちゃいけないほど、 非再帰にしづらいわけでもないと思うし、 どっちでもいいんじゃね?
糞スレ立てるなよ
45 :
デフォルトの名無しさん :2007/07/10(火) 22:11:19
次の説明が正しい場合は1を、間違っている場合は2を( )に記入せよ。 @( )USBは多様な周辺機器と接続できるが,転送速度が遅いのでマウスやキーボードなどには適しているが,高速を要する外付け固定ディスクなどとの接続には不適切である。 A( )PCとキーボードやマウスはPS/2やUSBポートで接続する。 B( )PS/2やUSBにはホットプラグイン機能があるので、キーボードやマウスをこれらのポート差し込んだ時点で使用可能となる。 C( )マウスにはボール式、光学式、レーザ式などがあるが、光学式が最も精度が高い。 D( )CUIの代表的な入力装置はマウス、GUIの代表的な入力装置はキーボードである。 E( )キーボードのキー構造として、メンブレン方式とパンタグラフ方式があり、ノートPCではパンタグラフ方式の採用が多い。 Bて1じゃね?
機種依存文字
>>45 >PS/2
PS/2にホットプラグイン機能はない
>>48 1)USBは・・・転送速度が遅いので・・・外付け固定ディスクなどとの接続には不適切→2
2)1
4)詳しくないが 精度低<ボール式、光学式、レーザ式>精度高→たぶん2
5)CUI−キーボード、GUI−マウス→2
6)しらない
下のは階乗を配列を用いて表示するプログラムの一部分なのですが、 int vc[200]={1}; for(j=0;j<200;j++) { vc[j]=vc[j]*i; vc[j]=vc[j]+temp; temp=vc[j]/10; vc[j]=vc[j]%10; } j=0のときは分るのですが、1からってどうなるのでしょうか?
51 :
50 :2007/07/11(水) 00:29:37
訂正 下のは階乗を配列を用いて表示するプログラムの一部分なのですが、 #include <stdio.h> int main(void) { int i,j; int temp=0; int vc[200]={1}; for(i=2;i<=100;i++) { temp=0; for(j=0;j<200;j++) { vc[j]=vc[j]*i; vc[j]=vc[j]+temp; temp=vc[j]/10; vc[j]=vc[j]%10; } j=0のときは分るのですが、1からってどうなるのでしょうか?
52 :
プロセス :2007/07/11(水) 02:31:02
いま、授業でプロセスを学んでいます。 プロセスを学んでいく中で、有名な「食事をする哲学者」の問題が出されたのですが、そこにpipeを使わなければいけないんです↓ まず問題はこうです。 ・pipeを用いて「食事をする哲学者」を具現 ・哲学者の状態変化(eating,hungry,thinking)はrandom numberを利用 ・ある哲学者がフォークを得るためには左右哲学者にrequest messageを送る ・フォークの状態変化は使用可否に依存、ただし、ある哲学者から他哲学者にフォークが転送されるときにはきれいになること(clean)を仮定 ・使われたフォークは汚くなる ・他の哲学者からフォークの要求が到着すると次のような法則 ・きれいなフォークを持ったときは渡さない ・もう使ったフォークを持ったときは渡す ・フォークが転送中にはフォークが向く哲学者に優先権がある ・フォーク及びrequest messageの転送は必ずpipeを利用 ・哲学者をあらわす5個のプロセスとは別に状態変化を観察することができるモニタープロセスを置き、状態が変わるとレポティングする。このときにもpipeを利用 ・注意、deadlockが発生しないようにする という問題なんですが・・・C言語でどう書けばいいのでしょう(泣) 助けてくださぃ!
別名「ホモのハッテン場問題」とも言う
54 :
デフォルトの名無しさん :2007/07/11(水) 02:58:55
組み込み系の問題にあるのですが、 517,120,000バイト→0.52GB, または 517,120,000/10243=0.48GB どうして、こうなるのか、ちんぷんかんぷんです。
初め何のことか分からんかったけど10243は1024の3乗のことか。 517,120,000/(1024*1024*1024)≒0.48
組み込み系だと517120000バイトを0.52GBっていう環境があんの?
だれかオレに難問をぶつけてくれーっ!
と
>>57 が申しております
※ハードディスクの容量は1Mバイト=1000Kバイトで計算しています とかじゃねーの?
>>5 俺も思った。特に
「半端な数字だけど、下位桁は0が並ぶ」ってあたり。
(んな小さいディスクもイマドキないけどもさ)
60 :
デフォルトの名無しさん :2007/07/11(水) 14:10:33
“エラトステネスのふるい”の考え方を用いて、1000以下の素数を全て表示するプログラムを作成せよ。 っていう問題なんですけど、“エラトステネスのふるい”がどんなのかはわかったのですが、 どういう式をたてれば作れるのかはいまいちわかりません。。。 わかる方おしえてくれませんか?
>>60 #include <stdio.h>
#include <math.h>
#define MAX 1000
int main(void) {
int prime[MAX],LIMIT,i,j,c;
for(i=1; i<=MAX; i+=2) prime[i]=1;
for(i=4; i<=MAX; i+=2) prime[i]=0;
LIMIT=(int)sqrt(MAX);
for(i=3; i<=LIMIT; i+=2) {
if(prime[i]==1) {
for(j=2*i; j<=MAX; j+=i)
prime[j]=0; } }
printf("%d ",2);
for(c=1,i=3; i<=MAX; i+=2) {
if(prime[i]==1) {
printf("%d ",i);
c++;
if(c==10) {
printf("\n");
c=0;
} } }
return 0;
}
63 :
デフォルトの名無しさん :2007/07/11(水) 14:23:56
>>62 間抜けどころかバカはお前じゃ、詩ねよカス。何偉そうにしてんだ、お前?
おまえ何?ここのスレの主?一番偉い人?じゃなきゃ黙って引っ込んでろや、知ったかのクズ。
弱い犬ほどよく吠えるとはよく言ったもんだw
64 :
デフォルトの名無しさん :2007/07/11(水) 14:25:43
>>62 なんだこいつ?頭おかしいんじゃね?そんなこといったら過去ログを見たら
間抜けだらけじゃん。お前が間抜けだってことに気づけよ、井の中の蛙w
67 :
デフォルトの名無しさん :2007/07/11(水) 14:32:51
>>61 ありがとうございます!
このLIMITっていうのはどんなときに使うやつなんですか?
>>67 ん〜〜細かい説明は面倒くさい。16までの素数を求める場合、16の正の平方根4*nで16以下のものを
篩い落とせば良い。nが平方根以上になっても、結局nが平方根以下までにとった値と同じになるだけだから
やるだけ無駄。
>>68 をちと訂正。面倒くせぇ〜。
2以上、16の正の平方根4以下 * nね。偶数はもう無視して奇数*nを落としているけど。
70 :
デフォルトの名無しさん :2007/07/11(水) 14:56:06
>>69 わざわざすいません。。。。
なんとなくわかりました!!!
とにかく無駄を省くためにLIMITは使ってあるってことでいいのでしょうか?汗
>>70 まぁ、そういうこと。LIMIT以上は既に篩い落とされているのが分かりきっているから無駄なんで。
>>70 あと、LIMIT以下 * n の n がとる値は、素数自身を篩い落としちゃまずいから
n は当然2以上ね。for(j=2*i; j<=MAX; j+=i) < この部分がそれに該当しているんだが・・・
73 :
デフォルトの名無しさん :2007/07/11(水) 15:43:47
>>66 >質問 = 宿題か?
>>1 >教えて欲しいのではなく丸投げしたいならこちらへ
>>66 >本当にお前日本語理解できている?
>>75 さすがにそれはお前の勘違いだ、痛すぎ。反論したつもりが自分の理解力の無さを露呈しただけ。
失せろ。ここはお前が主のスレじゃねーんだから。あぁうぜぇ。答えたくないならお前が答えるなよ。
>>75 え?お前あれが ○投げ であって 質問 じゃないとでも思ってるわけ?痛すぎ・・・バカだこいつ。
アホ○出し。お前、ほんっと日本語を理解していないだろ?っつか、日本語じゃないな。
相手を理解する能力がないだけだろ。良く言われるだろ、お前は協調性に欠けるって。
そんなんだから社会に適合せず、こんなところでも自分の勘違いをしてスレになじめないでいるんだよ。
頼むからお前が気に食わないからっていちいち間抜けとか煽ってこないでくれ。お前が間抜けじゃ。
>>60 には
> わかる方おしえてくれませんか?
って書いてあるじゃん。んで
>>1 って
> 教えて欲しいのではなく丸投げしたいならこちらへ
教えてくれませんかって書いてあって、宿題の丸投げか?まぁ、人それぞれ受け止め方が違うとは言え
さすがに決め付け過ぎだろ。落ち着けよ、間抜けな引きこもり
>>62 m9(^д^)
またこいつか。死ねよキチガイ。
81 :
デフォルトの名無しさん :2007/07/11(水) 16:47:54
#include <math.h> ってどういう意味があるんですかね?
さすがにレスソースを書いた奴にまで罵倒するなんて、痛々しい。
過去ログ読んだらほとんどの人が間抜けになるじゃんか。
だいたい、質問者を自分より劣るもんだと思って罵倒する奴はこのスレにはいらねーって。
頼むからそういう見下す奴や、自分ルールで他人を不快に思うくらいならこんなスレに来るなって。
そんなことで苛立っている自分が間抜けに思えないのか?
>>62 お前が一番恥ずかしい。
>>62 < なんだこいつ?車の運転で、自分が後ろから追突したのに、いきなり
停止するなよとかいちゃもんつけてきそうな基地外だな。前方不注意はほぼ100%
追突した側の過失だから。お前みたいな他人を邪魔者扱いする奴はここに来なくて良いよ。
はい、バイバイ。巣にお帰り。
>>81 sin()
cos()
tan()
asin()
acos()
atan()
sinh()
cosh()
tanh()
exp()
log()
log10()
pow() べき乗
sqrt() 平方根
fabs() 絶対値
fmod()
このへん使いたい時にインクルードする
86 :
デフォルトの名無しさん :2007/07/11(水) 16:55:33
>>81 は“エラトステネスのふるい”のことについて聞いた私です。
∧,, ∧ <
>>62 (`・ω・´)
U θ U
>>1 読め間抜け。
/ ̄ ̄T ̄ ̄\
|二二二二二二二|
| |
パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ
パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ パシャ
∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧ ∧_∧
( )】 ( )】 ( )】 【( ) 【( ) 【( )
/ /┘ . / /┘. / /┘ └\ \ └\ \ └\ \
ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ ノ ̄ゝ
(´-`).。oO(夏休みだなあ…)
89 :
デフォルトの名無しさん :2007/07/11(水) 16:59:20
>>84 ありがとうございます!!
sqrtをプログラムで使うには書く必要があったわけですね!
なんか初歩的なことばっかでごめんなさい。。。
>>89 エラスネロトスの篩の場合、sqrtは使わなくてもできるけどね
92 :
デフォルトの名無しさん :2007/07/11(水) 17:07:57
>>89 そうなんですか?
どうすればいいんですかね?
>>92 for(i=3; i<=LIMIT; i+=2) {
for(i=3; i*i<=MAX; i+=2) {
2を除く偶数の要素はすべて使い物にならなくてメモリーがもったいないから誰か改善して
96 :
デフォルトの名無しさん :2007/07/11(水) 17:20:26
>>93 無駄な平方根上も計算しちゃえば良いってことですね?
まだ#include <math.h>とかsqrtとか習ってないんでちょっと分からなかったんですよね。。。
>>96 いやいや、理屈からしてMAXの平方根を取らないなら、二乗した値がMAX以下ってことにすりゃ良い
速度的には、毎回演算しないですむ平方根のほうが早くなるね
前の最大値を保存しとけば、 そこまでは自乗チェック必要ないだろ。
>>99 お前さぁ、さんざん間抜けだのバカにしておいて、その程度の答か?笑える。痛々しいわ
>>99 > 前の最大値を保存
激 し く 意 味 わ か ん ね っ
>98 二乗とsqrtは単純に回数で比較できないって話が前になかったっけ?
>>100 俺は横レスだがなw
>>101 前の数でふるいに使った素数の最大値(正確にはそのインデックス)を保存しておくだろ?
次の数はそれより大きいんだから、少なくともそこまでの素数でチェックしないといけないってのは、
自乗してチェックすることなく分かる。
あとはその次の素数でふるう必要があるかどうかを調べればいいだけだから、
毎回1回の自乗チェックで済む。
32^2 = 1024 すなわち底が整数であるとわかっているからMAX 1000以下なら
for(i=3; i*i<=MAX; i+=2) < この i が33になった時点でループは止まる。
3から始まって2ずつインクリメントして33まで、i*i の回数なんて大したもんじゃない。
まぁ、数が大きくなりゃそれも増えるが、MAXの正の平方根を取るやり方で良いだろ。
さぁ、そろそろこの話はお開きにしようぜ。
>>62 がまたファビョると困るから。
>>104 横レス?モロに
>>62 だってバレてんすけど?あぁ痛々しい。自分で勝手に丸投げだと思って
>>1 にある他のスレに誘導したくせに、
>>61 のソースに対する質問に答えてやんの。白々しいぜ、こいつ。
>>104 いや、お前の理論はソースで形にして説明してくれ。多分お前の勘違い。
っつーかあのソースの仕組みが分かってないみたいだし。
>>107 素数を順番に生成していく形のプログラムにしてるのかと思ったら、
表から斜線で消していくような形のプログラムにしてたんだな。
それなら俺のやり方は無理だな。
いったい、MAXの平方根を何回計算するつもりなのかと
111 :
54 :2007/07/11(水) 20:23:35
レス、ありがとうございます。
>>55 わかりましたが
517,120,000バイト→0.52GB, どうして、こうなるのでしょうか?
112 :
54 :2007/07/11(水) 20:25:12
あと、因みに1
"0243は1024の3乗のことか。
517,120,000/(1024*1024*1024)≒0.48" は、
どうやって逆算と言うか求めたのでしょうか?
>>56 休憩欄に書いてありました・・・
1GB を 1,000,000,000 バイトとする場合もあれば 1,073,741,824(= 1,024の3乗)バイトとする場合もある。 それだけの話だ。
114 :
デフォルトの名無しさん :2007/07/11(水) 22:43:03
宿題ではないんですが、この問題がどうにも分かりません ヒントだけでももらえないでしょうか。 次のプログラムに正の整数の引数p,q(0<p≦q)を与えた時、 無限ループに入らず必ずプログラムが終了することを示しなさい #include<stdio.h> void calc(int m,int n){ int a; printf("%d/%d = ",m,n); while(n % m !=0){ a = 1 + n/m; printf("1/%d + ",a); m= m * a - n; n= n * a; } printf("1/%d\n",n/m); } int main(){ int p,q; scanf("%d %d",&p,&q); calc(p,q); return 0; }
それってCの問題っていうより数学の問題じゃね?
>114 ループ内においてm * a - n は、常にmより小さくなるので、 最終的にはn % mは必ず0になりループを抜ける。
>>115 せいぜい算術程度かなと
>>116 恐らくmが最終的に1になるんだろうと思ってたんですけど詰まって間違いかな〜と
とか考えて解き直したら解けました。
ループ後のmの値は
m'=(m-n)+m|n/m| (1)=m((1-n/m) + |n/m|)
=m(1 + |n/m| - n/m)
n>mより
0<n/m-|n/m|<1(| |はガウスの記号)
試験では(1)で詰まって後はn>mより自明って事で済ましてました。
点がもらえるか微妙・・・
ありがとうございました
C言語的には m * a - n は m - n % m って書き換えられる。 でn % m != 0 のとき 0< n % m < m だから途中で割り切れなくても最終的には1になる。
cのソースに必ず載ってるreturn(0);ってのはjavaでいうSystem.exit(0);みたいなもん?
Cには exit(0); という関数はある。 Javaもreturnはあるだろ?
>>119 Javaの「return 0;」と同じ。
なるほどthx
ファイルに 数字と文字がたくさん書かれているんだけど そのファイルから数字だけを取り出すプログラムを作りたいんだけど
1文字ずつ調べて数字だけ採用すればいい
なるほど
テキストに AAAA BBBBBB CCCCCCCC 11111111 2222222222 3333333 を作って読み込んで AAAA BBBBBB CCCCCCCC 11111111 2222222222 3333333 となるプログラムを作成せよ。
いいえ
スク水マンセー!
そのままじゃねーかw
>>126 口のききかたら偉そうだから教えてあげない。
ごめんなさい。 あまりに簡単な問題だから聞くのが恥ずかしかったんです・・・ 明日までに解決したかったんですが、あきらめます。 すみませんでした。
132 :
デフォルトの名無しさん :2007/07/13(金) 02:18:03
#include <stdio.h> #include <math.h> #define MAX 1000 int main(void) { int prime[MAX],LIMIT,i,j,c; for(i=1; i<=MAX; i+=2) prime[i]=1; for(i=4; i<=MAX; i+=2) prime[i]=0; LIMIT=(int)sqrt(MAX); for(i=3; i<=LIMIT; i+=2) { if(prime[i]==1) { for(j=2*i; j<=MAX; j+=i) prime[j]=0; } } printf("%d ",2); for(c=1,i=3; i<=MAX; i+=2) { if(prime[i]==1) { printf("%d ",i); c++; if(c==10) { printf("\n"); c=0; } } } return 0; } 上にあるこのプログラムの for(i=3; i<=LIMIT; i+=2) { if(prime[i]==1) { for(j=2*i; j<=MAX; j+=i) prime[j]=0; } } を詳しく解説してくれる方いたらお願いします。
エラトステネスのふるい でぐぐると幸せになれると思う
なんかここ数日ほどこの類の書き込みをよく見るな
135 :
デフォルトの名無しさん :2007/07/13(金) 02:29:52
なんとなくやりたいことはわかるんですけど。。。 c言語あまり詳しくないので for(j=2*i; j<=MAX; j+=i) がどういう計算をしているのかわかんないんです。。。
素数の倍数を除外してる
137 :
デフォルトの名無しさん :2007/07/13(金) 02:35:47
初めは2*2 2*3 2*4.....て計算して 次に 3*2 3*3 3*4.....て計算して 次に 5*2 5*3 5*4.....見たいな感じで計算してるんですか?
そうだね
139 :
デフォルトの名無しさん :2007/07/13(金) 02:41:15
for文の理解が出来てないのかな? for(j=2*i; j<=MAX; j+=i) の式で なんでこういう計算が出来るのかが分からないんです(泣)
140 :
デフォルトの名無しさん :2007/07/13(金) 02:44:08
ライブラリ関数を使うには ヘッダファイルをincludeするというのは分かりますが ヘッダには宣言しか書かれていませんよね。 定義はどこにあるんですか? 定義について何も書いてないのに 何故勝手に読み込んで組み込んでいるのかが分かりません
141 :
デフォルトの名無しさん :2007/07/13(金) 02:50:23
>>140 定義はすでにコンパイル済みのバイナリの中にある(.lib形式とか)。
リンク時にこいつを一緒にリンクしてる。
.dllの場合は実行時にリンクっぽいことをする。
>>141 mainの最初のwhileでオプションのパース、
次のifで引数の個数の確認っぽいこと、
最後のforで指定された各ファイルの消去、といった感じかな
143 :
デフォルトの名無しさん :2007/07/13(金) 03:49:18
>>142 勉強になりました!
ありがとうございましたm(__m
144 :
141=143 :2007/07/13(金) 03:50:30
連投すみません。 解決の有無を明確にしたほうがよいかと思いまして。 ありがとうございました!
145 :
デフォルトの名無しさん :2007/07/13(金) 16:32:41
char型のcharってcharacterの略で%nのnはnewlineの略ですよね? こういう略してある語の元の単語が載ってるサイトってないですかね? 探してもこの2つしかわからなくて
147 :
147 :2007/07/13(金) 17:17:32
5桁程度の10進数から2進数に変換するプログラム作りたいんですが、オーバーフローしてしまいます。 型を工夫するだけで解決可能ですか?それとも他の方法が必要ですか?
148 :
デフォルトの名無しさん :2007/07/13(金) 17:18:39
3桁ごとにカンマで、入力した数字の文字列をくぎるプログラムを作りたいんですけど たとえば 1234567890 のように入力すると 1,234,567,890 のように表示して 小数の場合は整数部分のみ 12345.6789 12,345.6789 このように編集する感じです。アルゴリズムをおしえてほしいです
>>145 ANSI C言語辞典買えよ
いろいろ乗ってる
>>148 forループで3文字毎にカンマぶち込むだけだろ。
小数点以下は好きなようにやれ。
いろんなやり方があるけど、練習なら、一回目スキャンして数を数えて 2回目でコピーしながらカンマを入れてみては
>>147 unsignedにすればlongでもオーバーフローしないだろ?
もったいない使い方だが
文字列に直すのにオーバーフローも糞もないだろ
10進数を0と1だけの文字列に変換するんだろ? 配列の要素数を十分に確保しとけばいいだけだよな
なんという揚げ足。
157 :
147 :2007/07/13(金) 19:01:25
unsignedでも足りず、intの配列で解決しました。
>>157 なんで5桁の10進数でそんなことになるんだ
10進化2進数にしたとか?
161 :
デフォルトの名無しさん :2007/07/13(金) 19:58:00
キーボードから2つのファイル名を入力すると2つのファイルの内容が同じか どうか調べるプログラムを作成したいんですけどアルゴリズムを教えてほしいです。 プログラムを実行すると,まず,ファイル名を2つ入力する.入力したファイ ル名のファイルの始めから終わりまでを読み出したものを比較して同じであっ たら"same",違っていた場合は"not same"と表示してプログラムを終了する. ファイルが開けない場合は、"cannot open file"と表示して終了すること
入力したファイル名のファイルの始めから終わりまでを読み出したものを比較する。
アルゴリズムと呼ぶのをはばかる程度の内容だ
164 :
161 :2007/07/13(金) 20:16:43
161です。ソースはこんな感じなんです。シンプルに一文字ずつ比較していこうと 思ったんですけどうまくいきません。もしよければアドバイスお願いします #include <stdio.h> int main(void){ FILE *fin,*fout; char sfn1[80],sfn2[80]; char c1,c2; scanf("%s",sfn1); scanf("%s",sfn2); if((fin=fopen(sfn1,"r"))==NULL || (fout=fopen(sfn2,"r"))==NULL){ printf("cannot open file\n"); return -1;} while((c1=fgetc(fin))!=EOF && (c2=fgetc(fout))!=EOF){ if(c1!=c2){ printf("ちがう\n"); break;} if((c1=fgetc(fin))==EOF && (c2=fgetc(fout))==EOF){ printf("おなじ\n"); break;}} fclose(fin); fclose(fout); return 0;}
何故whileループが2つある? 文字が一致しなかったらフラグでも立ててbreak、その後フラグを見て表示を変えればいいだけだろ 初心者ならフローチャートでも書いてからプログラム作れよ。 勘で作るからそんな意味不明なプログラムができるんだよ
166 :
161 :2007/07/13(金) 20:29:29
whileは1個ですけど…
>>165 やれやれ、説教するだけでまともに答えられない初心者か。お前みたいなのがうざいんだよ。
ほれ
>>62 とかぁ〜w
>>164 俺流でバイナリにも対応してやんよ シュッシュッ
#include <stdio.h>
#define BUF_MAX 256
int main(void){
FILE *fin,*fout;
char sfn1[80],sfn2[80];
unsigned char c1[BUF_MAX],c2[BUF_MAX];
int nc1,nc2,i,flg=1;
scanf("%s",sfn1);
scanf("%s",sfn2);
if((fin=fopen(sfn1,"rb"))==NULL || (fout=fopen(sfn2,"rb"))==NULL){
printf("cannot open file\n");
return -1;}
while( ((nc1=fread(c1,sizeof(char),BUF_MAX,fin))>0) && ((nc2=fread(c2,sizeof(char),BUF_MAX,fout))>0) ){
if(nc1==nc2) {
for(i=0; i<nc1 ; i++)
if(c1[i]!=c2[i]){
flg=0; break;} }
else { flg=0; break; } }
if(flg) printf("おなに\n");
else printf("ちがう\n");
fclose(fin);
fclose(fout);
return 0;}
あかん、よく考えたら
>>169 じゃ不十分な点があった・・・さて、どう対処しようかしらん。考え中
>>169 こうすりゃ良いかな。
while( ((nc1=fread(c1,sizeof(char),BUF_MAX,fin))>0) && ((nc2=fread(c2,sizeof(char),BUF_MAX,fout))>0) ){
while( ((nc1=fread(c1,sizeof(char),BUF_MAX,fin))>0) || ((nc2=fread(c2,sizeof(char),BUF_MAX,fout))>0) ){
>if((fin=fopen(sfn1,"rb"))==NULL || (fout=fopen(sfn2,"rb"))==NULL){ 最低最悪な変数名の例だな。
foutワロタw
>164 whileループの中でEOFの判定なんかしちゃだめだろ。
>>164 っしゃ、今度こそ。もう後はシラネッ
#include <stdio.h>
int main(void){
FILE *fp1,*fp2;
char sfn1[80],sfn2[80];
char c1,c2;
int nc1,nc2,flg=1;
scanf("%s",sfn1);
scanf("%s",sfn2);
if((fp1=fopen(sfn1,"rb"))==NULL || (fp2=fopen(sfn2,"rb"))==NULL){
printf("cannot open file\n");
return -1;}
do {
nc1=fread(&c1,1,1,fp1);
nc2=fread(&c2,1,1,fp2);
if(c1!=c2){ flg=0; break;}
}while( !(nc1==0 || nc2==0) );
if(flg) printf("おなに\n");
else printf("ちがう\n");
fclose(fp1);
fclose(fp2);
return 0;}
>>164 fgetc()の戻り値はcharではなく、intでないとだめです。というのも
charとかunsigned charでは0xFFとEOFが区別できないからです。
あとwhile()でEOF判定をしているので、ループの外では
if (c1 == EOF && c2 == EOF)
printf("same¥n");
else
printf("not same¥n");
178 :
デフォルトの名無しさん :2007/07/14(土) 01:27:34
i++と++iの違いがよくわかりません。。
気にしなくて構いません
>>178 i = 5;
printf("%d\n", i++); // 出力:5
printf("%d\n", i); // 出力:6
i = 5;
printf("%d\n", ++i); // 出力:6
printf("%d\n", i); // 出力:6
>>178 int i = 0,j = 0,n;
n = 1;
i = ++n;
n = 1;
j = n++;
printf("i = %d\n",i);
printf("j = %d\n",j);
とりあえずこんな感じで動作を比べて見るとわかりやすいと思う
実際にインクリメントされる時期の問題。 式の結果としては、前置だとインクリメント後の値になり、 後置だとインクリメント前の値になる。 #include <stdio.h> int main(void) { int i = 0; j = 0; printf("%d %d\n", i, j); printf("%d %d\n", ++i, j++); printf("%d %d\n", i, j); return 0; }
>>180 やってみました。
1
2 #include <stdio.h>
3
4 int
5 main(void)
6 {
7 int i,j;
8 i=0;
9 j=0;
10 printf("i :%d\n",i);
11 i++;
12 printf("i++:%d\n",i);
13 printf("j :%d\n",j);
14 ++j;
15 printf("++j:%d\n",j);
16 return 0;
17 }
i :0
i++:1
j :0
++j:1
うう、、どうしてでしょう。。
せっかく俺でも答えられる!と思ったのに レス早すぎ\(^0^)/
単体で++i;やi++;とやってる分には違いは無いといっていいよ もしかしたら内部的に違いがでるかもしれないが、気にしなくていいレベル
>183 その位置でインクリメントしても差は出るわけないだろ。
おまいら簡単な質問には食いつきが早いな
>>183 printf()の外でi++とかやっても…
i = 1;
n = i; // nに1が入る
i = 1;
n = i++; // nに1が入って、iは2になる
i = 1;
n = ++i; // nに2が入って、iは2になる
i = 1; i++; i = 1; ++i; この場合(単独で使った場合)は、iが2になるだけで、どちらも差がない。
人 (__) \(__)/ ウンコー! ( ・∀・ )  ̄ ̄ ̄
191 :
デフォルトの名無しさん :2007/07/14(土) 05:16:48
C言語に苦しむ初心者です。 C言語が得意な方にお聞きしたいのですが、どのような学習方法が効果的なのでしょうか。 ちなみに当方の頭の中身は基本情報処理の午前だけでも 8〜9割程度はとれるかどうかのトホホレベルです。。。
192 :
名無し :2007/07/14(土) 05:36:39
学校の課題なら先生に聞くのが一番良いぞ ちなみにここは「こども110番の家」じゃないので悪しからず
>>164 スリムにしてみたお ^ω^
#include <stdio.h>
int main(void) {
FILE *fp1,*fp2;
char sfn1[80],sfn2[80],c1,c2,flg=1;
scanf("%s",sfn1); scanf("%s",sfn2);
if((fp1=fopen(sfn1,"rb"))==NULL || (fp2=fopen(sfn2,"rb"))==NULL){
printf("cannot open file\n"); fclose(fp1); fclose(fp2);
return -1;}
while( (c1=fgetc(fp1))!=EOF && (c2=fgetc(fp2))!=EOF ) {
if(c1!=c2){ flg=0; break;} }
if(flg) printf("オナジー\n");
else printf("ちがう\n");
fclose(fp1); fclose(fp2);
return 0;}
195 :
デフォルトの名無しさん :2007/07/14(土) 10:42:21
[1] 授業単元:C言語 [2] 問題文(含コード&リンク):次のプログラムは、式を入力すると計算結果を表示するプログラムであるが、 誤っている点があります。現在の内容を理解し、誤りを訂正してコメントをつけてください。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> char *p; char c[100]; int expression(void); int term(void); int number(void); main(){ int ans; while(1){ printf("Enter expression : "); fgets(c,90,stdin); p=&c; if(*p == '\n') break; ans = expression(); printf("Answer:%d\n", ans); } } int expression(){ int ans; ans = term(); while(1){ if(*p == '+'){ ans = ans + term(); }else if(*p == '-'){ ans = ans - term(); }else break; } return(ans); } int term(){ int ans,x; ans = number(); while(1){ if(*p == '*'){ ans = ans * number(); }else if(*p == '/'){ x = number(); if(x == 0){ printf("Division by 0\n"); exit(1); } ans = ans / x; }else break; } return(ans); } int number(){ int i=0; while (isdigit(*p)){ i=i*10+(*p++)-48;} return(i); } [3] 環境 [3.1] OS: Windows [3.2] gcc 3.4 [3.3] 言語: C言語 [4] 期限: 2007/7/17 改行が多すぎて、乗せられなかったためこんな形になりますた。すみません。宜しくお願いします。
誤爆ですか
>>195 誤爆だよね?うpロダ使って出直して下さい
>>178 str[i++] = 'a';
↓
str[i] = 'a';
i += 1;
str[++i] = 'a';
↓
i += 1;
str[i] = 'a';
前に足されるか後に足されるかの違い
199 :
デフォルトの名無しさん :2007/07/14(土) 15:10:07
printf()で%3dとかやると右詰めになるのを左詰めにしたいんですが、どうしたらいいでしょうか。誰か教えてください。
-
%-3d
202 :
デフォルトの名無しさん :2007/07/14(土) 15:17:11
できました。ありがとうございます!
203 :
デフォルトの名無しさん :2007/07/14(土) 17:53:20
1, 'z'と"z"それぞれの違いと占有するメモリのサイズを教えてください。 2, char str[] = "memory"; *p = "memory" ; におけるstrとpの本質的な 違いを教えてください お願いします。
>>203 #include <stdio.h>
int main(void) {
char str[] = "memory", *p = "memory";
printf("%d %d \n",sizeof("z"),sizeof('z'));
printf("%d %d \n",sizeof(str),sizeof(p));
return 0;
}
205 :
デフォルトの名無しさん :2007/07/14(土) 18:57:50
void abc(引数){ int i.j; 処理; free(&i); free(&j); } 二次元配列に操作をする関数で、関数の終わりに不要になった 制御変数i,jをfreeしたいと思ってこのように書いたら、エラーになりました。 なぜエラーになるのか教えてほしいです。 ちなみにfreeが1つならエラーにはなりませんでした。 私のイメージでは単に&iでiのポインタを渡したらそこの分だけfreeしてくれる と思ってたのですが、もしかするといっぺんにfreeしてしまうのでしょうか。 あともしかして、再帰的でなければこのようなfreeは不要ですか? よろしくお願いします。
free()はmalloc()で割り当てたメモリを解放するのに使うんだから、 ローカル変数のポインタなんて渡しちゃダメ。 この場合はfreeなんて必要ない。
>>205 さすがに変数に使うメモリ空間は自動的に管理してくれるよ^^;
210 :
デフォルトの名無しさん :2007/07/15(日) 01:06:41
>>206 ありがとうございます。
もし、
void abc(引数){
int i.j;
処理;
abc(引数);
後続処理;
}
のような場合で、後続処理にi,jが不要で再起前に開放したいと思ったら
i,jをmallocで確保するしかないということでしょうか?
またローカル変数のポインタを渡してはならないとありますが、
int iにおける&iをローカル変数のポインタとすると、
int *iにおけるiは、なんという名称になるのでしょうか?
>>208 ありがとうございます。
変数に使うメモリ空間は自動的に管理してくれるとありますが、
ということはfreeは変数以外に用いるということでしょうか?
よろしくお願いします。
どういう順番でCを勉強したら210みたいな意味不明な思い込みをするようになるんだろう。
具体的な指摘を
>>210 int *iにおけるiはローカル変数かつint型のポインタ変数
ポインタとポインタ変数を混同しているな。
アドレスとポインタ変数に言い換えた方がわかりやすいかもな。
あとヒープとスタックについて調べてみな。
>>210 i, jが関数の途中で不要になるから解放したいなんてことは
C言語の常識ではやらないし、考える必要もないよ。
関数終了時に勝手に消えてくれるんだから。
解放を考える必要があるのはmallocつかったときだけ。
まあ、i,jが超でかい構造体で、再帰するたびにメモリ(スタック)使いまくるなら、 mallocで確保してfreeするのもありかも知れないが、 i,jがint程度ならそんなことを心配するのは無駄だよ。
再帰呼んだ後に開放しても、再帰から帰ってくるまで開放されないから意味ないけどな
末尾再起ならループに書き換える事も考えてみる。
そんなことはコンパイラに任せる
でもやってくれないコンパイラ案外多いよ…
mallocとfreeの話題がでたので質問します。 自分はvalgrindでプログラム終了時のmallocとfreeの数を一致させようといつも非常に苦労するのですが 皆さんはこれどうしてますか?リークを0にするための工夫とかコツとかあったら是非ご教示下さい。
プログラム終了時は全確保メモリが開放されるのに、何をこだわってるの?
そりゃ実行中に容量一杯になったら困るからじゃん。
意味わからん
>>221 の作ったプログラムはリークしまくりで怖そう・・・。
>>220 メモリの確保/開放が必要な処理は必ず部品化しておく。
>>220 基本的にmallocを呼び出した関数でfreeする
それが出来ない場合には、malloc、freeをラップした関数を作って
新たに作成したそれぞれの関数を同じ関数内で呼び出すようにする
※但し、あくまで原則。ソースコードがややこしくならない範囲で。
>>221 こんな奴のプログラムはまともに動かないと相場が決まってる
>>221 こいつはひでぇ。こいつの作ったプログラムだけは使いたくない
さすが日曜日だね exit前のfree論争とその本質すら知らないコドモばっか
お前ら何十回このスレでmalloc-free論争ループさせんだよw
俺はセクロス前にシャワーを浴びる派
とりあえず、More Effective C++には newとdeleteと回数が一致しない、「メモリプール」というやり方について書かれているよ。 読んだことがない人ばかりみたいだけど。
233 :
本日の最高のお馬鹿さん :2007/07/15(日) 10:33:25
221 名前:デフォルトの名無しさん 投稿日:2007/07/15(日) 10:04:22 プログラム終了時は全確保メモリが開放されるのに、何をこだわってるの?
>>232 それは、言わば応用。
確保して解放するという
基本をないがしろにしてよいものではない。
パソコンの電源を切れば全確保メモリが開放されるのに、何をこだわってるの?
なんか、他人には見えないものが見えている人がいるみたい。 どの書き込みを書いたのが誰なのか、とか 自分の意見と違う書き込みをするのは一人に違いない、とか。
238 :
なんかこいつ妄想はじめたみたいだぞ? :2007/07/15(日) 10:46:10
237 名前:デフォルトの名無しさん 投稿日:2007/07/15(日) 10:42:25 なんか、他人には見えないものが見えている人がいるみたい。 どの書き込みを書いたのが誰なのか、とか 自分の意見と違う書き込みをするのは一人に違いない、とか。
239 :
220 :2007/07/15(日) 10:46:43
沢山のレスどうもありがとうございました。
私も
>>226 みたいにやりたいのですがそうも出来ないことも多いですよね。
OSSでもvalgrindした結果(malloc - free)が0にならないものが非常に多いので少し疑問になりましたので
聞いてみました。これからもできるかぎり拘っていきたいと思います。
>>230 自分は新参だから見たことない
その論争見たい
>>239 誰もわかる人が居ないから参考になるレスが無くてすまんね
良いから知ったかの本当のボケた子供は放置しろって。日曜日だとか
日ごろ自分が来ていないのを理由に、自分が理解されないことを
周りが子供だとか言い出すアホは放置しとけ。
>>221 で最高にアホだと判明してんだからw
自分で以前考えたのが、mallocとfreeのラッパーを作って mallocのラッパの中からはポインタの位置と確保したサイズをまとめてリストに足していき、 freeのラッパの中からはそのリストから直前にfreeしたエントリを削除していく、 んで最後にはmallocされてfreeされてないエントリだけが残るから そのエントリが持ってるポインタ位置を片っ端からprintfみたいな表示関数にかけると どんなデータをmallocしたのがfreeされてないかわかるから良いかな みたいなことを考えたのですがreallocとかあるとちょっとメンドイしな。。。
>>243 Javaとかで使われるGCのアルゴリズムを勉強すればいいかもしらん
いや自分は知らないけどなんとなくそう思った
一言居士がうざいっすよ。お前の個人的な意見なんて要らないって
自己紹介乙
>>243 こんな感じで作れるよ
#ifdef MEMDEBUG
#define malloc(size) memdebug_malloc(__FILE__, __FUNCTION__, __LINE__, size)
#define calloc(size) memdebug_calloc(__FILE__, __FUNCTION__, __LINE__, size)
#define realloc(ptr, size) memdebug_realloc(__FILE__, __FUNCTION__, __LINE__, ptr, size)
#define strdup(ptr) memdebug_strdup(__FILE__, __FUNCTION__, __LINE__, ptr)
#define free(ptr) memdebug_free(__FILE__, __FUNCTION__, __LINE__, ptr)
#define malloc_chk() memdebug_check()
#else
#define malloc_chk()
#endif
>>247 ありがとうございます。
__FUNCTION__とか__LINE__はあると助かりますね。
それについて延々とやってたのは2chじゃないよ。
2chでも、何度か見たことあるよ。
いや、fjではそれこそ何ヶ月も、飽きもせずやってたらしいよ。
まあC言語の話題を扱う場所なら必ずでてくる話題ですよね。。。 #define myfree(p) do {free((p)); (p) = NULL;} while(0) freeの後のNULLの件に関しては皆さんこんなことしてます?
>>255 「site:2ch.net free malloc 必要」でググってみるとか。
それでどうなのよ malloc-free論争とやらが出た瞬間にコジコジを消沈させるような 完璧な答えのテンプレを作ってくれよ
変数をしっかり管理できないプログラマなんて嫌だな。
>>256 NULLじゃなくて、0xcc…とか入れたほうがいいよ。
そうだな 早く俺を黙らせてくれよ
また変なこだわりを持つものが湧いたな
○○したほうがいい って書くなら根拠も書いてよいじわるー!
>>258 基本的にはみんなmallocしたものはfreeしなければダメと思ってるんじゃない?
Java儲/スクリプト儲には縁のない、面倒臭いけどC厨のこだわりどころだよな。
>>263 苦労するくらいならとっととこの世から去った方が良いよ 理由:どうせいつかは死ぬんだし
インデントはした方がいいかってレベルの話じゃない?
基本的にはみんなmallocしたものはfreeしなければダメだよ
でも働いて税金を納める、支える立場の内は頑張ってね! ※役人の考え方ってこうなのかな?
>>266 まぁ、その辺は個人的なスタイルにもなってくるんで、主観でどうこう話が進むと
結局インデントせんでもソースはコンパイルされるからとか泥沼な議論になるんだよね・・・
それについては見易さを考慮したら、した方が良いとは俺は思うけどね。
まぁ、インデントはエディタ任せだがw
あたしおんなだけどソースコードがドキュメントなのできれいに書いたほうが良いと思う!
インデントはしなきゃだめだろ。
>>271 だから ダメ とかそういうことを言うなってw 何で?って突っ込まれたとき
そうでなきゃダメだという理由が思い浮かばないだろ?人生経験の浅い人間の
洗脳された教育による思い込み程、当てにならない意見はない。
もっと物事の本質を理解する頭を持って、これはこうしなきゃダメという先入観は捨てな。
答え方としては、した方が良い程度。それは人間がパッと見て見やすいかどうかって
話にもなるが、俺はそんなのみやすいとは思わないという屁理屈野郎が来たら
主観的な意見同士のぶつかりあいにしかならないんだよ。
>>271 みたいなレスを見るとイラッとくるんだよな
まったくの情報量ゼロ
むしろ雑音でしかない
つまり結局はインデントはしなきゃダメって事か
>>272 いちいち、なんでインデントが必要かとかって質問にまじめに答える必要ないよ。
みんな知ってるし。
よーしパパCと完全互換のCython作っちゃうぞー
パイソンみたいにガチガチに縛るの嫌だ。 C信者ならLimboだな
インデントが必要かどうかレベルの議論で粘着して、グタグタになったら、 「これは宗教論争、どっちでもいい」みたいに持っていくやついるだろ。 そういうのに付き合いたくないってのもあるな > いちいち理由を言わない
ツールでも使って好きに整形しろよとしか
インデント不要派の人って居る?
好きにしろよ と言う奴ほど、実は一番こだわりを持ってて 「お前のインデントは汚い」とかを一番文句言う
>>281 だったら普通は言わないだろ。インデントをするしないを好きにするのか、どういうインデントをするのか
で話が食い違っているならまだしも、好きにしろって言うくらいなら好きにやれってことでしょ。
「好きにしていい、って言われたから」とか言ってわざとインデントして書いたもののインデントを 全部消して、最低限必要な改行(プリプロセッサコマンドとか)、ホワイトスペースとかコメント 全部消して来る人とかいそうですよね。 そのためのスクリプトとかも用意してたり。最初のinclude、defineの連続の後は全部一行とか。
#include <stdio.h> int (main) void { int x; char buf[32]; printf(""); return 1; } こんなことしてたらやめろって言われるだろ。
285 :
デフォルトの名無しさん :2007/07/15(日) 13:49:19
Z80アセンブラでいう"OUT"のようなことをしたいんですが, C言語でI/Oを操作するにはどのようにしたらいいですか?
#include <stdio.h> int (main) void {int x;char buf[32];printf("");return 1;}
>>285 アセンブラで"OUT"を行う関数を書いてその関数をCから呼ぶ。
ぶっちゃけ、手短に済むなら改行なしでも俺はおkとする。下手に改行して長くなるよりも この1行はどういう単純な処理をするのかとはっきり分るならね。
289 :
285 :2007/07/15(日) 14:19:09
>>287 すばやい回答ありがとうございます。
アセンブラで関数を書くというのが想像できないんですが、
それは純粋なC言語だけでできるんですか?
それとも独自の拡張が必要なんですか?
例えばポインタを使えばメモリの操作は可能ですが、
非メモリマップドI/Oの操作はC言語ではできないんですか?
Cにはインラインアセンブラというのがあって関数内にアセンブラを書ける つうかIO操作用のAPIが(たぶんC言語から呼び出せる)提供されてるだろ普通
292 :
デフォルトの名無しさん :2007/07/15(日) 14:38:21
アセンブラとC言語を交ぜるのはよくない アセンブラかC言語かどっちかにしろ ライブラリとして部分的に作成したものを呼び出すのは可 たとえばprintfなどだ これはC言語だけの機能では作れない
そうでもない
インラインアセンブラってCの規格で規定されてたのか? 俺はてっきりコンパイラの機能の一部だと思ってたが。
296 :
デフォルトの名無しさん :2007/07/15(日) 14:54:17
#include <stdio.h> #define n 5 int min_of(const int vc[], int no) { int i; int min = vc[0]; for (i = 1; i< no; i++) if (vc[i] < min) min = vc[i]; return (min); } int main(void) { int i; int min; int vc[n]; printf("%d個の要素を入力してください:\n",n); for (i = 0; i < n; i++) scanf("%d",&vc[i]); min = min_of(vc,n); printf("最小値=%d\n",min); return 0; } 一応完成したと思うのですが、これは配列をうまく使えてますか? 配列というのがよくわからないんです。 配列で最初に何個か決めて書くのと、普通にscanfで入力していく違いがわかりません。 もう自分が何を言いたいのかもよくわかりません
とりあえずreturnに()は要らない。
defineを変数のように使うのもあまりよくないね
#defineで小文字しかも一文字は止めたほうが良い 関数のプロトタイプを書いたほうが良い
300 :
デフォルトの名無しさん :2007/07/15(日) 15:12:28
そもそもこの場合defineって必要なんですか? printf("%d個の要素を入力してください:\n",n); for (i = 0; i < n; i++) scanf("%d",&vc[i]); min = min_of(vc,n); このnの部分を5に変えれば済みますよね?
5を別の値に変えるとき面倒
302 :
デフォルトの名無しさん :2007/07/15(日) 15:19:55
それはたくさんnを使う場合の話ですか? defineだと要素を何個にするか実行した人に選ばせることはできませんよね。
仕様が変わった場合、あとから変更するには楽でしょ
コンパイル時に要素数が決まってしまうのは配列の欠点。 それに対処する方法は勉強を続けていればその内出てくる。 新しい概念が必要なのですぐには出てこないかもしれないけど。
305 :
デフォルトの名無しさん :2007/07/15(日) 15:58:48
つまり僕のレベルでは配列の良さはまだわからなくていいってことですよね。 ありがとうございました
306 :
デフォルトの名無しさん :2007/07/15(日) 16:27:11
#include <stdio.h> void rev_intary(int vc[],int no) { int i; for (i = no; i > 0; i--) return vc[i]; } int main(void) { int i; int vc[5]; int rev; printf("数字を入力してください\n"); for (i = 0; i < 5; i++) scanf("%d",vc[i]); rev = rev_intary(vc[i],5); for (i = 0; i < 5; i++) printf("%d",rev); return 0; } 並びを逆順にするプログラムです。なんかいろいろ違います。
307 :
デフォルトの名無しさん :2007/07/15(日) 16:32:42
scanfに&がついてないのは気にしないで考えてください。 お願いします
どっから突っ込めばいいのか分らんほどだ
>>306 これが欲しいの?
#include <stdio.h>
int main(void)
{
int i,vc[5];
printf("数字を入力してください\n");
for (i = 0; i < 5; i++)
scanf("%d",&vc[i]);
for (i = 0; i < 5; i++)
printf("%d",vc[4-i]);
return 0;
}
310 :
デフォルトの名無しさん :2007/07/15(日) 16:52:37
いえ、並びを逆順にする関数を作らないといけないんです。 さっきのはもうなんかいいです。忘れてください。
void rev_intary(int vc[], int no) { int i; for(i=0; i< no / 2; i++) { int temp = vc[i]; vc[i] = vc[no-1-i]; vc[no-1-i] = temp; } }
312 :
デフォルトの名無しさん :2007/07/15(日) 16:57:17
ごめんなさい理解できません。 たぶんそんなに複雑じゃないと思います。 それが複雑なのかどうかすらわかりませんけど…。
>>312 配列覚えなおした方がいいと思う。
はっきり言ってこれ基礎の中の基礎。
>>312 じゃあまず関数を作らず、main()内だけでやってみな
315 :
デフォルトの名無しさん :2007/07/15(日) 17:06:02
main内だけでやると
>>309 みたいになります。
それはできるんです。
つまり関数に変数をどうやって渡すかがわからんって事?
>>311 の通りなわけだけど。
いやvc[4-i]で表示だけ後ろからするんじゃなくて、 配列の中身の入れ替えをmain内でやってみなってことだろ
318 :
デフォルトの名無しさん :2007/07/15(日) 17:13:30
C言語を学ぼうと「やさしいC」という本で勉強しようと思うのですが プログラムをコンパイル>実行するツールの設定でつまずいています。 ツールはLSI C-86 Ver.3.30c試食版です。 _LCC,ユーザ環境変数の変更とコマンドプロンプト上でのディレクトリの移動 まではやったのですが、lccと入力すると C:\sample>lcc sample1 C:\sample> というようになってうまく設定できていません、マニュアルも読んでみたのですが どこがおかしいのか理解できませんでした、どなたか解決法わかる方いましたら お願いします
319 :
デフォルトの名無しさん :2007/07/15(日) 18:04:03
>>318 初心者はBCC developerつかっとけ
lccなんてはじめて聞いた。 カンだけど何も表示が無いってことはエラー報告がない=成功、なんじゃないの。 同じフォルダにバイナリ出てないか確かめた?
>>318 俺も初めlcc入れたんだけどうまくいかないからbccにしたよ
322 :
デフォルトの名無しさん :2007/07/15(日) 18:23:24
実行すると.exeが作られるというのは書いてあるのですが 作成されてません、ユーザ環境変数のところも同じ設定でやってみて実行してみたところ lccには反応するようになったのですが、ファイルが見つかりませんみたいな表示がでてます。 とりあえずC言語の実行確認できるツールさえあればいいのでBCC developerを調べてみます
323 :
デフォルトの名無しさん :2007/07/15(日) 18:24:41
VC++2005とかVC++6.0とかLCCとかBCCとかいろいろとあるが BCC developerが初心者最強 まずコンパイルが軽い、統合環境がマイクロソフトより断然軽い LCCと違いメモリ制限などの標準でない制限やエラーが少ない
初心者ならBCC Developerよりbcpadとかの方が勉強しやすいだろ
ごめん勉強しやすいは嘘だわ 勉強するまでの敷居が低い
LSI C-86 をコンパイラとして選んでる時点で、その本は時代遅れか糞本だと思うが。
質問なんですが先にソースを張りますね。 #include <stdio.h> void mat_add(const int ma[2][3],const int mb[2][3],int mc[2][3]){ int i,j; for(i=0; i<2; i++){ for(j=0; j<3; j++){ mc[i][j] = ma[i][j] + mb[i][j]; } } } int main(void){ int i,j; int ma[2][3] = { {{1,2,3},{4,5,6}} }; int mb[2][3] = { {{7,8,9},{10,11,12}} }; int mc[2][3] = { 0 }; mat_add(ma,mb,mc); for(i=0; i<2; i++){ for(j=0; j<3; j++){ printf("%3d",mc[i][j]); } puts(""); } }
mcなんですが、別の関数でmcの計算をさせているのにmainの方の関数のmc にもその結果が反映されています。なんで???
はあ?
LSICのBINをカレントディレクトリにした状態でコンパイルすればとりあえず問題ないだろう 多分環境変数を入力し間違えてるだけだと思うけど
>>327 それってコンパイルできた?
中括弧がやたら多いような気がするんだが
>>328 人のソースでもパクったのか?
じゃなきゃそんな疑問でないと思うが
ポインタは理解してたつもりなんですが、??のところがわかりません int x[3]; // int型が3つの配列 int *x[3]; // int型へのポインタが3つの配列 int (*x)[3]; // ?? int *(*x)[3]; // ??
334 :
328 :2007/07/15(日) 19:30:02
参考書のソースを移してそのままコピった。移した後疑問だったので質問した。 mcのスコープ離れて、mat_addで値を引数として渡して計算させています。 mat_addにreturn文がないのにmainの方のmcの参照で計算結果が反映されています。 それが疑問なんです。
×値を引数として渡して ○アドレスを引数として渡して
>>334 こんな事いったら規格厨からメチャクチャ文句言われそうだけど
配列とポインタは一緒。関数に渡してるのは値ではなくポインタ。
337 :
デフォルトの名無しさん :2007/07/15(日) 19:46:25
ttp://homepage2.nifty.com/natupaji/DxLib/dxuse_bcc.html ←ここを参考に
BCC Developerを設定してみたんですが
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 )
{
return -1 ;
}
DrawPixel( 320 , 240 , 0xffff ) ;
WaitKey() ;
DxLib_End() ;
return 0 ;
}
を実行する部分で
エラー E2209 C:\Documents and Settings\****\My Documents\test\DrawPixel.cpp 1: インクルードファイル 'DxLib.h' をオープンできない
エラー E2141 C:\Documents and Settings\****\My Documents\test\DrawPixel.cpp 2: 宣言の構文エラー
というエラーがでてコンパイルできません。
DXライブラリはインストールして作成したTESTフォルダに「プロジェクトに追加すべきファイル_BCC用」
もコピーしました、このエラーを直すにはどうしたらいいでしょうか。
後自分はC言語はポインタ、クイックソート理解できる程度なんですが
このツールを使って#include<stdio.h>などのヘッダファイルは使えるのでしょうか
大学で使っている秀丸と同じ環境でやりたいと思うので、そこのあたりも詳しい方がいらしたら
よろしくお願いします。
>>333 int (*x)[3]; // int [3]へのポインタ
int *(*x)[3]; // int *[3]へのポインタ
int (*x)[3];
int *(*x2)[3];
int arr[3] = {1, 2, 3};
int *arr2[3] = {&arr[0], &arr[1], &arr[2]};
x = &arr;
x2 = &arr2;
って感じ。
つか、こんなの使ったことないし、コードを理解し難いだけじゃね?
関数の引数としてよく使っているはず
340 :
333 :2007/07/15(日) 19:52:36
ちょっと考えたら解決しますた int x[3]; // int型が3つの配列 (sizeof(x) == sizeof(int)*3) int *x[3]; // int型へのポインタが3つの配列 (sizeof(x) == sizeof(void*)*3) int (*x)[3]; // int型が3つの配列へのポインタ (sizeof(x) == sizeof(void*)) int *(*x)[3]; // int型へのポインタが3つの配列へのポインタ (sizeof(x) == sizeof(void*))
341 :
328 :2007/07/15(日) 19:53:45
ありがとうございました。プログラムの基礎はjavaで確立したはずなんですが・・・orz とりあえずこの疑問は留めておいてポインタとやらが出るところまでCを進めてみようと思います。
342 :
333 :2007/07/15(日) 19:55:08
ちなみに、sizeof(void*) == sizeof(int*)とは限らんよ。
344 :
デフォルトの名無しさん :2007/07/15(日) 19:55:59
>>337 これが動くかやってみてください 拡張子は.cppにした方がいいです
#include<stdio.h>
main(){
printf("\n\nHello world.\n\n");
}
345 :
デフォルトの名無しさん :2007/07/15(日) 19:57:24
>>337 あと作業領域は、C:\bccとか空白が入らないところにしてください
ポインタはJavaの参照みたいなもん 違いはポインタに対して演算ができること
次はポインタはメモリアドレスか否か論争かな
348 :
デフォルトの名無しさん :2007/07/15(日) 20:02:25
エラー E2209 C:\Documents and Settings\****\My Documents\test\DrawPixel.cpp 1: インクルードファイル 'stdio.h' をオープンできない エラー E2268 C:\Documents and Settings\****\My Documents\test\DrawPixel.cpp 3: 未定義の関数 'printf' を呼び出した(関数 main() ) と出ました。 拡張子はどこのものを変えればいいでしょうか
349 :
デフォルトの名無しさん :2007/07/15(日) 20:09:03
350 :
デフォルトの名無しさん :2007/07/15(日) 20:10:30
>>348 ファイル新規作成、プロジェクトを選ぶときに、新規に作業ディレクトリを作成して
そこを選ぶといいです
351 :
350 :2007/07/15(日) 20:11:38
エクスプローラで、例えばc:\bccというフォルダを作成してから選びます
352 :
デフォルトの名無しさん :2007/07/15(日) 20:28:27
> c:\borland\bcc55\Bin\make.exe -fDebug\TEST.mak -B TARGET MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug -c C:\TEST\DrawPixel.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland C:\TEST\DrawPixel.cpp: bcc32 -W -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -eDebug\TEST.exe Debug\DrawPixel.obj Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照) と出ました、ディレクトリを変更してc:\の中にしました。 インストールするときにメモ帳で作る設定ファイルを作成しているようだったので ファイル>新規作成からの設定を行って実行しました。 実行プログラムは先ほどの#include<stdio.h>を使用しています。 エラーの時に出力されているC0W32.OBJ を見てみましたが文字化けしていてよく分かりません
353 :
デフォルトの名無しさん :2007/07/15(日) 20:33:05
344は動いたのかどうか???
354 :
デフォルトの名無しさん :2007/07/15(日) 20:34:28
あと 'WinMain' が未解決というエラーはプロジェクト設定で windowsアプリケーション(-W)を選ぶと動くかもしれないです
選んじゃ駄目だろ
356 :
デフォルトの名無しさん :2007/07/15(日) 20:48:26
プロジェクト設定で「現在のプロジェクト構成」の部分にDebug,Releaseの二種類があり DebugのみWindowsアプリケーション(-w)にチェックを入れています。 実行ファイル名:TEST.exe 名句ファイル名:TEST.mak です、チェックを初期のコンソールアプリケーション(-wc)と入れ替えて4通り試してみましたが 同様のエラーがでました。 344のプログラムを実行すると Error: 外部シンボル 'WinMain' が未解決(C:\BORLAND\BCC55\LIB\C0W32.OBJ が参照) というようなエラーがでてコンパイルできません。 入力ミスなどないように何回かは見直しているのでマニュアルどうりにはできていると思います。 なるべく状況報告するのでよろしくお願いします
357 :
デフォルトの名無しさん :2007/07/15(日) 20:55:57
349は使いましたか? あと #include<stdio.h> main(){ printf("\n\nHello world.\n\n"); } 以外には画面に書き込まず、 コンソールアプリケーションでコンパイル出来ますか??
手取り足取り教えるつもりならメールでやりとりでもすれ
359 :
デフォルトの名無しさん :2007/07/15(日) 20:58:26
「Dxlib_BCCのプロジェクトに追加すべきファイル_BCC用」を作業ディレクトリから 除いたら実行できるようになりました、このファイルはヘッダファイルなどの設定が 書いてあるものと認識していたのですが、使わなくてもC言語の実行は問題なく行えるでしょうか?
360 :
デフォルトの名無しさん :2007/07/15(日) 21:05:38
>>359 それはいりません
特殊なプログラム(3D画像など)を容易にするために必要なものです
361 :
デフォルトの名無しさん :2007/07/15(日) 21:12:44
for(i=0; N; i++){ ・・・ } このときの繰り返し条件Nってどういう意味になりますか? for(i=0;i<10; i++){ ・・・ } こういうときは、iが10になったらループを抜けるのは分かるんですけど・・・ 物凄く初心者レベルの質問ですみません。どなたか回答お願いします。
362 :
デフォルトの名無しさん :2007/07/15(日) 21:12:56
他のプログラムも何個か試してみましたが上手くいきました。 作業など遅かったのに親切な説明ありがとうございました。 とても助かりました。
Nが定数なら多分中の処理でif文と組み合わせてbreakでループから脱出するようになってるか もしくはNが変数なら中の処理でNの値を書き換えるようになってるはず
365 :
363 :2007/07/15(日) 21:20:36
>>361 ダメだ.回答になってないか
・Nが定数で
Nが0だったら一度も実行されない
Nが0以外だったら無限ループ
break; 文で抜けるなどする
・Nが変数で
Nが0以外である間ループは実行され続ける
Nが0に変更されたら終了
366 :
328 :2007/07/15(日) 21:25:07
>>361 for(){ }括弧内の処理が終了するたびにNが1づつインクリメントしていって
そのN < 10(つまりはnが10)(cでいう
>>363 )になったら繰り返し終了
>>366 いやいや、N<10 じゃないから
N だけだから条件は
368 :
328 :2007/07/15(日) 21:30:59
すまん、わかんね( TДT)
369 :
デフォルトの名無しさん :2007/07/15(日) 21:35:38
>>365 ありがとうございます。ここで詰まってたんで助かりました
次の初期化ルーチンの不備を指摘せよ.また,このまま使用するとどういうエラーが生じる可能性があるか述べよ. int i, a[100]; for (i = 1; i <= 100; i++) a[i] = i; よくわかりません。また初期化と初期化ルーチンの違いを教えてくれませんか。 お願いします
次の初期化ルーチンの不備を指摘せよ.また,このまま使用するとどういうエラーが生じる可能性があるか述べよ. int i, a[100]; for (i = 1; i <= 100; i++) a[i] = i; よくわかりません。また初期化と初期化ルーチンの違いを教えてくれませんか。 お願いします
372 :
デフォルトの名無しさん :2007/07/15(日) 22:37:28
a[100]は確保してない 0から99までだ for (i = 0; i < 100; i++) にしろ
int i=10; ← 初期化 for (i = 1; i <= 100; i++) a[i] = i; ←初期化ルーチン
>>372 わかりました。ありがとうございます。
>>373 ,374
つまり初期化ルーチンとは一連の流れで初期化を行うことですか。
377 :
210 :2007/07/15(日) 23:13:51
遅くなりましたがありがとうございます。 ポインタ変数で宣言しないと領域を開放できないのは不便ですね。
意味不明です
>>377 ひとつの関数の中で、開放が必要なほどたくさんローカル変数を使うことって普通はないからね。
>>377 >ポインタ変数で宣言しないと領域を開放できないのは不便ですね。
ローカル変数はスコープを抜けると勝手に開放される。
自分で開放いちいちしなければならないほうが不便だ。
いずれC#とかJavaを使ってみればわかるだろう。
381 :
デフォルトの名無しさん :2007/07/16(月) 00:13:04
int func(int N, int n) { int i; for(i=0; N; i++) N /= n; return i; } すみません。さきほども質問したものですが、これはユーザ定義関数の一部なんですが、 N=1000、n=5とするとreturn i でのiの戻り値はいくらになりますか?
>>381 int型の変数に入れてるんじゃ整数で0〜199
>>381 違った。iじゃなくてN/=n;か・・・それじゃ200
384 :
285 :2007/07/16(月) 00:22:14
遅くなりましたが,みなさんありがとうございました.
385 :
デフォルトの名無しさん :2007/07/16(月) 00:36:34
>>383 200ですか?1000を5で割り続けると思ったんですけど。
>>385 うんにゃ、5だった。なんか勘違いしとった。
388 :
デフォルトの名無しさん :2007/07/16(月) 00:45:26
#include <stdio.h> int main( void ) { int a=0,b=0,c=0; for( a=1;a<=100; a++) { for( b=1; b<=100; b++) { for( c=1; c<=100; c++) { if(a*a+b*b==c*c) if(a>=b) { printf("(%d,%d,%d)だよん\n",a,b,c); } } } } printf("\n"); return 0; } これはabcの組み合わせを表示するプログラムなんですが、 これに組み合わせの総数を表示するプログラムを付け加えたいのですが どうやればいいのか分かりません。 わかる方居たら教えてください。
>>381 for(i=0; N; i++){
N /= n;
return i;
}
なら0じゃないの?
for(i=0; N; i++){
N /= n;
}
return i;
なら4かな?
0 1000
1 200
2 40
3 8
4 1
>>381 #include <stdio.h>
int func(int N, int n)
{
int i;
for(i=0; N; i++)
N /= n;
}
return i;
}
int main(void) {
printf("%d ",func(1000,5));
return 0;
}
>>390 あかん、}が1つ余計だった
N /= n;
} <これ消して
392 :
デフォルトの名無しさん :2007/07/16(月) 00:53:53
>>389 すみません。
for(i=0; N; i++){
N /= n;
}
return i;
でした。4ですか。4か5で迷ったんですけど、5回割ると0になるんで、5かと思ってました
>>392 いや5だって。実行して確認しろよ・・・
#include <stdio.h>
int func(int N, int n) {
int i;
for(i=0; N; i++)
N /= n;
return i;
}
int main(void) {
printf("%d ",func(1000,5));
return 0;
}
394 :
デフォルトの名無しさん :2007/07/16(月) 01:02:00
>>393 すいません。家だと実行できない環境だったんで。
学校の課題を家で考えていたんで。
みなさん丁寧に教えてくれてありがとう!凄い助かりました。
整数Nがn進数で何桁になるか求める関数ってとこか
実行環境がVBしかなかったから ためしに同じようにかいたら 1001が返ってきた Dim N As Integer = 1000 Dim nn As Integer = 5 Dim i As Integer = 0 Dim ret As Integer = 0 For i = 0 To N N /= nn Next ret = i
>>396 0から1000までの1001回ループするんじゃないよ
Nが0でない間ループする
398 :
デフォルトの名無しさん :2007/07/16(月) 03:04:57
#include <stdio.h> #include <math.h> #define MAX 1000 int main(void) { int prime[MAX],LIMIT,i,j,c; for(i=1; i<=MAX; i+=2) prime[i]=1; for(i=4; i<=MAX; i+=2) prime[i]=0; LIMIT=(int)sqrt(MAX); for(i=3; i<=LIMIT; i+=2) { if(prime[i]==1) { for(j=2*i; j<=MAX; j+=i) prime[j]=0; } } printf("%d ",2); for(c=1,i=3; i<=MAX; i+=2) { if(prime[i]==1) { printf("%d ",i); c++; if(c==10) { printf("\n"); c=0; } } } return 0; }
399 :
デフォルトの名無しさん :2007/07/16(月) 03:05:58
上にあるこのプログラムの for(i=3; i<=LIMIT; i+=2) { if(prime[i]==1) { for(j=2*i; j<=MAX; j+=i) prime[j]=0; } } の for(j=2*i; j<=MAX; j+=i) は、初めは2*2 2*3 2*4.....て計算して 次に 3*2 3*3 3*4.....て計算して 次に 5*2 5*3 5*4.....見たいな感じで計算してるんですよね? for(j=2*i; j<=MAX; j+=i) の式で なんでこういう計算が出来るのかが分からないんです。 j=2*iの2の部分は一度計算すると3になるんですか? j+=iって言うのはjがiずつ増えるって意味ですよね? それはどういうことなんですか? 何度も同じ質問ごめんなさい。
小学生からやり直した方がいいんじゃね?
401 :
399 :2007/07/16(月) 03:10:54
そうですよね。。。 理解すれば何でこんなことわかんないんだろっって感じなんでしょうけど。。。 頭が混乱しちゃってww
iが3のとき j = 3*2 j = 3*2 + 3 = 3*3 j = 3*3 + 3 = 3*4 j = 3*4 + 3 = 3*5 というように増えてく。
403 :
399 :2007/07/16(月) 03:18:53
うお!!! が5のとき j = 5*2 j = 5*2 + 5 = 5*3 j = 5*3 + 5 = 5*4 ってことか!!! 足し算をすることで掛け算してるように見せてるんですね!!! 頭いい。。。。。 j = 3*4 + 3 = 3*5 というように増えてく。
404 :
399 :2007/07/16(月) 03:20:55
もうひとつ質問良いですか? cって10行いったら改行するためにあるプログラムですよね?
405 :
デフォルトの名無しさん :2007/07/16(月) 03:22:18
初歩なんだが(a+1)x^2+(b+1)x+(c+1)=0を 解くプログラムがわからないorz a=1b=1c=1を入れるのだが #include<stdio.h> int main(void) { int a=1,b=1,c=1,d,x,y; scanf("a=%f",&a); scanf("b=%f",&b); scanf("c=%f",&c); d=b^2-4*a*c; if(d>0) x=(-b+sqr(d))/a; y=(-b-sqr(d))/a; printf("x=%d,%d\n",x,y); elxe printf("解なし\n"); return 0; } ではダメみたいなんよ もうよくわからない、たすけておくれ
突っ込み所満載だがとりあえずそれコンパイル通らないっしょ
d=b^2-4*a*c; これ判別式? d = b * b - 4 * a * c;
#include <math.h>追加 sqr -> sqrt elxe -> else
>>405 なんでコンパイルしてみようとしないの?
410 :
399 :2007/07/16(月) 03:32:26
改行するためだけにcはあるのに無くしちゃうと実行できないんですよ。。。 cは他に存在価値があるんですか?
実行できないって言われてもどうしろっちゅーねん 俺は実行できたって答えればいいのか? 何をしたら何がどうなったかくらい言ってくれよ プログラム以前の問題として。
413 :
399 :2007/07/16(月) 03:41:37
>>411 ごめんなさいwww
#include <stdio.h>
#include <math.h>
int main(void)
{
int prime[1000],LIMIT,i,j;
for(i=1; i<=1000; i+=2) prime[i]=1;
for(i=4; i<=1000; i+=2) prime[i]=0;
LIMIT=(int)sqrt(1000);
for(i=3; i<=LIMIT; i+=2)
{
if(prime[i]==1)
{
for(j=2*i; j<=1000; j+=i)
prime[j]=0;
} }
printf("%d ",2);
for(i=3; i<=1000; i+=2)
{
if(prime[i]==1)
{
printf("%d ",i);
} }
return 0;
}
こんな感じにcをなくすと実行しても何も映らないのは何ででしょうか?
414 :
399 :2007/07/16(月) 03:42:17
意味わかんなかったですよね。 ごめんなさい。
415 :
405 :2007/07/16(月) 03:48:05
お兄様方のアドバイス通りに しましたが通らないorz
>>415 パッと見気づいたところを指摘しただけだからね
なんで通らないとだけしか言わないかな
コンパイルエラー出てるんでしょ
君が情報を減らすフィルターになってどうする
417 :
399 :2007/07/16(月) 04:21:12
私の場合はコンパイルエラーでないです。。。
>>413 5行目を
int i,j,prime[1000],LIMIT;
に変えてみそ。
>>399 あとで思ったんだけどね、偶数が無駄だから
for(j=2*i; j<=MAX; j+=i) < これを
int k; を追加して for(k=i*2,j=k; j<=MAX; j+=k) にしチャイナと。
そうすると、例えば i=3 が素数で、k=3*2=6, j=3+6=9 から 6 ずつ加算したものが
ふるい落とされる。6,12,18 は偶数なんで、当然やる意味なし。
まぁ、これをやっても、やらなかったときと比べて大して処理速度は速くならないけど
無駄は省いているから。
>>419 っと、訂正
for(k=i*2,j=k; j<=MAX; j+=k)
for(k=i*2,j=i+k; j<=MAX; j+=k) < j=i+k
ムダ省くんならj=i*iにでもすれば?
手をくわえてみた #include <stdio.h> #include <math.h> #define LIMIT 1000 int main(void) { int prime[LIMIT]={0,0,1},limit,i,j; for(i=3; i<LIMIT; i+=2) prime[i]=1; for(i=4; i<LIMIT; i+=2) prime[i]=0; limit=sqrt(LIMIT); for(i=3; i<limit; i+=2) { if(prime[i]) { for(j=i*i; j<LIMIT; j+=i*2) prime[j]=0; } } for(i=0; i<LIMIT; i++) { if(prime[i]!=0) { printf("%5d",i); } }printf("\n"); return 0; }
423 :
377 :2007/07/16(月) 15:53:36
>>380 自動で開放されるのは当然として、手動で開放できないのがという意味です。
>>423 どこが不便なの?
シビアな組み込み環境とかじゃないかぎり
メモリの効率とか最適化とか気にする必要はないし
free関数だって呼んですぐに開放されるわけではない
void intary_rcpy(int v1[],const int v2[],int no) { int i; int v3[no] = {0}; for (i=0;i<no;i++) v3[i] = v2[i]; for (i=0;i<no/2;i++) { int temp = v3[i]; v3[i] = v3[no-1-i]; v3[no-1-i] = temp; } for (i=0;i<no;i++) v1[i] = v3[i]; } をコンパイルすると定数式が必要ですってでるんですけど、どこがいけないか分りません。 だれか教えてください
>int v3[no] = {0}; これ。 静的に宣言した配列のサイズはコンパイル時に決定できなきゃいけない。 これは引数 no によってそのサイズが変わることを意味しているから C/C++では使えない。 malloc/free 使うか、十分大きなサイズを取るか、どっちかだね。
>>425 C99 ならできる
gcc なら次のオプションを追加してみては?
-std=c99
例
gcc -std=c99 a.c
428 :
デフォルトの名無しさん :2007/07/16(月) 17:17:09
1K(キロ)=10^3=1,000(千) 1M(メガ)=10^6=1,000,000(100万) 1G(ギガ)=10^9=1,000,000,000(10億) 1K(キロ)=10^9=1,000,000,000(10億) 1M(メガ)=10^6=1,000,000(100万) 1G(ギガ)=10^3=1,000(千)
どこの誤爆だ
430 :
428 :2007/07/16(月) 17:30:33
これらは、どう違うのでしょうか?
1024です
>>428 2*2*2*2*2*2*2・・・・・・
どうやったら1000になるのでしょう?
一度計算してみてはw
>>428 上の三つは定義です。
下の三つは誤りです。
定義は「こういうことにしましょう」という決まり事なので、
「どうして?」
という疑問に対しては「そういう風に決められているから」としか
答えられません。
#include <stdio.h> int main(void) { int i,j; int tensu[5][3]; puts("5人の学生の3教科(国語・数学・英語)の点数を入力してください。"); for (i=0;i<5;i++) { printf("[%d]\n",i+1); for (j=0;j<3;j++) { printf("国語:"); scanf("%d",tensu[i][j++]); printf("数学:"); scanf("%d",tensu[i][j++]); printf("英語:"); scanf("%d",tensu[i][j++]); } } return(0); } コンパイルして実行してみると、[1]の数学のとこを入力した後に止まってしまうんですけど、何がいけないのでしょうか?
>>435 scanfはループで使うと無限ループを起こす可能性がある
バグが秘められている(scanfがクソだといわれるゆえん)。
気軽に入力で数字取りたいならfgetsとatoi使いなさい。
ついでにscanfごとにインクリメントしてるんなら jのforループはいらなくない?
インクリメントのほうを消すべきだろ
440 :
デフォルトの名無しさん :2007/07/16(月) 20:20:41
441 :
デフォルトの名無しさん :2007/07/16(月) 20:25:53
>>421 は頭がおかしいんだろうか?ソースの詳細が理解できていないんだろうか?
学校から宿題で「学べる」をテーマにプログラムを作れと言われました。 そこで、Cを使って100マス計算を作ろうと思いました。 しかし、どういうわけかソースは200行は書いてと言われる始末。 普通に作ったら200行になりますか?
443 :
デフォルトの名無しさん :2007/07/16(月) 21:07:34
いちいち頭おかしいとか言う奴もどうなの?(苦笑)
>441 お前が理解できてないだろ。 iの倍数のうちi*2〜i*(i-1)は、iより前に除外されてるんだよ。
445 :
デフォルトの名無しさん :2007/07/16(月) 21:32:08
>>444 >>413 LIMIT=(int)sqrt(1000);
for(i=3; i<=LIMIT; i+=2)
やべえマジでわかってねえ
447 :
デフォルトの名無しさん :2007/07/16(月) 21:33:47
>>421 421 名前:デフォルトの名無しさん 投稿日:2007/07/16(月) 14:01:06
ムダ省くんならj=i*iにでもすれば?
^^^^^^
j? i*i?もはやソースの意味を理解していないバカ二人?もしかして同一人物?
が痛すぎ。黙ってろ、理解できていないカス
>>421 >>444 そこまで言うならお前が言う形にソースを書き直して結果を出してみろやw
448 :
うわっ、マジで分ってないバカが何か言ってるよwwww :2007/07/16(月) 21:34:38
446 名前:デフォルトの名無しさん 投稿日:2007/07/16(月) 21:33:15 やべえマジでわかってねえ 444 名前:デフォルトの名無しさん 投稿日:2007/07/16(月) 21:14:37 >441 お前が理解できてないだろ。 お前が理解できてないだろ。 お前が理解できてないだろ。 お前が理解できてないだろ。 iの倍数のうちi*2〜i*(i-1)は、iより前に除外されてるんだよ。 iの倍数のうちi*2〜i*(i-1)は、iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 iより前に除外されてるんだよ。 ↑はぁ?
うはここまでバカだと思わなかった。 分りやすく具体的にいくか。 i=7のとき 14から42までは7より前に既に除外されてるからj=49からやればいいってこと。
1、定義 char str[] = "memory", *p = "memory"; における str と p の違いを説明せよ。 2、3つの定数 0, \0, NULLのそれぞれの意味と用途を説明せよ テストの過去問でありました。どのように答えたら良いか教えてください。
451 :
デフォルトの名無しさん :2007/07/16(月) 21:38:52
444 名前:デフォルトの名無しさん 投稿日:2007/07/16(月) 21:14:37 >441 お前が理解できてないだろ。 iの倍数のうちi*2〜i*(i-1)は、iより前に除外されてるんだよ。 やべぇ、こいつアホだwwww腹痛ぇwwwwwww
452 :
デフォルトの名無しさん :2007/07/16(月) 21:39:56
449 名前:デフォルトの名無しさん 投稿日:2007/07/16(月) 21:37:14 うはここまでバカだと思わなかった。 ぶっwwwwwwww自分がバカだと気づいていないバカがここまでバカだとは思わなかったwww だからお前の理論をソースに記述して実行結果を見ろ、ボケw
>422
っつか、わざと知ってて釣られていることに気づかずにファビョってバカバカ言う 教えたがり屋さん必死だなw まぁ、そんなの当然知ってるわい。わざとやると ここまで釣れるから面白いぜw
夏真っ盛り?
456 :
デフォルトの名無しさん :2007/07/16(月) 21:48:21
そういう
>>449 は"キチガイ"だな
バカとキチガイの会話ってステキ
いつもの人だから。 完全に言い負かされると釣りってことにしたいらしい。 釣ってる方のレスが釣られてる方のレスより多い釣りなんてないんだけどね。
458 :
デフォルトの名無しさん :2007/07/16(月) 21:51:14
>>450 strは文字配列。*pはポインタで、"memory"という定数があるアドレスの先頭のアドレスが*pに入る。
0はそのまんま数値の0。\0は空文字を示すエスケープシーケンス、NULLは単純に空という意味でゼロとは区別して使う。
>>457 > 完全に言い負かされると
残念だが今回ばかりは負かされたと判断できんだろ。むしろ釣られて顔を真っ赤にして
ファビョってなんでお前わからんねーんだ、バカ!ってなっていた方が笑えるw
だいたい、既に言っているようにソースコードに記して実行すりゃ分ること。
そんな単純なことなのに、わからずや(を演じている釣り師)にムキになっちゃってw
狂人の真似とて大路を走らば、即ち狂人なり
急に静まり返るなYO!まぁ、なんだ、たまにはファビョってみたくなるもんさ。
464 :
デフォルトの名無しさん :2007/07/16(月) 22:21:13
unn
一瞬宿題スレかと思った。 結構同じ人が見てる?
>>450 2の用途について書いてなかったか。用途って言われてもなぁ・・・
0は数値だから、演算とか?\0は空文字なんで文字データとして、特に文字列の終端を意味するときに使われる。
NULLは・・・まぁ、よく言われる ぬるぽ とか。文字列の終端を意味する '\0' の変わりにNULLを
代入して代用することも出来る。例えば char a[10]; a[0]='a'; a[1]='b'; a[2]='\0'; または a[2]=NULL; とか。
ぬるぽ
>>467 やらないよ、いつものあれは俺はやらないよ。ウホッになりたくもないし、やらないぞ。
'\0'は数値としては0のはず NULLも#define定義で0のはず
>>465 大半は両方見てるんじゃないかな
レスはしなくとも
471 :
こんばんわ :2007/07/16(月) 22:47:37
以下の内容のコードを教えてください。 多分岐型 整数型の変数a・b と、文字型の変数e を用意し、 キーボードから2つの数値と1つの演算子を入力し 、その計算結果cを出力するプログラムを作成しなさい。 実行される計算は和・差・積・商・剰余の5種類とし、 演算子はそれぞれ’+’、’-’、’*’、’/’、’%’で 表現されるものとする。 演算子にそれ以外の記号が入力された場合は エラーメッセージを表示する。 また0による除算の回避も含める。
472 :
こんばんわ :2007/07/16(月) 22:49:01
ごめんなさい。471の内容を間違えました。 やっぱりいいです。
>>470 いや、荒れてるあたりが宿題スレでよく見る光景だなぁと思って
回答者は全員一緒だったりして
>>473 そのへんは同じ人でしょ
回答者すべてが同じかは別として
釣りってのは53ネ申とかヤバイとか吉野家とか一発で釣れるもののことを言うんだ。 2get失敗し続けたあげく 「これからは>2のことくそ太郎って呼んでやろうぜ!」 ってレスしたらそれが2getだったとかの高等テクもある。 2ちゃんねる初心者諸君は頑張りたまえ。
477 :
399 :2007/07/16(月) 23:12:12
418サンのアドバイスでそのプログラムは起動しました! #include <stdio.h> int main(void) { int i,j,a[1000]; for(i=1; i<=1000; i+=2) a[i]=1; for(i=4; i<=1000; i+=2) a[i]=0; for(i=3; i<=31; i+=2) { if(a[i]==1) { for(j=2*i; j<=1000; j+=i) a[j]=0; } } printf("%d ",2); for(i=3; i<=1000; i+=2) { if(a[i]==1) { printf("%d ",i); } } return 0; } そしてこれはとにかく習ってないやつを省いてみたやつです。 これが無駄がたくさんあるけど1番簡単なプログラムだと思うのですが、実行しても何も映りません。どうすればよいと思いますか?
一瞬で窓が閉じてると予想
>>477 散々 j は i*i に i*2 を足した値以降だと・・・まぁ、良いけど。
まず >for(i=4; i<=1000; i+=2) a[i]=0; で a[1000] にアクセスしちゃってるじゃん
481 :
399 :2007/07/17(火) 00:37:56
どこをどうすれば表示されるようになるんでしょうか?
おにゃの娘のお豆をくりくりすると表示されるYO!
>>478 いや486DX + Vistaだから超もっさりで数分後にCPUの熱暴走してソニー製のバッテリーに引火しPCが爆発すると予想
>>481 自分が書いた発言への返答くらい見直してください。
>>418 で答えてみたので是非是非試してみてください。
485 :
484 :2007/07/17(火) 05:39:19
>>481 げ・・スレを見直してみたらちゃんと見て頂けていたんですね。
早とちり申し訳ありません。
>>477 それだと正しく篩にかけられてないよ
表示の方でイカサマしてるから気付かないと思うけど
487 :
442 :2007/07/17(火) 13:47:38
>>487 それは問題を作成するだけ?それとも自動解答込み?
余計な、、いやあると便利な機能を追加していけばそんくらいにはなるだろ
将来の拡張性を考えました! って言って配列を全部動的に確保するようにするんだ もちろん別関数に掃き出す、ポインタの受け渡しは構造体使う、 これで何も考えずに20行ぐらいは水増しできる
表示部分をputchar使って一行ずつ書いていくとか
将来性のないプログラムの将来を考えて変なコードを追加した結果、そこがバグの温床になっているという名のデスマを体験したことがある しかも就職してはじめてのプロジェクト
>将来性のないプログラムの将来を考えて変なコードを追加した結果、そこがバグの温床になっているという名 随分長い名前
>>494 学生時代よくやったわw
それでレポートの提出期限に間に合わなくて
遅れて出して成績が良いのつかなかったw
497 :
デフォルトの名無しさん :2007/07/17(火) 18:39:33
#include <stdio.h> void rev_intary(int vc[],int no) { int i,temp; for (i = 0; i < (no/2); i++){ temp = vc[i]; vc[i] = vc[no - i -1]; vc[no - i - 1] = temp; temp = vc[i]; } } int main(void) { int i,a; int va[100]; printf("100以下の要素数を入力してください:"); scanf("%d",&a); printf("要素を入力してください\n"); for (i = 0; i < a; i++) scanf("%d",&va[i]); printf("逆並びにすると\n"); rev_intary(va,a); for (i = 0; i < a; i++) printf("%d\n",va[i]); printf("です\n"); return 0; } このプログラムで配列vcの中自体が逆になってますか? 実行して表示されるのはvcからですか?tempからですか?
再帰呼び出しを行い10進数を16進数に変換する関数ConHEX()を使って、表示するプログラムを作成せよ という課題が出たのですが ConHEX()についていろいろ調べたのですが見つかりませんでした。。 どなたか教えて頂けないでしょうか。
>>498 先生にもう一度課題を聞いたほうがいいよ
多分ConHEXという関数を作れって課題だと思うけど。
そんな関数あったっけ? もしかして「再帰呼び出しを行い10進数を16進数に変換する関数」を ConHEX() という名前で書け、という課題なんじゃないのかい?
「使って」じゃなくて「作って」でわ・・・
なんだこの重婚は
数回前の講義で先生お手製として紹介されたという可能性もある。
その発想はなかった
エスパーktkr
507 :
442 :2007/07/17(火) 22:26:46
>>488 そうですか、わかりました。
>>493 そうです。
他に別なもの考えてみます。結局100マスの予感がしますが・・
ありがとうございます。
#include <stdio.h> #include <stdlib.h> double sqr(double a) { return(a*a); } int main(void) { int i; int in = 0; double x,y; int seed; printf("乱数の種(自然数)を入れてください:"); scanf("%d",&seed); srand((unsigned int)seed); for(i=0;i<1000;i++){ x = rand()/32767.0; y = rand()/32767.0; if (sqr(x) + sqr(y) =<1.0) in += 1; } printf("π = %f\n",in/seed*4.0); return(0); } コンパイルするとx,yに代入した値が使われてないと返されるんですけど、何がいけないのでしょうか?お願いします
>>508 そもそもそれでコンパイルできるの?
=<
↓
<=
510 :
デフォルトの名無しさん :2007/07/18(水) 00:24:07
#include <stdio.h> #define number 5 int ave(int va[],int no) { int i; int vb[number]; for (i = 0; i < no; i++) vb[i] = va[i]/3; return vb[i]; } int main(void) { int i,ave; int eng[number]; int mat[number]; int jap[number]; int wa[number]; puts("5人の点数を入力してください"); for (i = 0; i < number; i++) { printf("[%d] 英語:",i+1); scanf("%d",&eng[i]); printf("[%d] 数学:",i+1); scanf("%d",&mat[i]); printf("[%d] 国語:",i+1); scanf("%d",&jap[i]); } for (i = 0; i < number; i++) wa[i] = eng[i] + mat[i] + jap[i]; ave = ave(wa,number); for (i = 0; i < number; i++) printf("[%d]の平均点は%d点です\n",i + 1,ave); return 0; } いろいろおかしい自信はありますが何がおかしいのか…。エラーは ave = …のところで出てます。 でも他にもいろいろおかしいと思います。どう直せばいいのか…お願いします。
>>510 変数の名前を変えるか、関数の名前を変えるかして
ave という名前が被らないようにしてみては?
512 :
デフォルトの名無しさん :2007/07/18(水) 00:37:14
>>511 無理でした。
一応コンパイラは通るようになりましたが、依然おかしいです。
#include <stdio.h>
#define number 5
void ave_p(int va[],int no)
{
int i;
int average;
for (i = 0; i < no; i++)
average = (va[i]/3);
}
int main(void)
{
int i;
int eng[number];
int mat[number];
int jap[number];
int wa[number];
puts("5人の点数を入力してください");
for (i = 0; i < number; i++) {
printf("[%d] 英語:",i+1); scanf("%d",&eng[i]);
printf(" 数学:",i+1); scanf("%d",&mat[i]);
printf(" 国語:",i+1); scanf("%d",&jap[i]);
}
for (i = 0; i < number; i++)
wa[i] = eng[i] + mat[i] + jap[i];
ave_p(wa,number);
for (i = 0; i < number; i++)
printf("[%d]の平均点は%d点です\n",i + 1,wa);
return 0;
}
average の値は捨てていいの?
514 :
デフォルトの名無しさん :2007/07/18(水) 00:45:20
未定義とか言われてます。 むしろコイツを使いたいのですが・・・。
そもそも平均は整数でいいの?
ave_p()で何でreturnしない?
517 :
デフォルトの名無しさん :2007/07/18(水) 00:53:05
>>515 今はそれどころじゃないのでとりあえずは整数でいいです。
>>516 上で作った関数がvoidなのでなんかよくわからないですけど無理っぽいです。
^^;
いますぐ戻り値の型をintにしてreturn average;するんだ
>関数がvoidなので かえろよw
521 :
デフォルトの名無しさん :2007/07/18(水) 01:01:13
こういうことですか?こういうことっていうかむしろ違ったんですけど…。 #include <stdio.h> #define number 5 int ave_p(int va[],int no) { int i; int average; for (i = 0; i < no; i++) average = (va[i]/3); return average; } int main(void) { int i; int eng[number]; int mat[number]; int jap[number]; int wa[number]; puts("5人の点数を入力してください"); for (i = 0; i < number; i++) { printf("[%d] 英語:",i+1); scanf("%d",&eng[i]); printf(" 数学:",i+1); scanf("%d",&mat[i]); printf(" 国語:",i+1); scanf("%d",&jap[i]); } for (i = 0; i < number; i++) wa[i] = eng[i] + mat[i] + jap[i]; ave_p(wa,number); for (i = 0; i < number; i++) printf("[%d]の平均点は%d点です\n",i + 1,wa); return 0; }
やりたいのはこうじゃないの? void ave_p(int va[],int no) { int i; for (i = 0; i < no; i++) va[i] = (va[i]/3); } printf("[%d]の平均点は%d点です\n",i + 1,wa[i]);
523 :
デフォルトの名無しさん :2007/07/18(水) 01:09:23
そうです! どうして今までのだとダメだったんでしょう?
どうしても何も、wa の平均をせっかく average に入れたのに、 average を使わずに wa を表示してもダメじゃないわけないじゃん 図でも書いてみて1行1行追っていけばいいよ、どこに何が入ってるのか
525 :
デフォルトの名無しさん :2007/07/18(水) 01:14:11
でも最後のprintfで%dをaverageにするとおかしくなりますよね それはどうしてですか?
順番に考えてからコード化してる?訳ないよな。 思いつくままにコーディングしてるから訳わかんなくなるんですよ。
527 :
デフォルトの名無しさん :2007/07/18(水) 01:21:10
素人すぎて細かいことはよくわからないんです。 とりあえずアドバイスをいただきながらもこうやって作ってみたんですが、 これを2次元配列を用いて処理させるようにいじるのは簡単ですか? プログラムの実行する内容としては全く同じです
>521 void ave_p(int ave[],int va[],int no) { int i; for (i = 0; i < no; i++) ave[i] = (va[i]/3); } int average [number]; ave_p(average,wa,number);
529 :
デフォルトの名無しさん :2007/07/18(水) 01:41:24
みなさん、ありがとうございました
#define number 5 void ave_p(int ave[],int sc[][3],int no) { int i; int average; for (i = 0; i < no; i++) ave[i] = ((sc[i][0] + sc[i][1] + sc[i][2])/3); } int main(void) { int i; int sc[number][3]; int average [number]; puts("5人の点数を入力してください"); for (i = 0; i < number; i++) { printf("[%d] 英語:",i+1); scanf("%d",&sc[i][0]); printf(" 数学:",i+1); scanf("%d",&sc[i][1]); printf(" 国語:",i+1); scanf("%d",&sc[i][2]); } ave_p(average ,sc,number); for (i = 0; i < number; i++) printf("[%d]の平均点は%d点です\n",i + 1,average [i]); return 0; }
>>527 >素人すぎて細かいことはよくわからないんです。
よくわからないのに、
>これを2次元配列を用いて処理させるようにいじるのは簡単ですか?
次のステップに行こうとしてるのか?
素人だって言うんならおとなしく基礎から勉強しようぜ
532 :
デフォルトの名無しさん :2007/07/18(水) 03:23:27
画像を取り扱っているのですが、ポインタで image = (unsigned char *)malloc(sizeof(char)*800*600); の宣言をして 例えば、配列でimage[y][x] というのは *(image+800*y+x) で合っていると思うのですが image[y][x+1]を*(image+800*y+(x+1))とすると実行した場合にエラーはでないんですが プログラムが終了してしまい、デバッガがこの指定に問題があると指していました おそらく添字が間違っているのですがどう直せばいいのかわからない状態です よろしくお願いします
与えたx,yの範囲は大丈夫?
image = (unsigned char *)malloc(sizeof(char)*800*600); で確保してるからimageの型はunsigned char *なんだよな? yは0〜599、x+1は0〜799に収まってるかい?
はい、範囲の指定は収まっていました image[800][600] で宣言した場合は、image[y][x] と *(image+600*y+x)となるであってると思うのですが うーん、もう1度ちょっと見直してみます。すみません。
その画像は1ピクセル1バイトなの? 256階調モノクロ?
mallocに失敗してるって事は無い? imageはNULLになってない?
初歩的なことですが教えてください 1つ目のファイル(main関数がある)で定義したグローバル変数nおよび構造体aを、 2つ目のファイル(自分で作った普通の関数がある)で使っていて、それを一つ目のファイルにヘッダファイルを作ってインクルードしたら、 2つ目のファイルからエラーが出て、nとaは定義されてないと出たのですが、 この場合2つ目のファイルでnとaをそのまま使うにはどのようにしたらいいのでしょうか?
539 すみません。自己解決しそうです。
しそうってなんだ?
>>539 適当にやってコンパイルエラー消しても
根本的な問題の解決にならんだろ。また起こるぞ。
externでぐぐれ
このエクスターァン星人め(`・ω・´)
5つの整数を入力して、平均値と中央値を出すプログラムを作る問題があるんですが、中央値の出し方が検討もつきません。よろしくお願いします。
ググれ
qsort関数用の比較関数を作ってソート 要素数が偶数なら添え字の平均値のintで小数点以下を落としてその次の添え字の要素を引っ張り出して 要素数が奇数ならど真ん中の添え字の要素を引っ張りだせばいいんだよ(´・ω・`)
547 :
544 :2007/07/18(水) 18:49:09
>>546 申し訳ないのですが、その文の意味もわかりません。専門用語抜きで概略を教えて頂ければありがたいです。
>>547 5つの整数値を小さい順にならべ変え、真ん中(最小を1番目、最大を5番目とすると3番目)にある値が中央値
>>547 「整数値」ってのは「整数」の「値」って意味だからね。
小さい順ってのは判るよね。
あーそれから、大きい順に並べても大丈夫だから。
#include <stdio.h> #include <stdlib.h> int compareInt(const void * l, const void * r) { const int * il = (const int *) l; const int * ir = (const int *) r; if (* il < * ir) return -1; if (* il > * ir) return 1; return 0; } int main() { int array[5]; for (int ic = 0; ic < sizeof(array) / sizeof(* array); ++ic) { if (scanf("%d", & array[ic]) < 1) return 1; } qsort(array, sizeof(array) / sizeof(* array), sizeof(* array), compareInt); printf("median:%d\n", array[sizeof(array) / sizeof(* array) / 2]); return 0; }
552 :
544 :2007/07/18(水) 20:01:40
>>548-549 五つの数字を入力するプログラム
→昇順または降順にソート
→三番目に並んだ数値を表示
このような流れですか?
そしてスルーされる>551
554 :
544 :2007/07/18(水) 20:11:10
最近、C言語をやり始めてたのですがが友人のPCでコンパイラ(MinGW)を使って早速「hello world」と表示させるプログラムを作ったけど gcc: installation problem, cannot exec `as': No such file or directory と出てきてコンパイラされないそうです。 もしよかったら解決方法を教えてくれませんか ちなみにOSはVistaと聞きました。
557 :
デフォルトの名無しさん :2007/07/18(水) 22:55:31
#include <stdio.h> int main(void){ int s[10]; int i; for(i=0;i<10;i++){ scanf("%d",&s[i]); } return 0; } これでchar s[10];としてscanfの%dを%cにかえると 文字が5個しか入力できないんですけどどうしてでしょうか?
>>557 きみの環境が一文字ニバイトだからと予想
0から9まで一バイトずつヘキサで表示してみなよ
>>544 なあみんな、そのレベルの出題でソートが要求されてるのだろうか?
中央値は最大値と最小値の真ん中のことじゃないのか。
奇数個だし、中央値で間違いないと思うが
>中央値は最大値と最小値の真ん中のことじゃないのか。 何この曖昧な書き方
562 :
デフォルトの名無しさん :2007/07/18(水) 23:23:58
>>558 ヘキサとはなんですか??なんか初心者なのでいまいちわからないです…
>557 改行文字を読み込んでんだろ scanf(" %c", s+i); にして改行文字読み飛ばせばいい
16進数。printfで%xとか
>>557 一文字ごとにEnter叩いているだろ。そいつが次のscanf()で食われているんじゃね?
ヘキサデシマル=16進法 デシマル=10進法 ヘキサ=6
568 :
デフォルトの名無しさん :2007/07/19(木) 00:08:19
>>566 なるほど改行文字が原因だったんですね…。勉強になりました
569 :
デフォルトの名無しさん :2007/07/19(木) 00:52:33
え?C言語?おいしいの? っていうくらい素人な奴のために C言語のいい本を教えてくれないか
>>569 試食版でぐぐれ
ごめんちょっと言ってみたかっただけ
ぶっちゃけ、自分で本も選べない人でも理解できる入門書なんて、見たことない
初心者がいい入門書を誰にも聞かずに選べるわけねー
高橋まなちゃん
初心者なんだから無理に選ばずに何冊か買え
何冊も買わずにまず本屋でいろいろ立ち読みしたほうがいいよ 本屋で挫折してもいいし、できそうだと思ったら1冊買って、それから挫折してもいい
ふと思ったのだが、入門書ってどんな分野でもあるんだろーか 「初めてのアデノシン三リン酸」とか 「猫でもわかるカロタイプ」とか 「明解マロン派」とか 「1週間で分かるロッドマン・フィルブリック」とか 「ヨハネ・パウロ2世完全攻略」とか 大多数が何?誰?って言うような奴にも入門書があったりするんかな
>「ヨハネ・パウロ2世完全攻略」 801本のタイトルにしか見えん。 化学系の院生やってたけど、ある程度マニアックな題材になると それを学ぶこと自体が「入門」ではあり得なくなるので そういう本は必然的に「専門書」と呼ばれることになるんだと思う。 学部生が読むような量子化学の初歩を書いた入門書はあるけど、 化学とは関係ない人が見たらそんなの専門書以外の何物でもないし。
審問ですが、char型の配列に日本語を格納して参照すると文字化けが起こるのですが 良い対策知りませんか?
審問してどうすんだw質問です。_(。_。)_
580 :
579 :2007/07/19(木) 18:25:56
ちなみにprintf()で直接日本語を入れれば化けません。
>>578 問題の起こる最小のコードを晒してくれないか?
下は *おそらく* うまくいく例
#include<stdio.h>
int main(void){
char mojiretu[100];
printf("文字列を入力して下さい : ");
fgets(mojiretu, sizeof(mojiretu), stdin);
printf("%s", mojiretu);
return 0;
}
582 :
579 :2007/07/19(木) 18:37:36
void put(char hoge[],int i){ int j; for(j=0; j<i; j++){ putchar(hoge[i]); sleep(1); } } ってな感じで1秒毎に1文字ずつ表示する関数を作ったんです。
putcharかよ
>>582 hoge[i] じゃなくて hoge[j] じゃなかろうか?
585 :
579 :2007/07/19(木) 18:40:13
fgetsの役目が分かりませんが、ありがとうございました。
586 :
デフォルトの名無しさん :2007/07/19(木) 18:42:31
ぐぐれかす
私、eclipseのCDT使ってるのですが、 printf(); scanf("%d",&hoge);ってやると最初のprintf()が表示されないので、 printf(); fflush(stdout); scanf("%d",&hoge)ってやらないと駄目なんですよね。 こういうのって人それぞれですか?
環境依存だが、確実に表示されていないと困る場面では、出力ストリームをflushしたほうがいい。
ご回答ありがとうございます
でも普通は行単位バッファリングを期待してしまうけどな。
もうこれをやるしかないだろ。 m9(^д^)プチャー
たしか\nで改行するとちゃんと吐き出すんだっけ?
>>577 レスさんくす。
C言語の入門書も関係ない人が見たら専門書にしか見えないのかな。
そうすると、C言語?おいしいの?って奴は大変だな。1冊読破する前に挫折しそうだ。
>801本のタイトルにしか見えん。
すまん。
アマゾンにあったC言語の書籍名に、テキトーにググって見つかったよく知らない単語を入れ替えただけで、全く何も考えてなかった。
つーかヨハネ・パウロ2世って前ローマ教皇か。有名人じゃん、駄目だな俺。
UNIXと言えば何かすごいことのように思ってしまうのと似たようなもんかと
MSのvisual系の入門書からはじめると往々にして挫折する罠 今でもみるとゾッとするw
回文(eyeとかnoon)かどうかを判定するプログラムがどうしても作れません というか思いつきません どなたかヒントorアドバイスください
半分か真ん中までと、以降に分けて、逆方向に文字を比較とか
>>596 len = strlen(word); n = len/2;
for (i = 0; i < n; i++) if (word[i] != word[len-i-1]) break;
if (i < n) {
/*回文である*/
} else {
/*回文でない*/
}
よし、俺がサンプルをあげよう いかないなかい
エスパーCプログラミング とかって無いのかな
>>601 その本を書ける人は、売れないことが分かっている本を書かない
クソ本というか古いだけ
まあ悪い本じゃないよ。ただ、もっと良い本はある。 C++のくだりは不要だったな。 回文判定は、環境依存だけど、strrevしてstrcmpが簡単。
int strpal(const char *str) { int i, j, len; len = strlen(str); for(i = 0, j = len - 1; i < j; i++, j--) { if(str[i] != str[j]) return 0; } return 1; }
京産大乙
strrevしてstrcmpって無駄多すぎだろ。
その無駄ってのが コーディングの手間の問題なのか実効効率の問題なのかだわな。 数MHzの石で動かすの? 突き詰めれば0終端文字列にstrlen使うくらいなら、PASCAL文字列使ったほうが 効率がいいとか、そーいう次元の話になっちゃうよ。
実効→実行 MacのAPIは文字列はどっちでも受けられるようになってる。
>>609 激しく同意。すでに入れ替えて比較ってのは無駄だって話が出てたのにね・・・
所詮○産大未満
Cの初学者に向けての課題としての回文判定だろうに、実行効率とかコーディングの手間とかバカすぎるな。
bsearch ()は重複した値があるときはどれを選ぶかは不定なのですか?? qsort()の後bsearch() して最初にヒットするものを表示させようとしても 一番先頭をさしてくれません。
quick sort自体が元の順序を保持しません。 stable sort(ライブラリにあるかどうかはやっぱり環境依存)かバブルソートを使いましょう。
>>613 大丈夫、どのみち課題を自分でやろうとしない子はホストか●男優かリアルドカタくらいしか進路ないから
強烈だけど半分ぐらいは事実なんだろうなー……
ちなみにbsearchも同じ値に対する順序は不定ですね。
汁○優ちょっとうらやましいかも
ヒントくれって言ってるだけで、課題を放棄してるわけじゃないだろ と少し擁護してみるが、まぁ他人の将来なんか知ったこっちゃ無い
>>615 バブルソートなんか使うくらいなら、
元のインデックスを含めて qsort しろよ
んまぁ、団子ちゃん、もちつけや。どうせお前だって、限りある時間の中で生きている 人間に過ぎないんだ。お互いに生きているこの時間を有意義に使おうや。 どうせいつかは死ぬんだ、楽しく生きた方がマシだろ?あんたの顔は(ryだが。 さびしがりやってのは、すぐに自分を誇示して自分を慰め始めるから困るぜ。
どっちが速いかなんて要素数依存じゃん。 関数呼び出しのオーバーヘッドとか考えると微妙だよ。 むろん、自身のスタック再帰よりもコールバックの比較関数がね。 まあquicksort程度なら俺は暗記してるけどさ。 バブルソートはシンプルだし近い要素同士の比較だからキャッシュのヒット率は上げやすい。 まあ、要素数がそんなに無い場合だが。 C++のソートならコンパレータをインライン展開できるから速い。 ちなみに俺はよく使うのはstd::vectorコンテナとstable_sortだな。 アレって実現方法は大概、ヒープソートやマージソートあたりだな。
知ってる単語ならべて一生懸命だなぁ
たまには効率なんて考えずSTLやらBoostやらを存分に使って仕事がしたいな
だからqsortよりSTLのソートのほうが実行効率もコーディング効率もいいってば。 実測してみ?数値型の比較ならファンクタを作る必要すらない。 まあCスレで言うのもなんだが。
世の中にはほいほいSTLを使うことができない環境もあるんです 実行効率とコーディング効率がすべてじゃない環境もあるんです 察してください
環境ってのは物理的な縛りよりも堅物の上長縛り? それは俺も同じだ。
そもそも C のスレで C++ の話をされても・・・
メモリのこともたまには思い出してあげてください・・・
4時まで起きて頑張ってたのか、お疲れさん
こいつって簡単にすませたい事をぐだぐだ文句いいながら 自分から難しくしていって失敗するタイプだな。
これだからダンゴは嫌われる。
636 :
匿名 :2007/07/20(金) 14:01:58
C言語のプログラミングについてなんですけど、答えてくれる人いませんか?
遠慮なく申せ
638 :
匿名 :2007/07/20(金) 14:03:32
6ヶ月分のガスの使用量を求める。というものなのですが大丈夫でしょうか?
その程度、悪いが朝飯前だ
「2個のサイコロ振りをシミュレートするCプログラムを書け。1個目のサイコロ振りにも2個目サイコロ振りにも関数randを使い、2つの出目の和を計算する。」 この問題です!よろしくお願いします!
>>643 ほれ
#include <stdlib.h>
#include <stdio.h>
int main() {
int a,b;
a = rand() % 6 + 1
printf("a = %d\n", a);
b = rand() % 6 + 1;
printf("b = %d\n", b);
printf("%d", a + b);
return 0;
}
>>643 #include <stdlib.h>
#include <stdio.h>
int main() {
printf("%d", rand() % 10 + 2);
return 0;
}
種無しか!
まあ種なんて実際使うんじゃなけりゃほっといてもいいじゃん
>>645 普通のサイコロなら出目の確率はこうなるはずだろってこと
2 1/36
3 2/36
4 3/36
5 4/36
6 5/36
7 6/36
8 5/36
9 4/36
10 3/36
11 2/36
12 1/36
1・6にたくさん、2・5にちょっと鉛を仕込んであるサイコロを想定してんですが。。
3次元配列に文字列をつっこむってのがどうしても理解できない str[][2][40] = { {"dog", "Hun"} {"no", "nein"} }; って一体どういう風に格納されてるの?
>>654 dog\0の後ろは0x00で埋まる。今回の場合なら36個の0で。
int i[100] = { 0 };が全て0で初期化されるのと同じ理由。
>>654 str[]はchar *の配列(char **)が格納され {"dog", "Hun"}, {"no", "nein"}
str[][2]はcharの配列(char *)が格納され "dog", "Hun"とか"no", "nein"
str[][2][40]はcharが格納される 'd', 'o', 'g', '\0'など
なんか違う
名前入れ忘れてた 頭が物故割れそうだ
4次元配列とかどうやって紙に書くつもりなんだろうか
宇宙は何次元だったけ???
662 :
654 :2007/07/20(金) 23:40:04
>>660 まあ…そうなんだけどね…
せめて手がかりでもつかめればと
>>660 紙は平面なのだから、まず3次元配列から疑問に思えよ。
その3次元char配列なら、(1次元配列である)文字列を
縦横2次元に並べるという形で表現できる。
それ以上の次元の配列も同様に、数次元毎に1つのグループとして、
それを縦横に並べるようにすれば、平面で何次元でも表現できる。
それが見やすいかどうかは別問題だが。
多次元配列は理解している(つもり)だ。 テキストの例題なぞ今更だ。すらすら解ける。 だが、仕事で使うのはWIN32−APIぐらいなもんだ。 普通にプログラムしたって二次元配列すら滅多に使わないよ。 画像扱っていないからな。
665 :
664 :2007/07/21(土) 00:42:28
×画像扱っていないからな。 ○画像扱っていないからかな。
正式IDと正式PASSのところに文字が帰ってきません。なぜでしょう? #include<stdio.h> #include<string.h> int error; struct id_pass{ char id[15],pass[15]; }; int idpa(struct id_pass part1){ int i,p; printf("Welcom to Hack plan\n"); error=2; while(error!=0){ error=2; printf("ID:"); fgets(part1.id,sizeof(part1.id),stdin); part1.id[strlen(part1.id)-1]='\0'; --error;/*error=1*/
i=strlen(part1.id);/*iにIDの長さを代入*/ if(i<=3 || i>=13){ ++error;/*もしエラーならばerror=2*/ } printf("PASS:"); fgets(part1.pass,sizeof(part1.pass),stdin); part1.pass[strlen(part1.pass)-1]='\0'; p=strlen(part1.pass);/*pにPASSの長さを代入*/ if(p<=3 || p>=13){ ++error;/*エラーならerror=3*/ } --error;/*正常ならerror=0でループ脱出*/ if(error>=1) printf("Error:Please 4-12 length for ID or PASS\n"); } return ; }
int main(){ struct id_pass formal_id; idpa(formal_id); printf("正式ID:%s\n",formal_id.id); printf("正式PASS:%s\n",formal_id.pass); return 0; }
&とか*とか必要と思われるところに付け足しましょう
670 :
654 :2007/07/21(土) 01:13:31
str[0][0][40] = ウホッ
str[0][1][40] = いい男…
ry)
str[x][y][z] = しーましェーん!
っていうふうになること考えれば少しわかったようなわからないような
でもなんで
>>654 の初期化で2単語しか入れないのに2次元目が[2]なんだ?
ただ余裕とってるだけ?
ポインタで取り回せということですね、ちょっとやってみます。 というか改行多すぎる言われて面倒だ
int i[2]; i[0]=1;//OK i[1]=2;//OK i[2]=3;//NG
673 :
654 :2007/07/21(土) 01:22:48
各次元でそれぞれヌル(でいいのかな)が必要なのか いろいろ助かった みんなありがとう
>>669 ポインタで指定したらmain関数にすら帰ってこなくなったw
自分自身何度かポインタなり色々変えてみたりもしたつもりだ、まぁ1時30分で寝るけどな
>>669 だめだ、ポインタにしたら(null)が戻ってくるようになった。じゃあ寝るな
おやすみ
あ、しまった。冠詞じゃないから eins だ。 ま、いっか。
char str[5] = "baka"; str[0] b str[1] a str[2] k str[3] a str[4] \0 最初は5個分って意味で、0〜4で5個分になる
わざわざ図解サンクス 完全な理解には遠いがだいぶスッキリしてきた 早速課題プログラム作ってくる
int array[5] = { 0, 1, 2, 3, 4, }; とする場合、int を 5 個並べる形になる。 int array[2][5] = { { 0, 1, 2, 3, 4 }, { 5, 6, 7, 8, 9 }, }; とする場合、int[5] を 2 個並べる形になる。 int array[3][2][5] = { { { 0, 1, 2, 3, 4 }, { 5, 6, 7, 8, 9 }, }, { { 10, 11, 12, 13, 14 }, { 15, 16, 17, 18, 19 }, }, { { 20, 21, 22, 23, 24 }, { 25, 26, 27, 28, 29 }, }, }; とする場合、int[2][5] を 3 個並べる形になる。 一般的に言えば、int array[X][Y]...[Z]; の場合、int[Y]...[Z] を X 個並べる形になる。
多次元数列で質問した俺が再来 /* 5章総合理解度チェック5 隠し文字列の長さをハイフンで表示する ハングマンゲーム ユーザーはいろいろな文字を当てはめてその単語を推測する 入力された文字が単語に含まれていたらその部分を表示 完成するまでに入力した文字数を数え、15回以下ならプレイヤーの勝利とする。"concatenation" */ #include <stdio.h> #include <string.h> #include <conio.h> int main(void) { char magic_word[40] = "contatenation" , correct_word[40]; char ch; int i, count=0; /* 文字列用カウンタ, 入力回数カウンタ */ int len; /* magic_word[]の長さ */ printf("ハングマンゲームを開始します。\n"); len = strlen(magic_word); for(i=0; i<len; i++) correct_word[i] = '-'; /* correct_wordにハイフンを格納 */ printf(correct_word);
/* 比較部 */ do{ printf("\n予想した文字を入力してください。: "); ch = getche(); printf("\n"); for(i=0; i<len; i++) if(ch == magic_word[i]) correct_word[i] = magic_word[i]; printf(correct_word); count++; } while(strcmp(magic_word , correct_word)); printf("\n%d 回で完成しました。" , count); if(count<=15) printf("\nプレイヤーの勝利です。"); else printf("\nプレイヤーの負けです。"); return 0; } このコードで一応要求された動きはできるんだが、 magic_word[]を"contatenetion"から"yaranaika"に変えると表示が ---------ー@ になってしまう(要求された動作は文字数分ハイフン表示) どこでおかしくなってるんだろう コンパイラはbcc
さらに補足
contatenatio →正常
computer →正常
civirization →末尾に || という記号がつく
マジックワードを任意に指定できるようにした
>>681 の部分を置き換える
ごちゃごちゃですいません
/* ここから */
#include <stdio.h>
#include <string.h>
#include <conio.h>
int main(void)
{
char magic_word[40],
correct_word[40];
char ch;
int i, count=0; /* 文字列用カウンタ, 入力回数カウンタ */
int len; /* magic_word[]の長さ */
printf("ハングマンゲームを開始します。\n");
printf("マジックワードを設定してください。: ");
gets(magic_word);
len = strlen(magic_word);
for(i=0; i<len; i++)
correct_word[i] = '-'; /* correct_wordにハイフンを格納 */
printf(correct_word);
'\0'がないんだからまともに動く方が不思議だろ
マジスカ コンパイラが自動で付加するというのを読んでほとんど気にしてなかった… どこをどうすればいいんでしょう
correct_word[i] = '\0'; を-で埋めた後に追加するか、correct_word[40] = {0}として0で初期化する。
おお…ちゃんと動くようになった 変数も時々初期化忘れてとんでもない数値になったりするし大切なんだね… 危ない穴持ったまま突き進むとこだった 本当にありがとう
689 :
デフォルトの名無しさん :2007/07/21(土) 18:23:59
2重積分をとく問題です。 曲面z=x^2y^2と平面x=0,y=0,z=0,x=a,y=bで囲まれた体積Vを計算せよ。 V=∬f(x,y)dxdy 領域{0<=x<=a, 0<=y<=b}でf(x,y)=x^2y^2 ただしa=10,b=20として分割数n,mは適当に決めよ。 --区分求積法による体積の求め方-- V=∬f(x,y)dxdy≒(i=0〜n-1)(j=0〜m-1)f(xi,yj)ΔxΔy(Δx=(b-a)/n, Δy=(d-c)/mでn,mは分割数) 解析解はV=888888.9なんですがV=0となってしまいます。 どこが間違ってるのかわかりません。お願いします。
690 :
689続き :2007/07/21(土) 18:25:41
#include <stdio.h> double a = 10; double b = 20; double f(double x, double y); int main(void) { double V, x[1000], y[1000], dx, dy; int i, j, n, m; printf("分割数を設定してください。\n"); printf("n = "); scanf("%lf", &n); printf("m = "); scanf("%lf", &m);
横からで申し訳ありませんが >correct_word[40] = {0}として0で初期化する。 0で初期化したら'\0'は必要ないんですか?
692 :
689続き :2007/07/21(土) 18:26:51
dx = (a - 0) / n; dy = (b - 0) / m; V = 0; for (i=0; i <= n-1; i++) { for (j=0; j <= m-1; j++) { x[i] = i * dx; y[j] = j * dy; V += f(x[i], y[j]) * dx * dy; } } printf("V = %f\n", V); return 0; } double f(double x, double y) { return x * x * y * y; }
intは%lfじゃなくて%d
695 :
デフォルトの名無しさん :2007/07/21(土) 18:47:01
ありがとう ちゃんと動きました
696 :
デフォルトの名無しさん :2007/07/21(土) 18:50:34
689のものです。 分割数1000くらいまでは動作するんですが、分割数を10000とかにするとセグメントエラーがでるんです。 なんでですか?
そりゃ配列のサイズが1000だからだろ
>>690 だけパッと見たけど
>scanf("%lf", &n);
>scanf("%lf", &m);
がおかしい
scanf("%d", &n);
scanf("%d", &m);
に汁
解決してたのかorz
>>696 セグメントエラーはメモリでアクセスしちゃだめなところにアクセスしてる
>>697 が原因だろうね
701 :
デフォルトの名無しさん :2007/07/21(土) 18:57:05
>>696 スタックオーバーフロー
コンパイラオプションでスタック領域を拡張するか
ヒープメモリーを使え
702 :
デフォルトの名無しさん :2007/07/21(土) 19:10:08
for文のとこでエラーになってたのか 配列のサイズ大きくしたら動作しました ありがとうございました
>>702 malloc()とfree()覚えなよ
704 :
デフォルトの名無しさん :2007/07/21(土) 19:26:34
>>703 malloc()とfree()ですか…
勉強してみます
スタックオーバーフローじゃないから、mallocもfreeもその程度の分割数じゃ必要ない
>>704 ユーザの入力した分割数によって必要な分のメモリ領域をmallocで確保して配列代わりに使ってみて
使い終わったらfreeで領域解放
707 :
デフォルトの名無しさん :2007/07/21(土) 20:07:05
10個の値(小数)をスキャンして最小二乗法の計算をしようとしているんですがaが0になったりcの値があわなかったりしてうまくいきません。 先輩方どこがおかしいのか教えてください。あと最終的にcsvファイルにするのでこんな書き方してます。数式ライブラリも一応習いました。 #include <stdio.h> int main(void) { int i; float a,b,X[5],Y[5],c,d,e,f,x,y; for(i=1; i<6; i++) { printf("#X[%d]: ", i); scanf("%f", &X[i]); } for(i=1; i<6; i++) { printf("#Y[%d]: ", i); scanf("%f", &Y[i]); } c=X[1]+X[2]+X[3]+X[4]+X[5]; d=Y[1]+Y[2]+Y[3]+Y[4]+Y[5]; e=X[1]*X[1]+X[2]*X[2]+X[3]*X[3]+X[4]*X[4]+X[5]*X[5]; f=X[1]*Y[1]+X[2]*Y[2]+X[3]*Y[3]+X[4]*Y[4]+X[5]*Y[5];
708 :
つづき :2007/07/21(土) 20:08:09
a=(5*f-c*d)/(5*e-c*c); b=(e*d-f*c)/(5*e-c*c); printf("#a is %f\n", a); printf("#b is %f\n", b); printf("#c is %f\n", c); printf("#d is %f\n", d); printf("#e is %f\n", e); printf("#f is %f\n", f); for(x=0;x<100;x++) { y=a*x+b; printf("%f,%f\n",x,y); } return 0; } 以上です
for(i=1; i<6; i++)
>>707 X[5],Y[5]って宣言したんだから、0〜4を使わないと駄目だよーww
for(i=1; i<6; i++)、c=X[1]+X[2]+X[3]+X[4]+X[5]; ワロタwww
712 :
707 :2007/07/21(土) 21:11:13
できました!!
>>711 以外の先輩方ありがとうございます。
ガキかよw
これこそワロタ
while (*p) { *p = toupper(*p); p++; } を、 while (*p) *p++ = toupper(*p); にできるのはなんでなんだぜ?
?++ってのは、演算後にインクリメントって事じゃないの? 逆に++?だと、インクリメント後に演算って感じかな とc初心者の私が答えてみる
インクリメントとは何かが分かってれば特に疑問は感じないと思うんだが…
719 :
715 :2007/07/21(土) 22:21:29
なんとなくわかったような… 頭が固いと苦労するな…(´・ω・)
720 :
399 :2007/07/21(土) 23:09:26
またまたすいません。 またエラトステネスで1000までの素数を表示するプログラムなんですが、 #include <stdio.h> int main(void) { int a,n[1000]; a=n%2 if(a!=0) a=n%3 if(a!=0) a=n%5 if(a!=0) a=n%7 if(a!=0) a=n%11 if(a!=0) a=n%13 if(a!=0) a=n%17 if(a!=0) a=n%19
721 :
399 :2007/07/21(土) 23:10:21
if(a!=0) a=n%23 if(a!=0) a=n%29 if(a!=0) a=n%31 if(a!=0) printf("%d",n); return 0; } っていう考え方もあると思うのですが理解してもらえますかね??? でもこれじゃあエラーがでちゃうんです。。。 どこがプログラム的におかしいか教えてもらえませんか?
>>720 エラーの内容くらいコピペしてくらはい。
ifのネストが大きすぎるのでは?とESPしてみる。
>>722 ネストなんてしてねぇ・・・OTL
配列であるnの使い方がおかしいよ。
理解に苦しむよーw エラトステネスの篩はどういうものかわかる? あと、セミコロンを出し惜しんじゃダメよ
・・・とりあえずセミコロンは書こうや
>>721 どこがエラトステネスの篩なのかさっぱり分らんだろ
727 :
399 :2007/07/21(土) 23:14:01
> C:\borland\bcc55\Bin\make.exe -fDebug\report.mak Debug\report7.obj MAKE Version 5.2 Copyright (c) 1987, 2000 Borland bcc32 -WC -3 -Od -w- -AT -pc -H- -k -b -v -y -DDEBUG -nDebug -c C:\borland\bcc55\Bin\report\report7.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland c:\borland\bcc55\bin\report\report7.c: エラー E2087 c:\borland\bcc55\bin\report\report7.c 8: ポインタの不正な使用(関数 main ) エラー E2379 c:\borland\bcc55\bin\report\report7.c 9: ステートメントにセミコロン(;)がない(関数 main ) *** 2 errors in Compile *** ** error 1 ** deleting Debug\report7.obj Compile End !! (Elapsed time 0:00.100) って書いてありました。おねがいします。。。
>>727 基本が全然できてないんすけど・・・
C言語を勉強するのかエラトステネスのアルゴリズムを理解したいのか・・・
729 :
399 :2007/07/21(土) 23:18:22
>>398 を先生に見せたらエラトステネスの篩じゃないって言われました(泣)
だから別に作ってみたんです。
>>729 どこの学校だ?そんな講師がいる学校、辞めろ
731 :
399 :2007/07/21(土) 23:23:57
もし
>>720 >>721 のプログラムを生かす形で作るとしたらどうなりますか?
無理言ってすいません。。。
>>731 生かすも何も、それ自体がエラトステネスの篩の手順を無視しているし
どうやってそれで素数を求めるんだ?
>>398 は間違ってるねw
表示のところの
for(c=1,i=3; i<=MAX; i+=2) {
を
for(c=1,i=0; i<=MAX; i++) {
にすると。。
735 :
399 :2007/07/21(土) 23:28:52
まず2の倍数じゃないnを求めて 次に3の倍数じゃないnを求めて 次に5の倍数じゃないnを求めて ・ ・ ・ 最後に31の倍数じゃないnを求めて 残ったnを表示する 見たいな感じで作ろうとしたんですけど。。。
>>720 int a,n[1000];
a=n%2
nの使い方もおかしい
>>735 それじゃまるで素数は1個しか残らないみたいじゃない
俺も素数を表示するソース作ったが見るか?
739 :
399 :2007/07/21(土) 23:34:29
>>737 それではじめにnは1から1000までって定義して
>>735 みたいにしたら
素数残るかなって思ったんですけど。。。
740 :
399 :2007/07/21(土) 23:35:48
>>738 エラトステネスの篩を使ってるなら是非見せてください!
名前欄は「720」にしたほうがいいと思う
>>740 いらんことすな。これでいけ。
#include <stdio.h>
#define MAX 1001
int main(void) {
int prime[MAX]={0},i,j;
prime[2]=1;
for(i=0; i<MAX; i++) prime[i]=1;
for(i=2; i*i<MAX; i++) {
if(prime[i]==1) {
for(j=i*2; j<MAX; j+=i)
prime[j]=0;
}
}
for(i=2,c=0; i<MAX; i++) {
if(prime[i])
printf("%d ",i);
}
return 0;
}
>>740 エラトステネスの篩ではないので見せないでいいか
>>742 > for(i=2,c=0; i<MAX; i++) {
ここの ,c=0 は要らんかった
>>742 prime[2]=1; < これ要らんかったw
for(i=0; i<MAX; i++) prime[i]=1; < i=2; からやった。なんか無駄を省かないでやるのまんどっち
746 :
743 :2007/07/21(土) 23:46:42
if(!a)処理 これはどういう意味でしょうか
>>747 aの中のnotを評価して0ならスルー、それ以外ならそのif以下の処理をする
if(a!=0)と同じじゃない?
>>749 if(a!=0)処理
これと同じってことですか?
NULLでもいいんですか?
>>751 if(a==0) 処理 と同じじゃないか?
a==0 のとき !a が非ゼロ
a!=0 のとき !a がゼロだから
>>751 ん〜〜、まぁそういうことにもなる。a=0 の場合、!a は1に、それ以外は!a は 0 に。
#include <stdio.h>
int main(void) {
int a;
a=0;
printf("a:%d !a:%d \n",a,!a);
a=1;
printf("a:%d !a:%d \n",a,!a);
a=5;
printf("a:%d !a:%d \n",a,!a);
return 0;
}
756 :
720 :2007/07/21(土) 23:56:58
720に変えました。 このプログラムのソースのアルゴリズムを理解しないと 点貰えないのでがんばって理解してみます! ありがとうございました!!!!!
ってか
>>754 が言う通りだったっけ、訂正。
a=0のとき、!aはの評価が1になってif分以下の処理がされる
0以外だと !a の評価は 0 になるんでスルー。
>>756 2から素数が見つかるごとに、その2倍以上の 素数xn (nは2以上の整数)
になるものは当然素数じゃないんで、順番に篩い落とすわけだが
既に提示されているソースは、既に篩い落とされていると分っている部分は
敢えて if(prime[i]==1) ってのを省略しているから、それが引っかかったんじゃないか?
>>747 aがint型じゃないと違う結果だけどねw
#include <stdio.h>
int main(void) {
float a;
a=0.0;
printf("a:%g !a:%g \n",a,!a);
a=0.1;
printf("a:%g !a:%g \n",a,!a);
a=5.0;
printf("a:%g !a:%g \n",a,!a);
return 0;
}
>>760 でしょって、そういうことじゃなくてint型でなければ結果は違うよって話だよ
ここで聞いたり答えチラ見したりしつつ地道にやってるが、 既存の関数を自作しろって問題が一発で解けたりするとうれしいな お前ら愛してる ありがとう
>>762 #include <stdio.h>
int main(void) {
float a;
a=0.0;
printf("a:%g !a:%d \n",a,!a);
a=0.1;
printf("a:%g !a:%d \n",a,!a);
a=5.0;
printf("a:%g !a:%d \n",a,!a);
return 0;
}
の実行結果は下のようになったんだけど、
>>762 の環境では整数の時と同じにようにならない?
実行結果
a:0 !a:1
a:0.1 !a:0
a:5 !a:0
うちのbccちゃんは違うよーww
>>765 ん〜〜〜、0か1にはならんかったよ。俺んとこはこうなった。
a:0 !a:4.94066e-324
a:0.1 !a:5.23869e-11
a:5 !a:2048
!の意味がわかっていないアホバカり
>>766-767 !a の書式指定は %d じゃないと…
これも追加してみて
printf("%g\n", 0, 0);
printf("%g\n", 0, 1);
printf("%g\n", 0);
>>769 なるほど。意味が分った。
#include <stdio.h>
int main(void) {
float a;
a=0.0;
printf("a:%g !a:%d \n",a,!a);
if(!a) printf("check\n");
a=0.1;
printf("a:%g !a:%d \n",a,!a);
if(!a) printf("check\n");
a=5.0;
printf("a:%g !a:%d \n",a,!a);
if(!a) printf("check\n");
return 0;
}
772 :
デフォルトの名無しさん :2007/07/22(日) 04:32:32
C言語よおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおい お前は壁を乗り越えれば乗り越えるほど新しい壁作ってんじゃねーよおおおおおおおおおおおおおおおおお 1つのことを理解するたびにお前が遠くなっていく気がするぜ
そりゃあんた、自分で「思い込み」という壁を作りながら壁を乗り越えるからだ。
>>773 いや、それがさ聞いてくれよ
いままでちゃんと動いてたのに関数1個追加しただけで急に動かなくなったりするわけよ
糞きたねープログラム書いてんじゃないのか? 一週間間を置いた後に読めるか?
>>775 読むのは以前の問題だな、関数にすると仕様がちょっと変わってくるだろ
関数一個追加しただけなら、その関数周辺を洗えばいいだけだから楽なもんだろ。
その洗うのがまた面倒なんだ ある関数に文字列を入力するようにしてたとする、今度は条件文をつけてその文字列に 送るようにすると、文字入力が省略されたりするんだ
文字入力 if(条件) 関数(文字列); 文字入力が省略されたらまずい場合こうすればいいだけのことじゃないか?
>いままでちゃんと動いてたのに関数1個追加しただけで急に動かなくなったりするわけよ まさしく、>773。
int x=0; printf("%s",x ); ここで変数xの値によって違う文字列を出力したいのですが このPrintfの中で引数xの後ろに?とかつけて文字列を指定 するやり方があったと思うのですが思い出せません。 どなたか構文教えてください。
intを%sはおかしくないか? その文字列を格納してある変数を指定しないと
三項演算子でググれ
>>784 条件演算子という名前も思い出してあげてください。
だが、断る!
>>772 C言語は高級アセンブラなんだと考えろ。
そうすれば、仕様を覚える度に謎は謎でなくなる。
C99は、もはや高級言語になってしまったがな。
こんな感じでdouble型で0.0≠iとなる最小のiを出してみようとしたんですが、終了しません 強制終了して値を見てみたら自分の環境ではi+0.0 = 1.97626e-323以降は引き算が出来てないみたいです 考え方間違えてるんでしょうか? WindowsXP上でVC++を使ってます #include <stdio.h> int main(void) { double i,temp,bottom; for (i=bottom=1.0;0.0+i>0.0;) { temp=bottom/10.0; while(i>temp) i-=temp; i+=temp; bottom=temp; } printf("0.0+i = %g\n",0.0+i); return 0; } 浮動小数で正しく表現できない数が出ちゃってるから駄目なんですかね
アンダーフロー
791 :
789 :2007/07/22(日) 13:48:10
あ、1.97626e-323/10が求められないからbottomの値が変わらずiも変わらないってことですか 2で割れば4.94066e-324までは行けるみたいですね
792 :
デフォルトの名無しさん :2007/07/22(日) 14:46:06
#include<stdio.h> #include<sys/types.h> #include<unistd.h> int main(void){ int pid; int i; if(pid = fork() == 0){ for(i = 0;i<20;i++){ printf("child %d\n",i); sleep(1); } exit(0); } else { for(i = 0;i<10;i++){ printf("parent %d\n",i); sleep(1); } wait(NULL); exit(0); } return(0); } の実行にかかる時間は約20秒でした。30回sleepするので30秒かかると思うのですが 分かりません。教えてください。お願いします。
>>792 >30回sleepするので
何を言っている。
親プロセス 子プロセス
│
fork() -─────-┐
│ │
│この間、10秒. │
│ │
↓ │この間、20秒
.: │
.: │
.: wait() │
.: │
.: ←-──────┘
exit(0)
ifで分岐してるから
今時メンテ以外でforkなんて使ったりするもんなの?
796 :
792 :2007/07/22(日) 15:05:26
>>793 ありがとうございます。
でもまだよくわからないんです。
親プロセスでsleep実行してるときって子プロセスの処理できるんですか。
scanfで文字列として数値を入力したあとにこの入力した値をdouble型に変換したいのですがどうすればいいでしょうか?
strtodでググれ
799 :
デフォルトの名無しさん :2007/07/22(日) 15:18:42
>>797 strtod呼べ
このスットコドッコイ
801 :
デフォルトの名無しさん :2007/07/22(日) 16:36:35
乱数のプログラムですが、 time関数を使うために srand((unsigned int)time(NULL)); を使うとコンパイル時に 未定義のシンボルNULLとエラーがでてしまいます。 どうすればよいでしょうか。
>>801 使用している環境は?stdio.h やら stdlib.h あるいは iostream など取り込んでいるか?
#インクルード タイム。h って書いた?
NULLなんて使うな。0って書け。
805 :
デフォルトの名無しさん :2007/07/22(日) 16:53:52
801ですが、ソースコードです。 #include <stdio.h> #include <stdlib.h> #include <time.h> int GetRandom(int min,int max); int main(void) { int i; srand((unsigned int)time(NULL)); for (i = 0;i < 30;i++) { printf("%d\n",GetRandom(0,50)); } return 0; } int GetRandom(int min,int max) { return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 0から50までの乱数を30個発生させるというものです。
それで NULL が使えないのか・・・。 なら stddef.h でもインクルードしとけ。
どこの処理系だよ。
809 :
デフォルトの名無しさん :2007/07/22(日) 17:12:33
<stddef.h > インクルードしましたがやはりエラーは消えませんでした。 808様 0に変えることでコンパイル成功しました。ありがとうございます。
0 にすれば問題はないけど、 NULL が使えないというその処理系は凄く気持ち悪いな。 他にも変な所がありそうで怖い。
そのプロジェクトはいったん忘れて nulltest.cってファイル作って下のソース書いて実行してみたら。 これで通らなかったから根本的なところでなんかおかしい。 #include <stdio.h> int main(){ return (int)NULL; }
安易な解決法を提示したがために、 後々困ることにならない事を祈る。
814 :
デフォルトの名無しさん :2007/07/22(日) 17:21:50
Cコンパイラ:Borland C++ Compilerを使っています。 812様のソース実行しましたが、やはりエラーがでてしまいました
バージョンが古すぎるんじゃね? #define NULL 0でも書いて対応するしかなさそ。
816 :
デフォルトの名無しさん :2007/07/22(日) 17:30:19
確かに古いのかもしれません。 #define NULL 0 と書いたら NULLが使えるようになりました! 色々とご指摘ありがとうございます
いくらバージョンが古くても、NULL がないってことあるのかなあ。 インストール手順で何かミスがあったとしか・・・。 NULL が使えないってことは、size_t とかも使えないんだろうか。 #include <stddef.h> int main() { return (int)(size_t)0; } は通る?
818 :
デフォルトの名無しさん :2007/07/22(日) 17:34:52
817様のソースは 通りました インストール手順は、他のでは上手くいくのでミスはないかと・・・
size_t は使えるのか・・・。 NULL だけ使えないって何か不思議だなあ。 まあ、NULL だけ使えないみたいだから、 自前で定義するか 0 を直接使うかってところか・・・。 stddef.h を探して NULL の定義を直接埋め込んだのでもいいとは思う。
そのウンココパイラ捨てろw
ヘッダファイル内でNULLを検索してみては 変な所にあるかもしれないし…
822 :
デフォルトの名無しさん :2007/07/22(日) 17:46:36
行列matの転置行列を求めて次のように出力するプログラムを完成させよ。 | 1 6 11 16 21 | | 2 7 12 17 22 | | 3 8 13 18 23 | | 4 9 14 19 24 | | 5 10 15 20 25 |
823 :
デフォルトの名無しさん :2007/07/22(日) 17:48:29
#include <stdio.h> #define MSIZE 5 void swap(int *a, int *b) { int c; (a) = *a; *a = *b; *b = (a) ; } void main(void) { int i, j, mat[MSIZE][MSIZE] = { { 1, 2, 3, 4, 5}, { 6, 7, 8, 9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25} }; for(i = 0; i < MSIZE - 1; i++) { for(j = (b) ; j < (c) ; j ++) { swap( (d) , (e) ); } } for(i = 0; i < MSIZE; i ++) { printf("|");/25小計 for(j = 0; j < MSIZE; j ++) { printf("%3d ", mat[i][j]); } printf(" |\n"); } } さっぱりわかりません よろしくお願いします
size_t だの time_t だの、定義を見ると符号なしの整数型だしな まぁ、自分で適当にそれに応じて使っておけってことで
825 :
デフォルトの名無しさん :2007/07/22(日) 18:10:49
あるカップラーメンの値段を店ごとに調べた.それを配列に 入れて,下の出力のように10円刻みに分布をとることを考える. そのためのプログラムを下に示す.空白を補え. 80- 89円: 2 90- 99円: 2 100-109円: 1 110-119円: 2 120-129円: 1 130-139円: 2
826 :
デフォルトの名無しさん :2007/07/22(日) 18:13:33
#include <stdio.h> #define C_NUM 6 void makedist(int a[10], int b[C_NUM]) { int i; for(i = 0; i < 10; i ++) { b[ (a) ] += 1; } } void main(void) { int price[10] = {80, 120, 111, 130, 139, 95, 98, 89, 105, 119}; int dist[C_NUM], i; for(i = 0; i < C_NUM; i++) { dist[i] = (b) ; } makedist( (c) , dist); for(i = 0; i < C_NUM; i++) { printf("%3d-%3d円: %3d\n", (d) , (e) , dist[i]); } } これもさっぱりです・・・ 教えてください
さっぱりって言われると何教えていいか分かんないよ 先生にでも聞いたら?
簡易CG作成のプログラムなんですけど、 円を作ってそれを移動、壁で反射、色が点滅などやらなければいけなくて 移動までは出来るようになったんですが後がさっぱりでs 助けてくだしあ><
>825 宿題の答えが知りたいだけなら、宿題スレ行けよ
私も冷たいシャワーを浴びてさっぱりです
ファイルのオープンに関して質問させてください 文字列を名前にした場合 FILE = *fp; str[100] = "abc.txt"; fp = fopen(str,"r"); で行けるのですが、ファイル名を数列にしたい場合 どうすればいいのでしょうか? 例えばファイル名(0〜2.txt) int i; for(i=0; i<=2; i++){ fp = fopen(????,"r"); } ????の部分に文字列のアドレスを入力してやれば いいのだと思いcharにして&iとかしてみましたが上手くいきません 結構悩んだのですがさっぱりです!! 解説よろしくお願いします
sprintf使え
>>831 char buf[100];
int i;
for(i=0;i<=2;i++) {
sprintf(buf,"&d.txt",i);
fp = fopen(buf,"r");
//
}
834 :
833 :2007/07/22(日) 20:23:46
失敗 ×sprintf(buf,"&d.txt",i); ○sprintf(buf,"%d.txt",i);
bccだが
>>812 問題なかったぞ
バージョンは5.5.1
全くの初心者です。 います。C言語の基礎の基礎という本に添付されたCDに入っていたLSI Cを使ってプログラム のコンパイルをしようとしています。書かれていたプログラムをSample1.c という名前で保存しました。コマンドプロンプト画面で C:\CGENGO\PRACTICE>DIRを入力して調べると469 Sample1.cが保存されて いるのが分かります。 同じ画面でC:\CGENGO\PRACTICE>Lcc Sample1と入力しても SAMPLE.EXEが作成されません。どうしたらよいか教えてください。
C言語どころかパソコン初心者…? まずその本に書かれている通り導入したのか?
Windows 環境変数 PATH でぐぐる
>>837 マジで悪いことは言わないからLSI-Cはやめてbccかgcc(MinGW)にしとけ。
乗りかえるの今からでも全く遅くないから。
>>837 VisualC++2005ExpressEditionでもいいぞ
VisualC++2005ExpressEditionは初心者が C学ぶのに使うと、ANSI Cの標準関数で 非推奨な関数(scanfとか)使うとwarrningでまくりで 混乱するんじゃないか?
コピペしてそのままデバッグすると、モノによるが一瞬で消えるしな
皆さんありがとう。参考にさせていただきます。(初心者)
>>829 すいません、教えて欲しいんです。
自分でできるようになりたいです。
どうして学校の先生に聞かないんだい? そういうのも含めて授業料払ってるんだから、もったいないよ。
848 :
デフォルトの名無しさん :2007/07/22(日) 22:48:27
'y'は文字リテラルで「y」に対応する数値(0x79)を表す で、その行はこの値をline配列の0番目に代入するって意味 line[0]='y'; ←この部分の意味が知りたいです。って質問したら 上のように説明いただいたのですがまだ理解できないのでもう少し お願いします。
849 :
デフォルトの名無しさん :2007/07/22(日) 22:50:18
#include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int i, count; double x, y, pi, z; char line[20]; line[0]='y'; ←この部分の意味が知りたいです。 srand( (unsigned int) time(NULL) ); while(1){ count=0; for (i = 1;i <= 10000000; i++) { x = (double)rand() / (RAND_MAX + 1); y = (double)rand() / (RAND_MAX + 1); if(x*x + y*y < 1){ count++; } pi=(double)count / i * 4 ; z=fabs(M_PI - pi)/M_PI ; if(i==100||i==1000||i==10000||i==100000||i==1000000||i==10000000){ printf("(%d)pi=%f(%f)\n",i,pi,z) ; } } printf("もう一度やりますか(y/n)?"); gets(line); if(line[0] == 'n'||line[0]=='N'){ break; } } return 0; } 全体はこんな感じです。
>>848 その説明のどのあたりが分からないかいってみそ。
デフォで(何も入力しないで)Yesにするってことでは?
>>489 その行のプログラム中での存在意義が知りたいの?
854 :
デフォルトの名無しさん :2007/07/22(日) 22:55:57
僕も意味がないように思って質問しました。
>>851 さんの言ってることが正しいのでしょうか??
855 :
デフォルトの名無しさん :2007/07/22(日) 22:57:43
>>853 さん
そうです。なんの意味があるのかわからなくて…
あとおかしい部分ってありますか?
>>854 if()でline[0]を見る前に、gets()を通してるから、初期化しても意味ないように見えるけど。
期限ギリギリまで自分で考えても分からなければ、「分かりませんでした」って言いに行けよ。 生徒の頭悪いのは教師がなんとかするしかないんだから、文句は言えんだろ。
死ねよ。
大学はそんなに甘くない 頭も態度も悪けりゃ落とすだけ
>>860 宿題を貼り付けて「教えてください」って、丸投げだろう。
自分はこういうふうに考えたとか、分からない箇所をもっと絞り込んで質問するとかしないと。
明日提出で時間無いから自分で考えるのは無理だけど、 丸投げはしたくないから教えろってどんだけわがままなんだw 素直にあきらめるのが一番だな
生徒はまったくついていけず 教師はますます授業の難易度を下げていく 日本学生の質の悪さは先進国でダントツトップとなる こうして日本は平和になった
>>865 >日本学生の質の悪さは先進国でダントツトップとなる
断然トップトップ?
868 :
デフォルトの名無しさん :2007/07/22(日) 23:15:34
>>856 さん
じゃあやっぱあの行はいらないですか??
860は偽者じゃまいか
断凸だと思ってたぜ
大学は気持ち悪いくらいに甘々 技術者の端くれともいえないゴミが大学で教鞭振ってる現状は異常 教授なんてぶっちゃけ事務職(+他校とのパイプ役)以外のなんでもない
int a[2]={10.20};printf("%d%d,a,&a[0]") 2つの数値表示させたとき、どうなる?一緒?
でもあれだよな y/nで聞かれているのにn以外だったら継続ってのもなんだよな まぁ別にいいけどさ
>>873 まず試してからこうなったんだけどって質問に来いよ
0番目しか見てないからnipponchachachaでもループ抜ける
>>873 つうかコンパイルとおらねぇだろ、それ。
なんかもういろいろ間違いすぎだ
int a[2]={10,20}; printf("%d %d",a,&a[0]); とりあえずコンパイル通るようにしてみた。 %dのままでいいかどうかはシラネ
これは凄い間違い探しだ
同じ値にしたいなら ("%d %d",a[0],a[0]); でいいじゃないか
イロイロすまんかった。解決した。 ありがとう^^ コンパイラに切れられないように精進します。
文字列操作について質問させて下さい。 strcpyで、コピー元とコピー先が重なる場合の動作は、定義されない。 とあるんですが、これは char str[] = "abcdef"; char *p1, *p2; p1=str; p2=&str[1]; strcpy(p1, p2); とした場合の動作も未定義となるのでしょうか?
ダメです。
>>884 おもいっきり重なってないか?
重なったら未定義らしいんですが、重なってたら未定義ですか?って質問してるぞ。
887 :
884 :2007/07/23(月) 03:33:59
>>884 この場合の「重なる場合」とは、どこか一部でも重なっている場合を指す。
889 :
デフォルトの名無しさん :2007/07/23(月) 06:40:06
Windows PCの名前は何文字まで可能でしょうか?
やればわかる
C言語を少しだけ勉強したい。コンパイル用に安いVisual C++を入手 する方法を教えてください。バージョンは古くてもいいです。
>>891 その前に、BCCとCpad for BCCにしとき。
BCC なんて古くて死ぬぜ。
VC++2005EEのCL.EXEがいいぞ
まあ両方入れて同時に使ってみるべし
今更 BCC とか
#include <iostream> using namespace std; int main(){ int a, b; int *p; p = &a; *p = 0; cout << a << "-" << *p << "\n"; p--; *p = 1; cout << b << "-" << *p << "\n"; //cout << &b << "-" << p << "???\n"; return 0; } 名前の違う変数をいくつか宣言し、forとポインタを使っていっぺんに初期化をしたいのですが、 このまま実行すると、pが&bを指しているのにも関わらず、bの値が変になってしまいます。 ですが、コメントを外すと正常に表示されます。二つのアドレスも同じです。 どうしてそうなるのか、またどうすれば改善できるのか教えてください。お願いします。
スレタイ嫁
いや、これは出力がC++なだけで、Cの質問と思ってもいいのでは。 でも質問のソースは何か抜けてる。 もう一回書いてみて。printf()になおすのが望ましいが。
よかないよ。
vc2005ってNRVO効いたのか
#include <stdio.h> int main(void) { int a, b, *p; p = &a; *p = 0; printf("%d , %d\n",a , *p); *(--p) = 1; printf("%d , %d\n",b , *p); printf("%p , %p\n",&b , p); return 0; }
>名前の違う変数をいくつか宣言し、forとポインタを使っていっぺんに初期化をしたいのですが 普通に宣言時に初期化したほうがいいんじゃね? つうか配列とかC++ならvectorみたいなコンテナ使った方がいいんじゃね? って突っ込みは野暮ですか?
p--って連続したアドレスの同じ型じゃないとだめじゃん だったら配列使えばいいじゃん なんで違う値になるのか知らんが
906 :
ゆみ :2007/07/23(月) 19:03:57
大学の演習問題として出題されました。三時間考えて悩みましたがわかりません。どうか御教授お願いします。 ・char 型の配列aに"HellowWorld"の文字列を格納すること。 ・配列aからchar 型の配列bにデータをコピーすること。 ※標準関数(memcpy,strcpy等)を使用しないこと。 ・配列bからchar 型の配列cにデータをコピーすること。 ※但し、"w"、"W"は"*"にデータをすりかえてデータをコピーすること。 →配列cには文字列"Hello**orld"を格納すること。 ・printf()で表示する際は、配列cのデータを一文字づつ表示すること。 ※"o"を表示する際は、"o"を表示する代わりに"O"を5つ表示すること。 ・プロジェクト名は"ckadai3"とすること。
907 :
ゆみ :2007/07/23(月) 19:13:20
906です。 ヒントで配列のコピーはFOR文で回してあげればいいんだよ と教えてもらいましたがいまいちよくわかりません。
>>906 3時間何の勉強してたんだ?
一問目は配列とfor文だけわかれば出来ると思うんだが
それ以降もif文使えばできる
宿題スレでもいけ
つーか宿題スレ池
#include <stdio.h> #define STR_SIZE 64 void copy(char *a, char *b); void copyNotW(char *a, char *b); void PrintStrChngO(char *str); int main(void) { char a[] = "HellowWorld", b[STR_SIZE], c[STR_SIZE]; copy(b, a);printf("%s\n", b); copyNotW(c, b);PrintStrChngO(c); return 0; } void PrintStrChngO(char *str) { for(;*str;str++) if(*str != 'o') putchar(*str); else printf("OOOOO"); return; } void copyNotW(char *a, char *b) { while(*a = *b++) *a++ = *a=='w'||*a=='W' ? '*' : *a; return; } void copy(char *a, char *b) { while(*a++ = *b++); return; }
913 :
デフォルトの名無しさん :2007/07/23(月) 19:39:41
894 名前:デフォルトの名無しさん 投稿日:2007/07/23(月) 17:15:06 BCC なんて古くて死ぬぜ。 897 名前:デフォルトの名無しさん 投稿日:2007/07/23(月) 17:17:49 今更 BCC とか
BCC は switch 内に case も default もない場合にも { } 内の処理が実行されてしまう程度のコンパイラ。
915 :
デフォルトの名無しさん :2007/07/23(月) 19:41:58
914 名前:デフォルトの名無しさん 投稿日:2007/07/23(月) 19:41:25 BCC は switch 内に case も default もない場合にも { } 内の処理が実行されてしまう程度のコンパイラ。
916 :
デフォルトの名無しさん :2007/07/23(月) 19:45:45
#include <stdio.h> int main(void) { int n=1; switch(n) { printf("BCC は switch 内に case も default もない場合にも \n"); printf("{ } 内の処理が実行されてしまう程度のコンパイラ。 \n"); } return 0; } Warning W8066 Unreachable code in function main 警告も理解できない奴が何ほざいてやがるんだ?w 初心者がMT車はギアチェンジが面倒だから古いとか言っちゃっているくらい痛すぎ
917 :
えいいち ◆GRGSIBERIA :2007/07/23(月) 19:47:07
すみません。C言語に直しました。 #include <stdio.h> int main(){ int a, b; int *p; p = &a; *p = 0; printf("%d - %d\n", a, *p); p--; *p = 1; printf("%d - %d\n", b, *p); //printf("%X - %X\n", &b, p); return 0; }
for文の初期化はどこにあるんだ
>916
Unreachable code in function mainの意味は「main関数に到達不能なコードがあります」だ(return文の後に書いたコードにも同じ警告が出るはず)。
しかし実際には警告と異なり、
>>914 が書いたように実行されてしまう。
初心者にVC++2005EEなんて進めても、今度は使い方を教えてくれってなるだろw
922 :
デフォルトの名無しさん :2007/07/23(月) 20:20:59
文字コードについて、わかりやすく解説してあるサイトはないでしょうか? ASCCIコードやJISなど、何進数を使って、どういう特徴があるかなど
ASCCIコード に一致する日本語のページ 約 73 件中 1 - 50 件目 (0.20 秒)
>何進数を使って ?
>何進数を使って ワロタww 16進数でも10進数でも2進数でも値は同じだよ
>>922 文字コードについて、とりあえず知ってる語彙でググる。
上位にでてくるページをみて、語彙を増やす。
これを30分程度繰り返すだけで、そうとうのページを探せると思うけど。
928 :
ゆみ :2007/07/23(月) 21:28:24
>912 ありがとうございます。 助かりました。
929 :
えいいち ◆GRGSIBERIA :2007/07/23(月) 21:43:42
>>918 #include <iostream>
using namespace std;
int main(){
int a, b;
int c, d;
int *p;
p = &a;
*p = 0;
cout << a << "-" << *p << "\n";
//cout << &a << "-" << p << "\n";
p--;
*p = 1;
cout << b << "-" << *p << "\n";
//cout << &b << "-" << p << "\n";
930 :
えいいち ◆GRGSIBERIA :2007/07/23(月) 21:44:13
p--; *p = 2; cout << c << "-" << *p << "\n"; //cout << &c << "-" << p << "\n"; p--; *p = 3; cout << d << "-" << *p << "\n"; //cout << &d << "-" << p << "\n"; return 0; } 別にdからでも動くと思います。
931 :
922 :2007/07/23(月) 22:04:03
サンクス
932 :
デフォルトの名無しさん :2007/07/23(月) 22:04:50
-10の2進数は 11110110であってますでしょうか?
>>932 合ってる。
基数の変換はWindowsの電卓でできるよ。
934 :
923 :2007/07/23(月) 22:11:22
はい、ありがとうございました。
>>930 動くかも知れんがあまりそういうことはやらないんじゃない?
ローカル変数をスタックに積む順番ってC言語の仕様で決められてたっけ?
10 は 0000 1010 反転して 1111 0101 1足して 1111 0110 2の補数表現には反転して1足すのが楽
>>930 だから、なんでスレタイ無視してC++で書くの?
>>935 決まっていない。そもそも、スタックフレームを形成するかどうかさえ決まっていない。
つーか、まともなコンパイラなら、ちゃんと最適化すればアドレス解決演算子を使っている
a以外はスタックに置かない。それどころか存在そのものを否定するかもしれん。
938 :
デフォルトの名無しさん :2007/07/24(火) 01:19:40
普通のやり方かと・・・
別のやり方とは?
1を引いて反転するとかを言いたいんじゃない? いや、一緒なんだけどさ・・・足すほうが俺は計算しやすいな。
Cで書いたアプリケーション中で、./image/image1.bmpってファイル参照を書いてます。 これをコンパイルして、そのディレクトリで実行したら画像は表示されるのに、 別のディレクトリから、../../app みたいに実行すると画像が表示されません。 どうやったらどこから実行しても画像が表示できるようになりますか?
符号反転に-1を使うのは、なにか自分の定義に自分自身を使うようで、なんかイヤ。
>>942 画像ファイルの指定を絶対パスにてみては?
>>942 >>944 の言うように絶対パスにするとか
readlink("/proc/self/exe"); とか getenv("_") とかソースに埋め込むとか
いろいろあるだろうけど基本的にはC言語の範疇じゃないな.
>>942 これで助けになるかな?
#include<stdio.h>
#include<libgen.h>
int main(int argc, char *argv[]){
printf("%s/image/image1.bmp\n", dirname(argv[0]));
return 0;
}
>>942 これなら Windows でも Unix 系OSでもいける(日本語はNGだが)
#include<stdio.h>
#include<string.h>
int main(int argc, char *argv[]){
char *ptr;
ptr=strrchr(argv[0], '/');
if(ptr==NULL) ptr=strrchr(argv[0], '\\');
if(ptr!=NULL) printf("%.*s/image/image1.bmp\n", ptr-argv[0], argv[0]);
else printf("./image/image1.bmp\n");
return 0;
}
#include <stdio.h> int count_bits(unsigned x) { int count = 0; while (x) { if (x & 1U) count++; x >>= 1; } return (count); } int int_bits(void) { return (count_bits(~0U)); } unsigned print_bits(unsigned x,unsigned y) { int i,n=0; int temp; unsigned sum = 0; for (i = int_bits() - 1;i>=0;i--) { if ((y>>i) & 1U) temp = 1; else temp = 0;
for (i = int_bits() -n -1;i>=0;i--) temp *= 2; n++; sum += x * temp; } return (sum); } int main(void) { unsigned x,y; printf("正の整数を入力してください:"); scanf("%u",&x); printf("正の整数を入力してください:"); scanf("%u",&y); printf("\n%3u×%3u=%3u\n",x,y,print_bits(x,y)); return(0); } 123 x 13 = 123 x 2^3 + 123 x 2^2 + 123 x 2^0 みたいに計算したいのですが、結果が0と表示されます。 なぜでしょうか?
ま た s c a n f か
両方のforのループカウンタでiを使ってるけどこれは意図してこう書いてるの?
Visual C++を入手するには Visual Studioを購入しなければならないのですか?
コマンドライン版だけ欲しいってことならPlatformSDKでも落としとけ
>>953 VisualC++2005ExpressEditionは無料でダウンロードできるよ
>950 >for (i = int_bits() -n -1;i>=0;i--) >temp *= 2; >n++; iじゃなくて別の変数にすべきだし>=じゃなくて>だろってのはおいといても、temp << i で十分だろ
そのメール欄からして
>>891 か
答え書いてあるのに読めないのか?
別人だとしてこのスレぐらい全部読めよ
っていうか入門書だとかに大抵無料のコンパイラついてくるんだからそれ使えよ
>892 大変失礼しました。わたしの質問891が1時間ほど待っても表示され なかったのでgive upしてしまったのです。よく分かりました。 ありがとうございました。
>>956 unsigned print_bits(unsigned x,unsigned y)
{
int i;
int temp;
unsigned sum = 0;
for (i = int_bits() - 1;i>=0;i--) {
if ((y>>i) & 1U)
temp = 1;
else
temp = 0;
temp << i
sum += x * temp;
}
return (sum);
}
変更したのですが、コンパイルすると、コードは効果を持たない(関数 print_bits )とでてしまいました。
どうしてでしょうか?
int_bits()がどこから出てきたのか我々には分かりません。
>>960 >>949 にあるんだけどね。
流れを追えないだけじゃなく、見当違いだから黙ってていいよ。
>>959 sum += x * (temp << i)でいいということだろ。
>>961 temp << i
sum += x * temp;
でも問題ないだろ
セミコロンが無いのはともかく
いやそれは問題あるだろ temp <<= i; としたいのか?
なんだってこのスレはこんなに頭の弱い子ばかりなんだろう……
入門篇だからだよ
すいません、わかりました。 temp = temp<<i; でいけました。ご迷惑おかけしました
何だこのバカさ加減は。
その他人を見下す性格、あらためた方がいいと思うよ
何百回も繰り返しcallされる関数が有るのですが、最初にcallされ た場合に限り、特別な処理がしたいと思っています。staticなフラ グを宣言すれば出来るには出来るのですが、何百回もcallされるの に、最初の一回の為にフラグをチェックするのはちょっとバカバカ しい。何か良い方法は無いでしょうか?
>>969 「最初にcallされた場合」フラグを関数内に持たず、関数外から引き数で与えては?
高々数百回程度じゃ歯糞にもならないけどね。
関数ポインタで func = first_func; ... func = second_func; とかやればいいんだけど普通の関数コールに比べてオーバーヘッドが発生するんで フラグのチェックよりマシとは言いがたい。
>最初の一回の為にフラグをチェックする のではなく、 2回目以降全ての為に(1回目も)フラグをチェックする と考えてはどうだろう。 いや、どうでもいいけどね。
>>972 オーバーヘッドについて詳しく。
私の知る限り、イミディエイト関数呼び出しとレジスタ間接関数呼び出しで
大きく処理時間が異なるCPUはないのだけれど。
#寧ろ、某CPUはレジスタ間接の方が速いし。
>>974 昔のパソコンは結構効いてたけど、最近のはあんまり関係ない気がする。
レジスタに関数のアドレスをセットするのがオーバーヘッドになるって事でしょ
>>976 それもまた、今のCPUなら殆ど無視できる。
計測は力なり
Efficeon搭載機を使う、とか…
多少汚くても高速なCPUが力押しで処理してくれるのはいいんだが 初心者の小規模なプログラムだと「こっちのほうが高速だぜ」って言われても実感できない…
知らぬ間にメモリ参照のコスト0の新技術が開発されたのかと思ったぜ
関数呼び出しそのもののオーバーヘッドに対して、充分無視できるって話なだ。
いや、static なフラグのチェック処理と比べるべきじゃないか。 このフラグのチェックも、 キャッシュと分岐予測が効けば大したことなさそうではある。 まあ、コスト 0 ではないだろうが。
だからそもそも、高々数百回ごときで時間云々する意味がないっしょ。 staticにする場合はマルチスレッドの場合に問題がないか確認する必要はあるね。
985 :
デフォルトの名無しさん :2007/07/24(火) 19:30:58
This is a pen. を取得するプログラムを書きたいのです。 で char str[1024]; while(1){ scanf("%s", str) func(str);//funcと言う関数に"This is a pen."を一度に入れたい。 } こういったプログラムを書いてThis is a pen.と入力すると、何故か 1周目のループで、Thisが入り、2週目でis・・・5週目で.が入ってしまいます。 こういう問題はどのようにすれば解決するのでしょうか?
>>985 scanf("%1023[^\n]", str)
素直にfgets(str, sizeof(str), stdin)を使うべきだとは思うが。
>>985 scanfは空白で入力が区切られるようになっている。
989 :
デフォルトの名無しさん :2007/07/24(火) 22:39:57
1Gは1000.000バイトらしいのですが、どうやって求めるのでしょうか? どうやれば、ギガをバイトにするのでしょか?
これはひどい
>>989 単位なんだから、もとめるもなにもないだろう。
K -> M -> G で、1000倍していけばいいよ。
1024
>>992 HDDメーカじゃないかな
あの業界だけ1000単位
テラワロスとかって書き込みみても、どのくらいワロスのかピンとこないかわいそうな子。
Kなら1024だけどkなら1000 容量なら1024だけどスループットなら1000
997 :
デフォルトの名無しさん :2007/07/24(火) 22:57:41
サンクスです
>>992 解説の例題問題にありました。
998 :
989 :2007/07/24(火) 23:04:10
>>991 となると、1000.000.000 ではないのでしょうか?
1000 :
デフォルトの名無しさん :2007/07/24(火) 23:09:42
1000なら1K
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。