C言語なら俺に聞け(入門篇) Part 16

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 15
http://pc11.2ch.net/test/read.cgi/tech/1182719692/


教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 92代目
http://pc11.2ch.net/test/read.cgi/tech/1183511364/
2デフォルトの名無しさん:2007/07/10(火) 02:54:21
3デフォルトの名無しさん:2007/07/10(火) 03:00:02
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
>>3
ひー難しい、頭がぱんくしそうです
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;
}
}
}
}
今の現状です。。。見るも無残な姿です。。。
7デフォルトの名無しさん:2007/07/10(火) 03:19:08
>>5
小学生でも分かると思うぜ・・・
落ち着いて読めば分かるはずだ。
8デフォルトの名無しさん:2007/07/10(火) 03:35:01
>>4を良かったら教えてください。
9デフォルトの名無しさん:2007/07/10(火) 03:37:42
>>6のライブラリでええやん。
10デフォルトの名無しさん:2007/07/10(火) 03:42:28
これじゃまったく機能しないんですが・・・
10こ数字を入力するプログラムを
これにどう繋げればいいかわからなくて。。。
11デフォルトの名無しさん:2007/07/10(火) 03:43:55
mainの中に配列要素10の配列に数値を入力していれればええやん・・・ってそれがわからんのか orz
12デフォルトの名無しさん:2007/07/10(火) 03:47:21
なんか実行した画面で
「数字を10個入力してください」
見たいな感じなやつが出てきて、そこに10個数字入力してenter押したら結果が出てくるみたいなプログラム作るんですけど。。。
13デフォルトの名無しさん:2007/07/10(火) 03:48:59
>>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
す。。。すごい。
何がなんだか。。。これって初歩的なんですかね?
自分には天才にしか見えないんですけど。。。
15デフォルトの名無しさん:2007/07/10(火) 03:55:30
BubSort(a,sizeof(a)/sizeof(a[0]));
BubSort(a,MAX);  < ここはMAXで良いや。配列の要素の数を入れるんだが
16デフォルトの名無しさん:2007/07/10(火) 04:16:44
携帯から書きます!
連続投稿ですか?5回みたいな規制がかかって書けません!

そこのプログラムは変えても実行時に変化はないんですか?
17デフォルトの名無しさん:2007/07/10(火) 04:33:10
あるないは実行して確認すりゃええやろ。。。
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;
}
授業で習っていない文字を省いて自分なりに出来ました!
ありがとうございました!
21デフォルトの名無しさん:2007/07/10(火) 11:07:27
fgetsは使いだね。
22デフォルトの名無しさん:2007/07/10(火) 14:06:28
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] );
23デフォルトの名無しさん:2007/07/10(火) 14:07:56
int num[]={1,2,3,4}

main()
{
srand( (unsigned)time( NULL ) );
for(i= 0; i < 6;i++){
printf( " %d ", num[rand()%4] );
}

これでrandで同じ数字をかぶらないようにするにはどううすればいいでしょうか?
24デフォルトの名無しさん:2007/07/10(火) 14:12:00
4つで6回回したら必ずかぶると思うが。
実行するたびに要素減らして乱数の最大も減らしてけば?
25デフォルトの名無しさん:2007/07/10(火) 14:19:41
>>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;
}
26デフォルトの名無しさん:2007/07/10(火) 14:25:30
>>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;
}
27デフォルトの名無しさん:2007/07/10(火) 15:36:04
>>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;
}
}
29デフォルトの名無しさん:2007/07/10(火) 16:26:58
>>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;
}
30デフォルトの名無しさん:2007/07/10(火) 16:44:49
>>29
すごい出来てる
ありがとございます

でもswapで一体何をしているのかが分からない(><;
31デフォルトの名無しさん:2007/07/10(火) 16:53:53
2ちゃんもそろそろム板とマ板だけでも半角インデント使える用にしてくれよ
32デフォルトの名無しさん:2007/07/10(火) 17:02:43
ブラウザの仕様だし。。。。どうしろと
&nbsp;に変換?
33デフォルトの名無しさん:2007/07/10(火) 17:11:19
メ欄にpreって書けばpreタグで囲ってくれるとか
34デフォルトの名無しさん:2007/07/10(火) 17:12:09
専ブラが対応しなくてかえって大変になるかも
35デフォルトの名無しさん:2007/07/10(火) 17:14:51
独自datパーザ入れてる専ブラなら単に
<pre>
ソースコードざんす
</pre>
って出るか、もしくは単にpreタグなんてシラネと無視されるっしょ

IEのエンジン借りてる専ブラのなら問題ないっしょ
36デフォルトの名無しさん:2007/07/10(火) 17:21:47
専ブラなら自前でDATを解析するもんだろ。
でないとなんのための専ブラなんだか。
37デフォルトの名無しさん:2007/07/10(火) 17:26:58
<code>で囲えるようになったらいいのに
38デフォルトの名無しさん:2007/07/10(火) 17:34:25
今いまんとこ書込時に空白とタブを に置き換えてくれるギコナビの機能を使っている。
よそのブラウザでも似たような機能はあるんじゃないの?
39デフォルトの名無しさん:2007/07/10(火) 18:37:48
書き込みはそれでいいが問題はコピペする時
40デフォルトの名無しさん:2007/07/10(火) 20:04:17
> 991  From:デフォルトの名無しさん  Date:2007/07/10(火) 00:32:55   Mail:sage
>  すいませんマージソートの非再帰的なプログラムってどうすればいいですか?

マージソートの再帰ってそんなに深くならないはずだよね?
非再帰にする必要あるのかな
41デフォルトの名無しさん:2007/07/10(火) 20:28:03
必要云々より、それが課題になっているんでは?
42デフォルトの名無しさん:2007/07/10(火) 20:34:12
>>40
スタックもケチりたいくらいワークエリアが狭いとか?
43デフォルトの名無しさん:2007/07/10(火) 20:47:05
まあ、再帰にしなくちゃいけないほど、
非再帰にしづらいわけでもないと思うし、
どっちでもいいんじゃね?
44デフォルトの名無しさん:2007/07/10(火) 21:46:33
糞スレ立てるなよ
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じゃね?
46デフォルトの名無しさん:2007/07/10(火) 22:12:19
機種依存文字
47デフォルトの名無しさん:2007/07/10(火) 22:15:46
>>45
>PS/2
PS/2にホットプラグイン機能はない
48デフォルトの名無しさん:2007/07/10(火) 23:10:48
>>47
でもそれ以外は1だよね
49デフォルトの名無しさん:2007/07/10(火) 23:15:39
>>48
1)USBは・・・転送速度が遅いので・・・外付け固定ディスクなどとの接続には不適切→2
2)1
4)詳しくないが 精度低<ボール式、光学式、レーザ式>精度高→たぶん2
5)CUI−キーボード、GUI−マウス→2
6)しらない
50デフォルトの名無しさん:2007/07/11(水) 00:26:29
下のは階乗を配列を用いて表示するプログラムの一部分なのですが、  

  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からってどうなるのでしょうか?
5150: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言語でどう書けばいいのでしょう(泣)
助けてくださぃ!
53デフォルトの名無しさん:2007/07/11(水) 02:33:15
別名「ホモのハッテン場問題」とも言う
54デフォルトの名無しさん:2007/07/11(水) 02:58:55
組み込み系の問題にあるのですが、
517,120,000バイト→0.52GB,  または 517,120,000/10243=0.48GB
どうして、こうなるのか、ちんぷんかんぷんです。
55デフォルトの名無しさん:2007/07/11(水) 08:43:49
初め何のことか分からんかったけど10243は1024の3乗のことか。
517,120,000/(1024*1024*1024)≒0.48
56デフォルトの名無しさん:2007/07/11(水) 08:48:31
組み込み系だと517120000バイトを0.52GBっていう環境があんの?
57デフォルトの名無しさん:2007/07/11(水) 11:13:47
だれかオレに難問をぶつけてくれーっ!
>>57が申しております
58デフォルトの名無しさん:2007/07/11(水) 11:56:05
※ハードディスクの容量は1Mバイト=1000Kバイトで計算しています
とかじゃねーの?
59デフォルトの名無しさん:2007/07/11(水) 11:59:32
>>5
俺も思った。特に
「半端な数字だけど、下位桁は0が並ぶ」ってあたり。
(んな小さいディスクもイマドキないけどもさ)
60デフォルトの名無しさん:2007/07/11(水) 14:10:33
“エラトステネスのふるい”の考え方を用いて、1000以下の素数を全て表示するプログラムを作成せよ。 
っていう問題なんですけど、“エラトステネスのふるい”がどんなのかはわかったのですが、
どういう式をたてれば作れるのかはいまいちわかりません。。。
わかる方おしえてくれませんか?
61デフォルトの名無しさん:2007/07/11(水) 14:17:07
>>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;
}
62デフォルトの名無しさん:2007/07/11(水) 14:21:28
>>60-61
>>1 読め間抜け。

>>60
ttp://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
これでも判らなきゃ、
>どんなのかはわかったのですが、
は気のせい。
答えだけ知りたいなら宿題スレ池。
63デフォルトの名無しさん:2007/07/11(水) 14:23:56
>>62
間抜けどころかバカはお前じゃ、詩ねよカス。何偉そうにしてんだ、お前?
おまえ何?ここのスレの主?一番偉い人?じゃなきゃ黙って引っ込んでろや、知ったかのクズ。
弱い犬ほどよく吠えるとはよく言ったもんだw
64デフォルトの名無しさん:2007/07/11(水) 14:25:43
>>62
なんだこいつ?頭おかしいんじゃね?そんなこといったら過去ログを見たら
間抜けだらけじゃん。お前が間抜けだってことに気づけよ、井の中の蛙w
65デフォルトの名無しさん:2007/07/11(水) 14:26:59
> ttp://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
> これでも判らなきゃ、
m9(^д^)プププッ、プギャーーー!これはエラトステネスについてであってC言語のソースじゃねーしwwwwwww
バカで間抜けはお前じゃ、ボケが。偉そうに自治厨ぶっている割にはお前が一番アホだろ >>62
66デフォルトの名無しさん:2007/07/11(水) 14:32:27
>>62 お前が >>1 とスレタイ読め、間抜け。
ttp://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
どう考えても↑はC言語についてではありません、ありがとうございますた。
> 答えだけ知りたいなら宿題スレ池。
だからC言語のソースで答えて良いじゃん、なんだこいつ?頭おかしいんじゃね?
それに、宿題じゃなきゃ宿題スレってのも、ねぇ・・・本当にお前日本語理解できている?
質問 = 宿題か?とりあえずお前はもう来なくて良い。ここ、お前が主体のスレじゃないから。
67デフォルトの名無しさん:2007/07/11(水) 14:32:51
>>61ありがとうございます!
このLIMITっていうのはどんなときに使うやつなんですか?
68デフォルトの名無しさん:2007/07/11(水) 14:47:01
>>67
ん〜〜細かい説明は面倒くさい。16までの素数を求める場合、16の正の平方根4*nで16以下のものを
篩い落とせば良い。nが平方根以上になっても、結局nが平方根以下までにとった値と同じになるだけだから
やるだけ無駄。
69デフォルトの名無しさん:2007/07/11(水) 14:49:41
>>68をちと訂正。面倒くせぇ〜。
2以上、16の正の平方根4以下 * nね。偶数はもう無視して奇数*nを落としているけど。
70デフォルトの名無しさん:2007/07/11(水) 14:56:06
>>69わざわざすいません。。。。
なんとなくわかりました!!!
とにかく無駄を省くためにLIMITは使ってあるってことでいいのでしょうか?汗
71デフォルトの名無しさん:2007/07/11(水) 15:06:25
>>70 まぁ、そういうこと。LIMIT以上は既に篩い落とされているのが分かりきっているから無駄なんで。
72デフォルトの名無しさん:2007/07/11(水) 15:08:45
>>70 あと、LIMIT以下 * n の n がとる値は、素数自身を篩い落としちゃまずいから
n は当然2以上ね。for(j=2*i; j<=MAX; j+=i) < この部分がそれに該当しているんだが・・・
73デフォルトの名無しさん:2007/07/11(水) 15:43:47
>>72おぉ!
なるほど。。。。
74デフォルトの名無しさん:2007/07/11(水) 16:19:05
>>63-66 もちつけ
75デフォルトの名無しさん:2007/07/11(水) 16:20:29
>>66
>質問 = 宿題か?

>>1
>教えて欲しいのではなく丸投げしたいならこちらへ

>>66
>本当にお前日本語理解できている?
76デフォルトの名無しさん:2007/07/11(水) 16:38:14
>>75
さすがにそれはお前の勘違いだ、痛すぎ。反論したつもりが自分の理解力の無さを露呈しただけ。
失せろ。ここはお前が主のスレじゃねーんだから。あぁうぜぇ。答えたくないならお前が答えるなよ。
77デフォルトの名無しさん:2007/07/11(水) 16:40:10
>>75
え?お前あれが ○投げ であって 質問 じゃないとでも思ってるわけ?痛すぎ・・・バカだこいつ。
アホ○出し。お前、ほんっと日本語を理解していないだろ?っつか、日本語じゃないな。
相手を理解する能力がないだけだろ。良く言われるだろ、お前は協調性に欠けるって。
そんなんだから社会に適合せず、こんなところでも自分の勘違いをしてスレになじめないでいるんだよ。
頼むからお前が気に食わないからっていちいち間抜けとか煽ってこないでくれ。お前が間抜けじゃ。
78デフォルトの名無しさん:2007/07/11(水) 16:42:20
>>60には
> わかる方おしえてくれませんか?
って書いてあるじゃん。んで>>1って
> 教えて欲しいのではなく丸投げしたいならこちらへ
教えてくれませんかって書いてあって、宿題の丸投げか?まぁ、人それぞれ受け止め方が違うとは言え
さすがに決め付け過ぎだろ。落ち着けよ、間抜けな引きこもり >>62 m9(^д^)
79デフォルトの名無しさん:2007/07/11(水) 16:44:00
>>62
いや、お前の場合エラトステネスについてであってC言語でどうソースを記述するかじゃないから、↓これは。
ttp://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83%8D%E3%82%B9%E3%81%AE%E7%AF%A9
お前痛すぎ。やっぱ日本語理解してないわ、このガキ。相手にするだけむなしいから
これ以上お前にレスせずにスルーするから。頼むから間抜けなお前に間抜けなんていわれたくないんで
お前が気に食わないってだけで噛み付いてこないでくれない?きめぇ
80デフォルトの名無しさん:2007/07/11(水) 16:45:29
またこいつか。死ねよキチガイ。
81デフォルトの名無しさん:2007/07/11(水) 16:47:54
#include <math.h>
ってどういう意味があるんですかね?
82デフォルトの名無しさん:2007/07/11(水) 16:52:20
さすがにレスソースを書いた奴にまで罵倒するなんて、痛々しい。
過去ログ読んだらほとんどの人が間抜けになるじゃんか。
だいたい、質問者を自分より劣るもんだと思って罵倒する奴はこのスレにはいらねーって。
頼むからそういう見下す奴や、自分ルールで他人を不快に思うくらいならこんなスレに来るなって。
そんなことで苛立っている自分が間抜けに思えないのか?>>62 お前が一番恥ずかしい。
83デフォルトの名無しさん:2007/07/11(水) 16:54:08
>>62 < なんだこいつ?車の運転で、自分が後ろから追突したのに、いきなり
停止するなよとかいちゃもんつけてきそうな基地外だな。前方不注意はほぼ100%
追突した側の過失だから。お前みたいな他人を邪魔者扱いする奴はここに来なくて良いよ。
はい、バイバイ。巣にお帰り。
84デフォルトの名無しさん:2007/07/11(水) 16:54:23
>>81
sin()
cos()
tan()
asin()
acos()
atan()
sinh()
cosh()
tanh()
exp()
log()
log10()
pow() べき乗
sqrt() 平方根
fabs() 絶対値
fmod()

このへん使いたい時にインクルードする
85デフォルトの名無しさん:2007/07/11(水) 16:55:21
>>62
お前が >>1 読め間抜け。
86デフォルトの名無しさん:2007/07/11(水) 16:55:33
>>81は“エラトステネスのふるい”のことについて聞いた私です。
87デフォルトの名無しさん:2007/07/11(水) 16:57:34
                   ∧,, ∧   < >>62
                   (`・ω・´)  
                     U θ U  >>1 読め間抜け。
                 / ̄ ̄T ̄ ̄\
                |二二二二二二二|
                |        |
パシャ パシャ  パシャ パシャ パシャ  パシャ パシャ パシャ パシャ パシャ
   パシャ パシャ パシャ パシャ パシャ  パシャ パシャ パシャ  パシャ  パシャ
 ∧_∧      ∧_∧     ∧_∧  ∧_∧    ∧_∧     ∧_∧
 (   )】      (   )】    (   )】 【(   )    【(   )    【(   )
 /  /┘ .   /  /┘.    /  /┘ └\ \   └\ \   └\ \
ノ ̄ゝ     ノ ̄ゝ      ノ ̄ゝ     ノ ̄ゝ    ノ ̄ゝ     ノ ̄ゝ
88デフォルトの名無しさん:2007/07/11(水) 16:58:55
(´-`).。oO(夏休みだなあ…)
89デフォルトの名無しさん:2007/07/11(水) 16:59:20
>>84ありがとうございます!!
sqrtをプログラムで使うには書く必要があったわけですね!
なんか初歩的なことばっかでごめんなさい。。。
90デフォルトの名無しさん:2007/07/11(水) 17:02:10
>>89
エラスネロトスの篩の場合、sqrtは使わなくてもできるけどね
91デフォルトの名無しさん:2007/07/11(水) 17:05:16
>>81 まぁ、ここの math.h に該当しているライブラリを使用するときに取り込むヘッダ
ttp://www.bohyoh.com/CandCPP/C/Library/hindex.html
92デフォルトの名無しさん:2007/07/11(水) 17:07:57
>>89そうなんですか?
どうすればいいんですかね?
93デフォルトの名無しさん:2007/07/11(水) 17:10:32
>>92
for(i=3; i<=LIMIT; i+=2) {
for(i=3; i*i<=MAX; i+=2) {
94デフォルトの名無しさん:2007/07/11(水) 17:14:38
2を除く偶数の要素はすべて使い物にならなくてメモリーがもったいないから誰か改善して
95デフォルトの名無しさん:2007/07/11(水) 17:16:21
>>94
2n+1を使って工夫したってやぁ
96デフォルトの名無しさん:2007/07/11(水) 17:20:26
>>93無駄な平方根上も計算しちゃえば良いってことですね?
まだ#include <math.h>とかsqrtとか習ってないんでちょっと分からなかったんですよね。。。
97デフォルトの名無しさん:2007/07/11(水) 17:24:24
>>96
いやいや、理屈からしてMAXの平方根を取らないなら、二乗した値がMAX以下ってことにすりゃ良い
98デフォルトの名無しさん:2007/07/11(水) 17:37:12
速度的には、毎回演算しないですむ平方根のほうが早くなるね
99デフォルトの名無しさん:2007/07/11(水) 18:30:31
前の最大値を保存しとけば、
そこまでは自乗チェック必要ないだろ。
100デフォルトの名無しさん:2007/07/11(水) 18:36:15
>>99 お前さぁ、さんざん間抜けだのバカにしておいて、その程度の答か?笑える。痛々しいわ
101デフォルトの名無しさん:2007/07/11(水) 18:37:43
>>99
> 前の最大値を保存
激  し  く  意  味  わ  か  ん  ね  っ
102デフォルトの名無しさん:2007/07/11(水) 18:49:37
>98
二乗とsqrtは単純に回数で比較できないって話が前になかったっけ?
103デフォルトの名無しさん:2007/07/11(水) 18:52:41
>>99
お前が書いた >>62 を読め間抜け
104デフォルトの名無しさん:2007/07/11(水) 18:57:44
>>100
俺は横レスだがなw

>>101
前の数でふるいに使った素数の最大値(正確にはそのインデックス)を保存しておくだろ?
次の数はそれより大きいんだから、少なくともそこまでの素数でチェックしないといけないってのは、
自乗してチェックすることなく分かる。

あとはその次の素数でふるう必要があるかどうかを調べればいいだけだから、
毎回1回の自乗チェックで済む。
105デフォルトの名無しさん:2007/07/11(水) 18:58:58
32^2 = 1024 すなわち底が整数であるとわかっているからMAX 1000以下なら
for(i=3; i*i<=MAX; i+=2) < この i が33になった時点でループは止まる。
3から始まって2ずつインクリメントして33まで、i*i の回数なんて大したもんじゃない。
まぁ、数が大きくなりゃそれも増えるが、MAXの正の平方根を取るやり方で良いだろ。
さぁ、そろそろこの話はお開きにしようぜ。>>62がまたファビョると困るから。
106デフォルトの名無しさん:2007/07/11(水) 19:00:18
>>104
横レス?モロに>>62だってバレてんすけど?あぁ痛々しい。自分で勝手に丸投げだと思って
>>1にある他のスレに誘導したくせに、>>61のソースに対する質問に答えてやんの。白々しいぜ、こいつ。
107デフォルトの名無しさん:2007/07/11(水) 19:02:09
>>104
いや、お前の理論はソースで形にして説明してくれ。多分お前の勘違い。
っつーかあのソースの仕組みが分かってないみたいだし。
108デフォルトの名無しさん:2007/07/11(水) 19:11:40
>>107
素数を順番に生成していく形のプログラムにしてるのかと思ったら、
表から斜線で消していくような形のプログラムにしてたんだな。
それなら俺のやり方は無理だな。
109デフォルトの名無しさん:2007/07/11(水) 19:13:45
いったい、MAXの平方根を何回計算するつもりなのかと
110デフォルトの名無しさん:2007/07/11(水) 19:32:08
>>108 なんだ >>62 じゃないのか、つまらん。煽って悪かったなw
11154:2007/07/11(水) 20:23:35
レス、ありがとうございます。

>>55
わかりましたが
517,120,000バイト→0.52GB, どうして、こうなるのでしょうか?
11254:2007/07/11(水) 20:25:12
あと、因みに1
"0243は1024の3乗のことか。
517,120,000/(1024*1024*1024)≒0.48" は、
どうやって逆算と言うか求めたのでしょうか?

>>56
休憩欄に書いてありました・・・
113デフォルトの名無しさん:2007/07/11(水) 20:41:39
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;
}

115デフォルトの名無しさん:2007/07/11(水) 22:50:08
それってCの問題っていうより数学の問題じゃね?
116デフォルトの名無しさん:2007/07/11(水) 23:20:52
>114
ループ内においてm * a - n は、常にmより小さくなるので、
最終的にはn % mは必ず0になりループを抜ける。
117デフォルトの名無しさん:2007/07/12(木) 00:17:08
>>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より自明って事で済ましてました。
点がもらえるか微妙・・・
ありがとうございました
118デフォルトの名無しさん:2007/07/12(木) 00:49:33
C言語的には m * a - n は m - n % m って書き換えられる。
でn % m != 0 のとき 0< n % m < m だから途中で割り切れなくても最終的には1になる。 
119デフォルトの名無しさん:2007/07/12(木) 14:45:12
cのソースに必ず載ってるreturn(0);ってのはjavaでいうSystem.exit(0);みたいなもん?
120デフォルトの名無しさん:2007/07/12(木) 14:55:42
Cには exit(0); という関数はある。
Javaもreturnはあるだろ?
121デフォルトの名無しさん:2007/07/12(木) 14:56:14
>>119
Javaの「return 0;」と同じ。
122デフォルトの名無しさん:2007/07/12(木) 15:10:55
なるほどthx
123デフォルトの名無しさん:2007/07/12(木) 18:53:39
ファイルに
数字と文字がたくさん書かれているんだけど
そのファイルから数字だけを取り出すプログラムを作りたいんだけど
124デフォルトの名無しさん:2007/07/12(木) 18:58:16
1文字ずつ調べて数字だけ採用すればいい
125デフォルトの名無しさん:2007/07/12(木) 18:58:36
なるほど
126デフォルトの名無しさん:2007/07/12(木) 21:17:44
テキストに
AAAA BBBBBB CCCCCCCC

11111111 2222222222 3333333

を作って読み込んで
AAAA
BBBBBB
CCCCCCCC
11111111
2222222222
3333333
となるプログラムを作成せよ。
127デフォルトの名無しさん:2007/07/12(木) 21:26:37
いいえ
128デフォルトの名無しさん:2007/07/12(木) 21:34:20
スク水マンセー!
129デフォルトの名無しさん:2007/07/12(木) 21:44:32
そのままじゃねーかw
130デフォルトの名無しさん:2007/07/12(木) 22:50:51
>>126
口のききかたら偉そうだから教えてあげない。
131デフォルトの名無しさん:2007/07/12(木) 22:55:39
ごめんなさい。
あまりに簡単な問題だから聞くのが恥ずかしかったんです・・・
明日までに解決したかったんですが、あきらめます。
すみませんでした。
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; } }

を詳しく解説してくれる方いたらお願いします。
133デフォルトの名無しさん:2007/07/13(金) 02:26:01
エラトステネスのふるい でぐぐると幸せになれると思う
134デフォルトの名無しさん:2007/07/13(金) 02:29:13
なんかここ数日ほどこの類の書き込みをよく見るな
135デフォルトの名無しさん:2007/07/13(金) 02:29:52
なんとなくやりたいことはわかるんですけど。。。
c言語あまり詳しくないので
for(j=2*i; j<=MAX; j+=i)
がどういう計算をしているのかわかんないんです。。。
136デフォルトの名無しさん:2007/07/13(金) 02:30:33
素数の倍数を除外してる
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.....見たいな感じで計算してるんですか?
138デフォルトの名無しさん:2007/07/13(金) 02:39:03
そうだね
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
rmコマンドの解析をしたいのですが、中身で行われる処理の流れを
おおざっぱでもちろん構わないので教えていただけないでしょうか?
もしlinux等スレ違いでしたらご指摘ください。

コマンドソースは以下のものです
ttp://sourcejam.com/jp/fileutils-4.1/rm_8c-source.html

宜しくお願いします。
142デフォルトの名無しさん:2007/07/13(金) 03:24:25
>>140
定義はすでにコンパイル済みのバイナリの中にある(.lib形式とか)。
リンク時にこいつを一緒にリンクしてる。
.dllの場合は実行時にリンクっぽいことをする。

>>141
mainの最初のwhileでオプションのパース、
次のifで引数の個数の確認っぽいこと、
最後のforで指定された各ファイルの消去、といった感じかな
143デフォルトの名無しさん:2007/07/13(金) 03:49:18
>>142
勉強になりました!
ありがとうございましたm(__m
144141=143:2007/07/13(金) 03:50:30
連投すみません。
解決の有無を明確にしたほうがよいかと思いまして。
ありがとうございました!
145デフォルトの名無しさん:2007/07/13(金) 16:32:41
char型のcharってcharacterの略で%nのnはnewlineの略ですよね?
こういう略してある語の元の単語が載ってるサイトってないですかね?
探してもこの2つしかわからなくて
146デフォルトの名無しさん:2007/07/13(金) 16:51:07
>>145
マルチかよ糞が。
147147: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
このように編集する感じです。アルゴリズムをおしえてほしいです
149デフォルトの名無しさん:2007/07/13(金) 17:25:19
>>145
ANSI C言語辞典買えよ
いろいろ乗ってる
150デフォルトの名無しさん:2007/07/13(金) 17:44:19
>>148
forループで3文字毎にカンマぶち込むだけだろ。
小数点以下は好きなようにやれ。
151デフォルトの名無しさん:2007/07/13(金) 17:46:34
いろんなやり方があるけど、練習なら、一回目スキャンして数を数えて
2回目でコピーしながらカンマを入れてみては
152デフォルトの名無しさん:2007/07/13(金) 17:51:15
>>147
unsignedにすればlongでもオーバーフローしないだろ?
もったいない使い方だが
153デフォルトの名無しさん:2007/07/13(金) 17:53:51
文字列に直すのにオーバーフローも糞もないだろ
154デフォルトの名無しさん:2007/07/13(金) 18:04:14
10進数を0と1だけの文字列に変換するんだろ?
配列の要素数を十分に確保しとけばいいだけだよな
155デフォルトの名無しさん:2007/07/13(金) 18:08:46
>>145
いや%nじゃないだろw
156デフォルトの名無しさん:2007/07/13(金) 18:10:02
なんという揚げ足。
157147:2007/07/13(金) 19:01:25
unsignedでも足りず、intの配列で解決しました。
158デフォルトの名無しさん:2007/07/13(金) 19:07:11
>>157
なんで5桁の10進数でそんなことになるんだ
159デフォルトの名無しさん:2007/07/13(金) 19:10:48
10進化2進数にしたとか?
160デフォルトの名無しさん:2007/07/13(金) 19:26:46
>>157
char配列がいいんじゃない?
161デフォルトの名無しさん:2007/07/13(金) 19:58:00
キーボードから2つのファイル名を入力すると2つのファイルの内容が同じか
どうか調べるプログラムを作成したいんですけどアルゴリズムを教えてほしいです。


プログラムを実行すると,まず,ファイル名を2つ入力する.入力したファイ
ル名のファイルの始めから終わりまでを読み出したものを比較して同じであっ
たら"same",違っていた場合は"not same"と表示してプログラムを終了する.
ファイルが開けない場合は、"cannot open file"と表示して終了すること
162デフォルトの名無しさん:2007/07/13(金) 20:01:09
入力したファイル名のファイルの始めから終わりまでを読み出したものを比較する。
163デフォルトの名無しさん:2007/07/13(金) 20:05:08
アルゴリズムと呼ぶのをはばかる程度の内容だ
164161: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;}
165デフォルトの名無しさん:2007/07/13(金) 20:27:59
何故whileループが2つある?
文字が一致しなかったらフラグでも立ててbreak、その後フラグを見て表示を変えればいいだけだろ
初心者ならフローチャートでも書いてからプログラム作れよ。
勘で作るからそんな意味不明なプログラムができるんだよ
166161:2007/07/13(金) 20:29:29
whileは1個ですけど…
167デフォルトの名無しさん:2007/07/13(金) 20:37:45
>>165
やれやれ、説教するだけでまともに答えられない初心者か。お前みたいなのがうざいんだよ。
ほれ >>62 とかぁ〜w
168デフォルトの名無しさん:2007/07/13(金) 20:41:42
>>167
君が答えてもいいんだよ
169デフォルトの名無しさん:2007/07/13(金) 20:45:56
>>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;}
170デフォルトの名無しさん:2007/07/13(金) 20:52:48
あかん、よく考えたら >>169 じゃ不十分な点があった・・・さて、どう対処しようかしらん。考え中
171デフォルトの名無しさん:2007/07/13(金) 20:56:17
>>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) ){
172デフォルトの名無しさん:2007/07/13(金) 20:56:22
>if((fin=fopen(sfn1,"rb"))==NULL || (fout=fopen(sfn2,"rb"))==NULL){
最低最悪な変数名の例だな。
173デフォルトの名無しさん:2007/07/13(金) 20:59:33
foutワロタw
174デフォルトの名無しさん:2007/07/13(金) 21:01:06
>>172 俺もそれはオモタ。
>>171をやったらやっぱ駄目だったっけ。っつか面倒だから>>169で。
175デフォルトの名無しさん:2007/07/13(金) 21:09:07
>164
whileループの中でEOFの判定なんかしちゃだめだろ。
176デフォルトの名無しさん:2007/07/13(金) 21:17:59
>>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;}
177デフォルトの名無しさん:2007/07/13(金) 23:31:01
>>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の違いがよくわかりません。。
179デフォルトの名無しさん:2007/07/14(土) 01:30:02
気にしなくて構いません
180デフォルトの名無しさん:2007/07/14(土) 01:30:23
>>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
181デフォルトの名無しさん:2007/07/14(土) 01:31:40
>>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);

とりあえずこんな感じで動作を比べて見るとわかりやすいと思う
182デフォルトの名無しさん:2007/07/14(土) 01:32:02
実際にインクリメントされる時期の問題。
式の結果としては、前置だとインクリメント後の値になり、
後置だとインクリメント前の値になる。
#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;
}
183デフォルトの名無しさん:2007/07/14(土) 01:33:51
>>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

うう、、どうしてでしょう。。
184デフォルトの名無しさん:2007/07/14(土) 01:38:32
せっかく俺でも答えられる!と思ったのに
レス早すぎ\(^0^)/
185デフォルトの名無しさん:2007/07/14(土) 01:38:58
単体で++i;やi++;とやってる分には違いは無いといっていいよ
もしかしたら内部的に違いがでるかもしれないが、気にしなくていいレベル
186デフォルトの名無しさん:2007/07/14(土) 01:39:21
>183
その位置でインクリメントしても差は出るわけないだろ。
187デフォルトの名無しさん:2007/07/14(土) 01:40:45
おまいら簡単な質問には食いつきが早いな
188デフォルトの名無しさん:2007/07/14(土) 01:40:48
>>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になる
189デフォルトの名無しさん:2007/07/14(土) 01:42:17
i = 1;
i++;

i = 1;
++i;

この場合(単独で使った場合)は、iが2になるだけで、どちらも差がない。
190デフォルトの名無しさん:2007/07/14(土) 02:13:37
      人
    (__)
  \(__)/ ウンコー!
   ( ・∀・ )
     ̄ ̄ ̄
191デフォルトの名無しさん:2007/07/14(土) 05:16:48
C言語に苦しむ初心者です。
C言語が得意な方にお聞きしたいのですが、どのような学習方法が効果的なのでしょうか。

ちなみに当方の頭の中身は基本情報処理の午前だけでも
8〜9割程度はとれるかどうかのトホホレベルです。。。
192名無し:2007/07/14(土) 05:36:39
http://hpcgi3.nifty.com/mmgames/patio/patio.cgi?

ここの「ファイル入出力」ってやつわかりません

助けてください お願いします
193デフォルトの名無しさん:2007/07/14(土) 07:53:20
学校の課題なら先生に聞くのが一番良いぞ
ちなみにここは「こども110番の家」じゃないので悪しからず
194デフォルトの名無しさん:2007/07/14(土) 08:48:10
>>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 改行が多すぎて、乗せられなかったためこんな形になりますた。すみません。宜しくお願いします。
196デフォルトの名無しさん:2007/07/14(土) 10:50:50
誤爆ですか
197デフォルトの名無しさん:2007/07/14(土) 10:51:28
>>195
誤爆だよね?うpロダ使って出直して下さい
198デフォルトの名無しさん:2007/07/14(土) 11:13:36
>>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とかやると右詰めになるのを左詰めにしたいんですが、どうしたらいいでしょうか。誰か教えてください。
200デフォルトの名無しさん:2007/07/14(土) 15:14:11
-
201デフォルトの名無しさん:2007/07/14(土) 15:14:14
%-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の本質的な
 違いを教えてください


お願いします。
204デフォルトの名無しさん:2007/07/14(土) 17:59:28
>>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は不要ですか?

よろしくお願いします。
206デフォルトの名無しさん:2007/07/14(土) 19:01:37
free()はmalloc()で割り当てたメモリを解放するのに使うんだから、
ローカル変数のポインタなんて渡しちゃダメ。
この場合はfreeなんて必要ない。
207デフォルトの名無しさん:2007/07/14(土) 19:12:05
>>205
これは新しい。
208デフォルトの名無しさん:2007/07/14(土) 19:18:27
>>205
さすがに変数に使うメモリ空間は自動的に管理してくれるよ^^;
209デフォルトの名無しさん:2007/07/14(土) 22:09:54
>>204
ありがとうございました。
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は変数以外に用いるということでしょうか?

よろしくお願いします。
211デフォルトの名無しさん:2007/07/15(日) 01:10:39
どういう順番でCを勉強したら210みたいな意味不明な思い込みをするようになるんだろう。
212デフォルトの名無しさん:2007/07/15(日) 01:17:30
具体的な指摘を
213デフォルトの名無しさん:2007/07/15(日) 01:40:07
>>210
int *iにおけるiはローカル変数かつint型のポインタ変数

ポインタとポインタ変数を混同しているな。
アドレスとポインタ変数に言い換えた方がわかりやすいかもな。

あとヒープとスタックについて調べてみな。
214デフォルトの名無しさん:2007/07/15(日) 02:09:04

>>210
i, jが関数の途中で不要になるから解放したいなんてことは
C言語の常識ではやらないし、考える必要もないよ。
関数終了時に勝手に消えてくれるんだから。

解放を考える必要があるのはmallocつかったときだけ。
215デフォルトの名無しさん:2007/07/15(日) 02:13:20
まあ、i,jが超でかい構造体で、再帰するたびにメモリ(スタック)使いまくるなら、
mallocで確保してfreeするのもありかも知れないが、
i,jがint程度ならそんなことを心配するのは無駄だよ。
216デフォルトの名無しさん:2007/07/15(日) 02:23:11
再帰呼んだ後に開放しても、再帰から帰ってくるまで開放されないから意味ないけどな
217デフォルトの名無しさん:2007/07/15(日) 02:23:39
末尾再起ならループに書き換える事も考えてみる。
218デフォルトの名無しさん:2007/07/15(日) 02:28:48
そんなことはコンパイラに任せる
219デフォルトの名無しさん:2007/07/15(日) 03:07:10
でもやってくれないコンパイラ案外多いよ…
220デフォルトの名無しさん:2007/07/15(日) 09:37:50
mallocとfreeの話題がでたので質問します。
自分はvalgrindでプログラム終了時のmallocとfreeの数を一致させようといつも非常に苦労するのですが
皆さんはこれどうしてますか?リークを0にするための工夫とかコツとかあったら是非ご教示下さい。
221デフォルトの名無しさん:2007/07/15(日) 10:04:22
プログラム終了時は全確保メモリが開放されるのに、何をこだわってるの?
222デフォルトの名無しさん:2007/07/15(日) 10:07:39
そりゃ実行中に容量一杯になったら困るからじゃん。
223デフォルトの名無しさん:2007/07/15(日) 10:07:49
意味わからん
224デフォルトの名無しさん:2007/07/15(日) 10:08:33
>>221 の作ったプログラムはリークしまくりで怖そう・・・。
225デフォルトの名無しさん:2007/07/15(日) 10:12:15
>>220
メモリの確保/開放が必要な処理は必ず部品化しておく。
226デフォルトの名無しさん:2007/07/15(日) 10:15:45
>>220
基本的にmallocを呼び出した関数でfreeする
それが出来ない場合には、malloc、freeをラップした関数を作って
新たに作成したそれぞれの関数を同じ関数内で呼び出すようにする

※但し、あくまで原則。ソースコードがややこしくならない範囲で。
227デフォルトの名無しさん:2007/07/15(日) 10:17:24
>>221
こんな奴のプログラムはまともに動かないと相場が決まってる
228デフォルトの名無しさん:2007/07/15(日) 10:18:54
>>221
こいつはひでぇ。こいつの作ったプログラムだけは使いたくない
229デフォルトの名無しさん:2007/07/15(日) 10:28:32
さすが日曜日だね
exit前のfree論争とその本質すら知らないコドモばっか
230デフォルトの名無しさん:2007/07/15(日) 10:30:15
お前ら何十回このスレでmalloc-free論争ループさせんだよw
231デフォルトの名無しさん:2007/07/15(日) 10:30:15
俺はセクロス前にシャワーを浴びる派
232デフォルトの名無しさん:2007/07/15(日) 10:30:53
とりあえず、More Effective C++には
newとdeleteと回数が一致しない、「メモリプール」というやり方について書かれているよ。
読んだことがない人ばかりみたいだけど。
233本日の最高のお馬鹿さん:2007/07/15(日) 10:33:25
221 名前:デフォルトの名無しさん 投稿日:2007/07/15(日) 10:04:22
プログラム終了時は全確保メモリが開放されるのに、何をこだわってるの?
234デフォルトの名無しさん:2007/07/15(日) 10:38:33
>>232
それは、言わば応用。
確保して解放するという
基本をないがしろにしてよいものではない。
235デフォルトの名無しさん:2007/07/15(日) 10:39:18
>>232 >>229 >>226 < さすがにこいつ痛過ぎるわ。こんなのが質問に答えてんのか・・・
236デフォルトの名無しさん:2007/07/15(日) 10:41:24
パソコンの電源を切れば全確保メモリが開放されるのに、何をこだわってるの?
237デフォルトの名無しさん:2007/07/15(日) 10:42:25
なんか、他人には見えないものが見えている人がいるみたい。
どの書き込みを書いたのが誰なのか、とか
自分の意見と違う書き込みをするのは一人に違いない、とか。
238なんかこいつ妄想はじめたみたいだぞ?:2007/07/15(日) 10:46:10
237 名前:デフォルトの名無しさん 投稿日:2007/07/15(日) 10:42:25
なんか、他人には見えないものが見えている人がいるみたい。
どの書き込みを書いたのが誰なのか、とか
自分の意見と違う書き込みをするのは一人に違いない、とか。
239220:2007/07/15(日) 10:46:43
沢山のレスどうもありがとうございました。
私も>>226みたいにやりたいのですがそうも出来ないことも多いですよね。
OSSでもvalgrindした結果(malloc - free)が0にならないものが非常に多いので少し疑問になりましたので
聞いてみました。これからもできるかぎり拘っていきたいと思います。
240デフォルトの名無しさん:2007/07/15(日) 10:46:45
>>230
自分は新参だから見たことない
その論争見たい
241デフォルトの名無しさん:2007/07/15(日) 10:48:20
>>239
誰もわかる人が居ないから参考になるレスが無くてすまんね
242デフォルトの名無しさん:2007/07/15(日) 10:48:57
良いから知ったかの本当のボケた子供は放置しろって。日曜日だとか
日ごろ自分が来ていないのを理由に、自分が理解されないことを
周りが子供だとか言い出すアホは放置しとけ。>>221で最高にアホだと判明してんだからw
243デフォルトの名無しさん:2007/07/15(日) 10:55:01
自分で以前考えたのが、mallocとfreeのラッパーを作って
mallocのラッパの中からはポインタの位置と確保したサイズをまとめてリストに足していき、
freeのラッパの中からはそのリストから直前にfreeしたエントリを削除していく、
んで最後にはmallocされてfreeされてないエントリだけが残るから
そのエントリが持ってるポインタ位置を片っ端からprintfみたいな表示関数にかけると
どんなデータをmallocしたのがfreeされてないかわかるから良いかな
みたいなことを考えたのですがreallocとかあるとちょっとメンドイしな。。。
244デフォルトの名無しさん:2007/07/15(日) 10:59:05
>>243
Javaとかで使われるGCのアルゴリズムを勉強すればいいかもしらん
いや自分は知らないけどなんとなくそう思った
245デフォルトの名無しさん:2007/07/15(日) 11:14:05
一言居士がうざいっすよ。お前の個人的な意見なんて要らないって
246デフォルトの名無しさん:2007/07/15(日) 11:15:43
自己紹介乙
247デフォルトの名無しさん:2007/07/15(日) 11:18:11
>>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
248デフォルトの名無しさん:2007/07/15(日) 11:22:39
>>226は何気痛い
249デフォルトの名無しさん:2007/07/15(日) 11:35:27
>>247
ありがとうございます。
__FUNCTION__とか__LINE__はあると助かりますね。
250デフォルトの名無しさん:2007/07/15(日) 11:36:24
>>246 さっきっからうるさいなぁ、お前のことだよ
ttp://sanabo.com/words/archives/2004/09/post_791.html
251デフォルトの名無しさん:2007/07/15(日) 11:42:53
ざっと見たけど、この「C言語なら俺に聞け(入門篇)」スレでは
今までmalloc-free論争の話は出てないようだった。

freeした後のポインタは必ずNULLすべきだ って話は
9スレ目にあって、ちょっと面白かったけど。


>>250
ttp://sanabo.com/words/archives/2004/09/post_791.html
252デフォルトの名無しさん:2007/07/15(日) 11:47:14
それについて延々とやってたのは2chじゃないよ。
253デフォルトの名無しさん:2007/07/15(日) 11:47:46
2chでも、何度か見たことあるよ。
254デフォルトの名無しさん:2007/07/15(日) 11:49:09
いや、fjではそれこそ何ヶ月も、飽きもせずやってたらしいよ。
255デフォルトの名無しさん:2007/07/15(日) 11:50:51
>>253
ソースを
256デフォルトの名無しさん:2007/07/15(日) 12:00:56
まあC言語の話題を扱う場所なら必ずでてくる話題ですよね。。。
#define myfree(p) do {free((p)); (p) = NULL;} while(0)
freeの後のNULLの件に関しては皆さんこんなことしてます?
257デフォルトの名無しさん:2007/07/15(日) 12:01:17
>>255
「site:2ch.net free malloc 必要」でググってみるとか。
258デフォルトの名無しさん:2007/07/15(日) 12:01:26
それでどうなのよ
malloc-free論争とやらが出た瞬間にコジコジを消沈させるような
完璧な答えのテンプレを作ってくれよ
259デフォルトの名無しさん:2007/07/15(日) 12:02:56
変数をしっかり管理できないプログラマなんて嫌だな。
260デフォルトの名無しさん:2007/07/15(日) 12:03:34
>>256
NULLじゃなくて、0xcc…とか入れたほうがいいよ。
261デフォルトの名無しさん:2007/07/15(日) 12:04:21
そうだな
早く俺を黙らせてくれよ
262デフォルトの名無しさん:2007/07/15(日) 12:04:29
また変なこだわりを持つものが湧いたな
263デフォルトの名無しさん:2007/07/15(日) 12:04:56
○○したほうがいい
って書くなら根拠も書いてよいじわるー!
264デフォルトの名無しさん:2007/07/15(日) 12:05:28
>>258
基本的にはみんなmallocしたものはfreeしなければダメと思ってるんじゃない?
Java儲/スクリプト儲には縁のない、面倒臭いけどC厨のこだわりどころだよな。
265デフォルトの名無しさん:2007/07/15(日) 12:08:17
>>263
苦労するくらいならとっととこの世から去った方が良いよ 理由:どうせいつかは死ぬんだし
266デフォルトの名無しさん:2007/07/15(日) 12:08:21
インデントはした方がいいかってレベルの話じゃない?
267デフォルトの名無しさん:2007/07/15(日) 12:09:14
基本的にはみんなmallocしたものはfreeしなければダメだよ
268デフォルトの名無しさん:2007/07/15(日) 12:10:13
でも働いて税金を納める、支える立場の内は頑張ってね!

※役人の考え方ってこうなのかな?
269デフォルトの名無しさん:2007/07/15(日) 12:14:32
>>266
まぁ、その辺は個人的なスタイルにもなってくるんで、主観でどうこう話が進むと
結局インデントせんでもソースはコンパイルされるからとか泥沼な議論になるんだよね・・・
それについては見易さを考慮したら、した方が良いとは俺は思うけどね。
まぁ、インデントはエディタ任せだがw
270デフォルトの名無しさん:2007/07/15(日) 12:16:27
あたしおんなだけどソースコードがドキュメントなのできれいに書いたほうが良いと思う!
271デフォルトの名無しさん:2007/07/15(日) 12:18:44
インデントはしなきゃだめだろ。
272デフォルトの名無しさん:2007/07/15(日) 12:21:42
>>271 だから ダメ とかそういうことを言うなってw 何で?って突っ込まれたとき
そうでなきゃダメだという理由が思い浮かばないだろ?人生経験の浅い人間の
洗脳された教育による思い込み程、当てにならない意見はない。
もっと物事の本質を理解する頭を持って、これはこうしなきゃダメという先入観は捨てな。
答え方としては、した方が良い程度。それは人間がパッと見て見やすいかどうかって
話にもなるが、俺はそんなのみやすいとは思わないという屁理屈野郎が来たら
主観的な意見同士のぶつかりあいにしかならないんだよ。
273デフォルトの名無しさん:2007/07/15(日) 12:23:34
>>271みたいなレスを見るとイラッとくるんだよな
まったくの情報量ゼロ
むしろ雑音でしかない
274デフォルトの名無しさん:2007/07/15(日) 12:23:47
つまり結局はインデントはしなきゃダメって事か
275デフォルトの名無しさん:2007/07/15(日) 12:25:08
>>272
いちいち、なんでインデントが必要かとかって質問にまじめに答える必要ないよ。
みんな知ってるし。
276デフォルトの名無しさん:2007/07/15(日) 12:30:33
よーしパパCと完全互換のCython作っちゃうぞー
277デフォルトの名無しさん:2007/07/15(日) 12:57:01
パイソンみたいにガチガチに縛るの嫌だ。
C信者ならLimboだな
278デフォルトの名無しさん:2007/07/15(日) 13:01:02
インデントが必要かどうかレベルの議論で粘着して、グタグタになったら、
「これは宗教論争、どっちでもいい」みたいに持っていくやついるだろ。
そういうのに付き合いたくないってのもあるな > いちいち理由を言わない
279デフォルトの名無しさん:2007/07/15(日) 13:07:51
ツールでも使って好きに整形しろよとしか
280デフォルトの名無しさん:2007/07/15(日) 13:09:29
インデント不要派の人って居る?
281デフォルトの名無しさん:2007/07/15(日) 13:09:54
好きにしろよ と言う奴ほど、実は一番こだわりを持ってて
「お前のインデントは汚い」とかを一番文句言う
282デフォルトの名無しさん:2007/07/15(日) 13:33:06
>>281
だったら普通は言わないだろ。インデントをするしないを好きにするのか、どういうインデントをするのか
で話が食い違っているならまだしも、好きにしろって言うくらいなら好きにやれってことでしょ。
283デフォルトの名無しさん:2007/07/15(日) 13:44:48
「好きにしていい、って言われたから」とか言ってわざとインデントして書いたもののインデントを
全部消して、最低限必要な改行(プリプロセッサコマンドとか)、ホワイトスペースとかコメント
全部消して来る人とかいそうですよね。
そのためのスクリプトとかも用意してたり。最初のinclude、defineの連続の後は全部一行とか。
284デフォルトの名無しさん:2007/07/15(日) 13:46:35
#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を操作するにはどのようにしたらいいですか?
286デフォルトの名無しさん:2007/07/15(日) 13:49:34
#include <stdio.h>
int (main) void {int x;char buf[32];printf("");return 1;}
287デフォルトの名無しさん:2007/07/15(日) 13:50:31
>>285
アセンブラで"OUT"を行う関数を書いてその関数をCから呼ぶ。
288デフォルトの名無しさん:2007/07/15(日) 13:51:24
ぶっちゃけ、手短に済むなら改行なしでも俺はおkとする。下手に改行して長くなるよりも
この1行はどういう単純な処理をするのかとはっきり分るならね。
289285:2007/07/15(日) 14:19:09
>>287
すばやい回答ありがとうございます。

アセンブラで関数を書くというのが想像できないんですが、
それは純粋なC言語だけでできるんですか?
それとも独自の拡張が必要なんですか?

例えばポインタを使えばメモリの操作は可能ですが、
非メモリマップドI/Oの操作はC言語ではできないんですか?
290デフォルトの名無しさん:2007/07/15(日) 14:26:21
>>289
アセンブラで、とういうのはアセンブリ言語で、って意味ね。
C言語だけではできない。I/OはC言語の仕様に入っていないから。
アセンブリ言語で書いたソースを作ってアセンブル、リンクすればいい。

でもインラインアセンブラを使ってできるコンパイラもある。
gccならば、http://www.mars.sannet.ne.jp/sci10/on_gcc_asm.html
このへん読めば分かるんじゃね?
291デフォルトの名無しさん:2007/07/15(日) 14:27:53
Cにはインラインアセンブラというのがあって関数内にアセンブラを書ける

つうかIO操作用のAPIが(たぶんC言語から呼び出せる)提供されてるだろ普通
292デフォルトの名無しさん:2007/07/15(日) 14:38:21
アセンブラとC言語を交ぜるのはよくない
アセンブラかC言語かどっちかにしろ
ライブラリとして部分的に作成したものを呼び出すのは可
たとえばprintfなどだ
これはC言語だけの機能では作れない
293デフォルトの名無しさん:2007/07/15(日) 14:38:48
そうでもない
294デフォルトの名無しさん:2007/07/15(日) 14:39:27
インラインアセンブラってCの規格で規定されてたのか?
俺はてっきりコンパイラの機能の一部だと思ってたが。
295デフォルトの名無しさん:2007/07/15(日) 14:40:11
>>294
コンパイラの機能の一部だよ。
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で入力していく違いがわかりません。
もう自分が何を言いたいのかもよくわかりません
297デフォルトの名無しさん:2007/07/15(日) 15:08:02
とりあえずreturnに()は要らない。
298デフォルトの名無しさん:2007/07/15(日) 15:09:10
defineを変数のように使うのもあまりよくないね
299デフォルトの名無しさん:2007/07/15(日) 15:10:56
#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に変えれば済みますよね?
301デフォルトの名無しさん:2007/07/15(日) 15:13:51
5を別の値に変えるとき面倒
302デフォルトの名無しさん:2007/07/15(日) 15:19:55
それはたくさんnを使う場合の話ですか?
defineだと要素を何個にするか実行した人に選ばせることはできませんよね。
303デフォルトの名無しさん:2007/07/15(日) 15:34:29
仕様が変わった場合、あとから変更するには楽でしょ
304デフォルトの名無しさん:2007/07/15(日) 15:35:26
コンパイル時に要素数が決まってしまうのは配列の欠点。
それに対処する方法は勉強を続けていればその内出てくる。
新しい概念が必要なのですぐには出てこないかもしれないけど。
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に&がついてないのは気にしないで考えてください。
お願いします
308デフォルトの名無しさん:2007/07/15(日) 16:46:38
どっから突っ込めばいいのか分らんほどだ
309デフォルトの名無しさん:2007/07/15(日) 16:50:10
>>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
いえ、並びを逆順にする関数を作らないといけないんです。
さっきのはもうなんかいいです。忘れてください。
311デフォルトの名無しさん:2007/07/15(日) 16:56:00
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
ごめんなさい理解できません。
たぶんそんなに複雑じゃないと思います。
それが複雑なのかどうかすらわかりませんけど…。
313デフォルトの名無しさん:2007/07/15(日) 17:00:38
>>312
配列覚えなおした方がいいと思う。
はっきり言ってこれ基礎の中の基礎。
314デフォルトの名無しさん:2007/07/15(日) 17:01:30
>>312
じゃあまず関数を作らず、main()内だけでやってみな
315デフォルトの名無しさん:2007/07/15(日) 17:06:02
main内だけでやると >>309 みたいになります。
それはできるんです。
316デフォルトの名無しさん:2007/07/15(日) 17:07:57
つまり関数に変数をどうやって渡すかがわからんって事?
>>311の通りなわけだけど。
317デフォルトの名無しさん:2007/07/15(日) 17:07:58
いや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つかっとけ
320デフォルトの名無しさん:2007/07/15(日) 18:09:07
lccなんてはじめて聞いた。
カンだけど何も表示が無いってことはエラー報告がない=成功、なんじゃないの。
同じフォルダにバイナリ出てないか確かめた?
321デフォルトの名無しさん:2007/07/15(日) 18:21:02
>>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と違いメモリ制限などの標準でない制限やエラーが少ない
324デフォルトの名無しさん:2007/07/15(日) 18:26:09
初心者ならBCC Developerよりbcpadとかの方が勉強しやすいだろ
325デフォルトの名無しさん:2007/07/15(日) 18:29:44
ごめん勉強しやすいは嘘だわ
勉強するまでの敷居が低い
326デフォルトの名無しさん:2007/07/15(日) 18:38:23
LSI C-86 をコンパイラとして選んでる時点で、その本は時代遅れか糞本だと思うが。
327デフォルトの名無しさん:2007/07/15(日) 19:06:07
質問なんですが先にソースを張りますね。
#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("");
}
}
328デフォルトの名無しさん:2007/07/15(日) 19:09:36
mcなんですが、別の関数でmcの計算をさせているのにmainの方の関数のmc
にもその結果が反映されています。なんで???
329デフォルトの名無しさん:2007/07/15(日) 19:10:55
はあ?
330デフォルトの名無しさん:2007/07/15(日) 19:13:09
LSICのBINをカレントディレクトリにした状態でコンパイルすればとりあえず問題ないだろう
多分環境変数を入力し間違えてるだけだと思うけど
331デフォルトの名無しさん:2007/07/15(日) 19:15:55
>>327
それってコンパイルできた?
中括弧がやたら多いような気がするんだが
332デフォルトの名無しさん:2007/07/15(日) 19:16:54
>>328
人のソースでもパクったのか?
じゃなきゃそんな疑問でないと思うが
333デフォルトの名無しさん:2007/07/15(日) 19:26:32
ポインタは理解してたつもりなんですが、??のところがわかりません

int x[3]; // int型が3つの配列
int *x[3]; // int型へのポインタが3つの配列
int (*x)[3]; // ??
int *(*x)[3]; // ??
334328:2007/07/15(日) 19:30:02
参考書のソースを移してそのままコピった。移した後疑問だったので質問した。
mcのスコープ離れて、mat_addで値を引数として渡して計算させています。
mat_addにreturn文がないのにmainの方のmcの参照で計算結果が反映されています。
それが疑問なんです。
335デフォルトの名無しさん:2007/07/15(日) 19:31:38
×値を引数として渡して
○アドレスを引数として渡して
336デフォルトの名無しさん:2007/07/15(日) 19:45:13
>>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>などのヘッダファイルは使えるのでしょうか
大学で使っている秀丸と同じ環境でやりたいと思うので、そこのあたりも詳しい方がいらしたら
よろしくお願いします。
338デフォルトの名無しさん:2007/07/15(日) 19:48:46
>>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;
って感じ。

つか、こんなの使ったことないし、コードを理解し難いだけじゃね?
339デフォルトの名無しさん:2007/07/15(日) 19:51:36
関数の引数としてよく使っているはず
340333: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*))
341328:2007/07/15(日) 19:53:45
ありがとうございました。プログラムの基礎はjavaで確立したはずなんですが・・・orz
とりあえずこの疑問は留めておいてポインタとやらが出るところまでCを進めてみようと思います。
342333:2007/07/15(日) 19:55:08
>>338
解説どうもです。
343デフォルトの名無しさん:2007/07/15(日) 19:55:44
ちなみに、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とか空白が入らないところにしてください
346デフォルトの名無しさん:2007/07/15(日) 19:57:34
ポインタはJavaの参照みたいなもん

違いはポインタに対して演算ができること
347デフォルトの名無しさん:2007/07/15(日) 20:02:18
次はポインタはメモリアドレスか否か論争かな
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
>>348
ここの
http://www.cmagazine.jp/setbcc.html

http://www.cmagazine.jp/download/setbcc15b.exe
を使って再インストールしてみてください
まずは、だうんろーどして設定して動くか試してみてください

あと C:\Documents and Settingsといった空白が入ったところに作業領域をおかないようにしてください
350デフォルトの名無しさん:2007/07/15(日) 20:10:30
>>348
ファイル新規作成、プロジェクトを選ぶときに、新規に作業ディレクトリを作成して
そこを選ぶといいです
351350: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)を選ぶと動くかもしれないです
355デフォルトの名無しさん:2007/07/15(日) 20:35:09
選んじゃ駄目だろ
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");
}

以外には画面に書き込まず、
コンソールアプリケーションでコンパイル出来ますか??
358デフォルトの名無しさん:2007/07/15(日) 20:58:15
手取り足取り教えるつもりならメールでやりとりでもすれ
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
他のプログラムも何個か試してみましたが上手くいきました。
作業など遅かったのに親切な説明ありがとうございました。
とても助かりました。
363デフォルトの名無しさん:2007/07/15(日) 21:17:14
>>361
Nが0以外だったら常に真
364デフォルトの名無しさん:2007/07/15(日) 21:19:55
Nが定数なら多分中の処理でif文と組み合わせてbreakでループから脱出するようになってるか
もしくはNが変数なら中の処理でNの値を書き換えるようになってるはず
365363:2007/07/15(日) 21:20:36
>>361
ダメだ.回答になってないか
・Nが定数で
  Nが0だったら一度も実行されない
  Nが0以外だったら無限ループ
  break; 文で抜けるなどする
・Nが変数で
  Nが0以外である間ループは実行され続ける
  Nが0に変更されたら終了
366328:2007/07/15(日) 21:25:07
>>361for(){ }括弧内の処理が終了するたびにNが1づつインクリメントしていって
そのN < 10(つまりはnが10)(cでいう>>363)になったら繰り返し終了
367デフォルトの名無しさん:2007/07/15(日) 21:29:01
>>366
いやいや、N<10 じゃないから
N だけだから条件は
368328:2007/07/15(日) 21:30:59
すまん、わかんね( TДT)
369デフォルトの名無しさん:2007/07/15(日) 21:35:38
>>365
ありがとうございます。ここで詰まってたんで助かりました
370デフォルトの名無しさん:2007/07/15(日) 22:35:58
次の初期化ルーチンの不備を指摘せよ.また,このまま使用するとどういうエラーが生じる可能性があるか述べよ. int i, a[100];
for (i = 1; i <= 100; i++) a[i] = i;

よくわかりません。また初期化と初期化ルーチンの違いを教えてくれませんか。
お願いします
371デフォルトの名無しさん:2007/07/15(日) 22:37:22
次の初期化ルーチンの不備を指摘せよ.また,このまま使用するとどういうエラーが生じる可能性があるか述べよ.

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++) にしろ
373デフォルトの名無しさん:2007/07/15(日) 22:43:46
>>371
「ルーチン」でググれば分かるだろ。
374デフォルトの名無しさん:2007/07/15(日) 22:47:04
int i=10; ← 初期化
for (i = 1; i <= 100; i++) a[i] = i;  ←初期化ルーチン
375デフォルトの名無しさん:2007/07/15(日) 22:54:12
>>372
わかりました。ありがとうございます。
>>373,374 
つまり初期化ルーチンとは一連の流れで初期化を行うことですか。

376デフォルトの名無しさん:2007/07/15(日) 22:58:14
>>375
まぁそんな感じで
377210:2007/07/15(日) 23:13:51
遅くなりましたがありがとうございます。
ポインタ変数で宣言しないと領域を開放できないのは不便ですね。
378デフォルトの名無しさん:2007/07/15(日) 23:17:40
意味不明です
379デフォルトの名無しさん:2007/07/15(日) 23:18:33
>>377
ひとつの関数の中で、開放が必要なほどたくさんローカル変数を使うことって普通はないからね。
380デフォルトの名無しさん:2007/07/15(日) 23:25:37
>>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の戻り値はいくらになりますか?
382デフォルトの名無しさん:2007/07/16(月) 00:21:05
>>381
int型の変数に入れてるんじゃ整数で0〜199
383デフォルトの名無しさん:2007/07/16(月) 00:22:00
>>381 違った。iじゃなくてN/=n;か・・・それじゃ200
384285:2007/07/16(月) 00:22:14
遅くなりましたが,みなさんありがとうございました.
385デフォルトの名無しさん:2007/07/16(月) 00:36:34
>>383
200ですか?1000を5で割り続けると思ったんですけど。
386デフォルトの名無しさん:2007/07/16(月) 00:44:10
>>385
うんにゃ、5だった。なんか勘違いしとった。
387デフォルトの名無しさん:2007/07/16(月) 00:44:56
>>381
0
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の組み合わせを表示するプログラムなんですが、
これに組み合わせの総数を表示するプログラムを付け加えたいのですが
どうやればいいのか分かりません。
わかる方居たら教えてください。
389デフォルトの名無しさん:2007/07/16(月) 00:46:15
>>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
390デフォルトの名無しさん:2007/07/16(月) 00:47:13
>>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;
}
391デフォルトの名無しさん:2007/07/16(月) 00:47:58
>>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かと思ってました
393デフォルトの名無しさん:2007/07/16(月) 00:59:32
>>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
すいません。家だと実行できない環境だったんで。
学校の課題を家で考えていたんで。

みなさん丁寧に教えてくれてありがとう!凄い助かりました。
395デフォルトの名無しさん:2007/07/16(月) 01:06:04
整数Nがn進数で何桁になるか求める関数ってとこか
396デフォルトの名無しさん:2007/07/16(月) 01:14:00
実行環境が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
397デフォルトの名無しさん:2007/07/16(月) 01:18:14
>>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ずつ増えるって意味ですよね?
それはどういうことなんですか?

何度も同じ質問ごめんなさい。
400デフォルトの名無しさん:2007/07/16(月) 03:08:49
小学生からやり直した方がいいんじゃね?
401399:2007/07/16(月) 03:10:54
そうですよね。。。
理解すれば何でこんなことわかんないんだろっって感じなんでしょうけど。。。
頭が混乱しちゃってww
402デフォルトの名無しさん:2007/07/16(月) 03:14:28
iが3のとき
j = 3*2
j = 3*2 + 3 = 3*3
j = 3*3 + 3 = 3*4
j = 3*4 + 3 = 3*5
というように増えてく。
403399: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
というように増えてく。
404399: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;
}
ではダメみたいなんよ

もうよくわからない、たすけておくれ

406デフォルトの名無しさん:2007/07/16(月) 03:25:55
突っ込み所満載だがとりあえずそれコンパイル通らないっしょ
407デフォルトの名無しさん:2007/07/16(月) 03:26:20
d=b^2-4*a*c;
これ判別式?
d = b * b - 4 * a * c;
408デフォルトの名無しさん:2007/07/16(月) 03:28:23
#include <math.h>追加
sqr -> sqrt
elxe -> else
409デフォルトの名無しさん:2007/07/16(月) 03:29:04
>>405
なんでコンパイルしてみようとしないの?
410399:2007/07/16(月) 03:32:26
改行するためだけにcはあるのに無くしちゃうと実行できないんですよ。。。
cは他に存在価値があるんですか?
411デフォルトの名無しさん:2007/07/16(月) 03:36:46
>>410
日本語でおk
412デフォルトの名無しさん:2007/07/16(月) 03:39:59
実行できないって言われてもどうしろっちゅーねん
俺は実行できたって答えればいいのか?

何をしたら何がどうなったかくらい言ってくれよ
プログラム以前の問題として。
413399: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をなくすと実行しても何も映らないのは何ででしょうか?
414399:2007/07/16(月) 03:42:17
意味わかんなかったですよね。
ごめんなさい。
415405:2007/07/16(月) 03:48:05
お兄様方のアドバイス通りに
しましたが通らないorz

416デフォルトの名無しさん:2007/07/16(月) 03:58:31
>>415
パッと見気づいたところを指摘しただけだからね
なんで通らないとだけしか言わないかな
コンパイルエラー出てるんでしょ
君が情報を減らすフィルターになってどうする
417399:2007/07/16(月) 04:21:12
私の場合はコンパイルエラーでないです。。。
418デフォルトの名無しさん:2007/07/16(月) 08:15:49
>>413
5行目を
int i,j,prime[1000],LIMIT;
に変えてみそ。
419デフォルトの名無しさん:2007/07/16(月) 10:35:19
>>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 は偶数なんで、当然やる意味なし。
まぁ、これをやっても、やらなかったときと比べて大して処理速度は速くならないけど
無駄は省いているから。
420デフォルトの名無しさん:2007/07/16(月) 10:36:11
>>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
421デフォルトの名無しさん:2007/07/16(月) 14:01:06
ムダ省くんならj=i*iにでもすれば?
422デフォルトの名無しさん:2007/07/16(月) 14:52:29
手をくわえてみた

#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;
}
423377:2007/07/16(月) 15:53:36
>>380
自動で開放されるのは当然として、手動で開放できないのがという意味です。
424デフォルトの名無しさん:2007/07/16(月) 16:01:31
>>423
どこが不便なの?
シビアな組み込み環境とかじゃないかぎり
メモリの効率とか最適化とか気にする必要はないし
free関数だって呼んですぐに開放されるわけではない
425デフォルトの名無しさん:2007/07/16(月) 16:08:08
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];
}

をコンパイルすると定数式が必要ですってでるんですけど、どこがいけないか分りません。
だれか教えてください
426デフォルトの名無しさん:2007/07/16(月) 16:12:11
>int v3[no] = {0};
これ。
静的に宣言した配列のサイズはコンパイル時に決定できなきゃいけない。
これは引数 no によってそのサイズが変わることを意味しているから
C/C++では使えない。
malloc/free 使うか、十分大きなサイズを取るか、どっちかだね。
427デフォルトの名無しさん:2007/07/16(月) 17:08:07
>>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(千)

429デフォルトの名無しさん:2007/07/16(月) 17:29:16
どこの誤爆だ
430428:2007/07/16(月) 17:30:33
これらは、どう違うのでしょうか?
431デフォルトの名無しさん:2007/07/16(月) 17:50:43
>>430
それのどこがCの話だ?
432デフォルトの名無しさん:2007/07/16(月) 17:50:54
1024です
433デフォルトの名無しさん:2007/07/16(月) 17:51:52
>>428
2*2*2*2*2*2*2・・・・・・

どうやったら1000になるのでしょう?
一度計算してみてはw
434デフォルトの名無しさん:2007/07/16(月) 17:58:35
>>428
上の三つは定義です。

下の三つは誤りです。

定義は「こういうことにしましょう」という決まり事なので、
「どうして?」
という疑問に対しては「そういう風に決められているから」としか
答えられません。
435デフォルトの名無しさん:2007/07/16(月) 18:15:50

#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]の数学のとこを入力した後に止まってしまうんですけど、何がいけないのでしょうか?
436デフォルトの名無しさん:2007/07/16(月) 18:19:58
>>435
scanfはループで使うと無限ループを起こす可能性がある
バグが秘められている(scanfがクソだといわれるゆえん)。

気軽に入力で数字取りたいならfgetsとatoi使いなさい。
437デフォルトの名無しさん:2007/07/16(月) 18:21:55
>>435
& が無い
438デフォルトの名無しさん:2007/07/16(月) 18:22:28
ついでにscanfごとにインクリメントしてるんなら
jのforループはいらなくない?
439デフォルトの名無しさん:2007/07/16(月) 20:13:10
インクリメントのほうを消すべきだろ
440デフォルトの名無しさん:2007/07/16(月) 20:20:41
441デフォルトの名無しさん:2007/07/16(月) 20:25:53
>>421は頭がおかしいんだろうか?ソースの詳細が理解できていないんだろうか?
442デフォルトの名無しさん:2007/07/16(月) 21:07:33
学校から宿題で「学べる」をテーマにプログラムを作れと言われました。
そこで、Cを使って100マス計算を作ろうと思いました。
しかし、どういうわけかソースは200行は書いてと言われる始末。
普通に作ったら200行になりますか?
443デフォルトの名無しさん:2007/07/16(月) 21:07:34
いちいち頭おかしいとか言う奴もどうなの?(苦笑)
444デフォルトの名無しさん:2007/07/16(月) 21:14:37
>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)
446デフォルトの名無しさん:2007/07/16(月) 21:33:15
やべえマジでわかってねえ
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より前に除外されてるんだよ。
↑はぁ?
449デフォルトの名無しさん:2007/07/16(月) 21:37:14
うはここまでバカだと思わなかった。
分りやすく具体的にいくか。
i=7のとき 14から42までは7より前に既に除外されてるからj=49からやればいいってこと。
450デフォルトの名無しさん:2007/07/16(月) 21:38:43
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
453デフォルトの名無しさん:2007/07/16(月) 21:41:22
>422
454デフォルトの名無しさん:2007/07/16(月) 21:47:11
っつか、わざと知ってて釣られていることに気づかずにファビョってバカバカ言う
教えたがり屋さん必死だなw まぁ、そんなの当然知ってるわい。わざとやると
ここまで釣れるから面白いぜw
455デフォルトの名無しさん:2007/07/16(月) 21:47:55
夏真っ盛り?
456デフォルトの名無しさん:2007/07/16(月) 21:48:21
そういう>>449は"キチガイ"だな
バカとキチガイの会話ってステキ
457デフォルトの名無しさん:2007/07/16(月) 21:49:21
いつもの人だから。
完全に言い負かされると釣りってことにしたいらしい。
釣ってる方のレスが釣られてる方のレスより多い釣りなんてないんだけどね。
458デフォルトの名無しさん:2007/07/16(月) 21:51:14
>>456 は誤爆、本当にすまなかった
459デフォルトの名無しさん:2007/07/16(月) 21:55:52
>>450
strは文字配列。*pはポインタで、"memory"という定数があるアドレスの先頭のアドレスが*pに入る。
0はそのまんま数値の0。\0は空文字を示すエスケープシーケンス、NULLは単純に空という意味でゼロとは区別して使う。
460デフォルトの名無しさん:2007/07/16(月) 21:57:43
>>457
> 完全に言い負かされると
残念だが今回ばかりは負かされたと判断できんだろ。むしろ釣られて顔を真っ赤にして
ファビョってなんでお前わからんねーんだ、バカ!ってなっていた方が笑えるw
だいたい、既に言っているようにソースコードに記して実行すりゃ分ること。
そんな単純なことなのに、わからずや(を演じている釣り師)にムキになっちゃってw
461デフォルトの名無しさん:2007/07/16(月) 22:04:21
>>456 >>458 え?誤爆じゃないんでしょ?w
462デフォルトの名無しさん:2007/07/16(月) 22:05:38
狂人の真似とて大路を走らば、即ち狂人なり
463デフォルトの名無しさん:2007/07/16(月) 22:21:03
急に静まり返るなYO!まぁ、なんだ、たまにはファビョってみたくなるもんさ。
464デフォルトの名無しさん:2007/07/16(月) 22:21:13
unn
465デフォルトの名無しさん:2007/07/16(月) 22:28:53
一瞬宿題スレかと思った。
結構同じ人が見てる?
466デフォルトの名無しさん:2007/07/16(月) 22:29:55
>>450
2の用途について書いてなかったか。用途って言われてもなぁ・・・
0は数値だから、演算とか?\0は空文字なんで文字データとして、特に文字列の終端を意味するときに使われる。
NULLは・・・まぁ、よく言われる ぬるぽ とか。文字列の終端を意味する '\0' の変わりにNULLを
代入して代用することも出来る。例えば char a[10]; a[0]='a'; a[1]='b'; a[2]='\0'; または a[2]=NULL; とか。
467デフォルトの名無しさん:2007/07/16(月) 22:38:20
ぬるぽ
468デフォルトの名無しさん:2007/07/16(月) 22:39:24
>>467
やらないよ、いつものあれは俺はやらないよ。ウホッになりたくもないし、やらないぞ。
469デフォルトの名無しさん:2007/07/16(月) 22:44:22
'\0'は数値としては0のはず
NULLも#define定義で0のはず
470デフォルトの名無しさん:2007/07/16(月) 22:44:55
>>465
大半は両方見てるんじゃないかな
レスはしなくとも
471こんばんわ:2007/07/16(月) 22:47:37
以下の内容のコードを教えてください。
多分岐型
整数型の変数a・b と、文字型の変数e を用意し、
キーボードから2つの数値と1つの演算子を入力し
、その計算結果cを出力するプログラムを作成しなさい。

実行される計算は和・差・積・商・剰余の5種類とし、
演算子はそれぞれ’+’、’-’、’*’、’/’、’%’で
表現されるものとする。

演算子にそれ以外の記号が入力された場合は
エラーメッセージを表示する。
また0による除算の回避も含める。
472こんばんわ:2007/07/16(月) 22:49:01
ごめんなさい。471の内容を間違えました。
やっぱりいいです。
473デフォルトの名無しさん:2007/07/16(月) 22:51:11
>>470
いや、荒れてるあたりが宿題スレでよく見る光景だなぁと思って
回答者は全員一緒だったりして
474デフォルトの名無しさん:2007/07/16(月) 22:55:42
>>473
そのへんは同じ人でしょ
回答者すべてが同じかは別として
475デフォルトの名無しさん:2007/07/16(月) 22:58:36
>>459
>>466
>>469
ありがとうございました。あとは自分でやってみます。
476デフォルトの名無しさん:2007/07/16(月) 23:02:17
釣りってのは53ネ申とかヤバイとか吉野家とか一発で釣れるもののことを言うんだ。
2get失敗し続けたあげく
「これからは>2のことくそ太郎って呼んでやろうぜ!」
ってレスしたらそれが2getだったとかの高等テクもある。

2ちゃんねる初心者諸君は頑張りたまえ。
477399: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番簡単なプログラムだと思うのですが、実行しても何も映りません。どうすればよいと思いますか?
478デフォルトの名無しさん:2007/07/16(月) 23:22:59
一瞬で窓が閉じてると予想
479デフォルトの名無しさん:2007/07/16(月) 23:34:28
>>477
散々 j は i*i に i*2 を足した値以降だと・・・まぁ、良いけど。
480デフォルトの名無しさん:2007/07/17(火) 00:06:50
まず
>for(i=4; i<=1000; i+=2) a[i]=0;
で a[1000] にアクセスしちゃってるじゃん
481399:2007/07/17(火) 00:37:56
どこをどうすれば表示されるようになるんでしょうか?
482デフォルトの名無しさん:2007/07/17(火) 00:44:17
おにゃの娘のお豆をくりくりすると表示されるYO!
483デフォルトの名無しさん:2007/07/17(火) 02:08:56
>>478
いや486DX + Vistaだから超もっさりで数分後にCPUの熱暴走してソニー製のバッテリーに引火しPCが爆発すると予想
484デフォルトの名無しさん:2007/07/17(火) 02:34:07
>>481
自分が書いた発言への返答くらい見直してください。
>>418で答えてみたので是非是非試してみてください。
485484:2007/07/17(火) 05:39:19
>>481
げ・・スレを見直してみたらちゃんと見て頂けていたんですね。
早とちり申し訳ありません。
486デフォルトの名無しさん:2007/07/17(火) 07:00:57
>>477
それだと正しく篩にかけられてないよ
表示の方でイカサマしてるから気付かないと思うけど
487442:2007/07/17(火) 13:47:38
すみませんが、>>442の回答お願いします。
488デフォルトの名無しさん:2007/07/17(火) 13:50:45
>>442
なりません
489デフォルトの名無しさん:2007/07/17(火) 13:54:14
>>487
それは問題を作成するだけ?それとも自動解答込み?
490デフォルトの名無しさん:2007/07/17(火) 13:58:37
余計な、、いやあると便利な機能を追加していけばそんくらいにはなるだろ
491デフォルトの名無しさん:2007/07/17(火) 14:53:42
将来の拡張性を考えました!
って言って配列を全部動的に確保するようにするんだ
もちろん別関数に掃き出す、ポインタの受け渡しは構造体使う、
これで何も考えずに20行ぐらいは水増しできる
492デフォルトの名無しさん:2007/07/17(火) 15:02:41
表示部分をputchar使って一行ずつ書いていくとか
493デフォルトの名無しさん:2007/07/17(火) 15:04:03
100マス計算ってこういうの?
http://www.crdc.gifu-u.ac.jp/edsoftdb/100masu.html
494デフォルトの名無しさん:2007/07/17(火) 16:10:27
将来性のないプログラムの将来を考えて変なコードを追加した結果、そこがバグの温床になっているという名のデスマを体験したことがある
しかも就職してはじめてのプロジェクト
495デフォルトの名無しさん:2007/07/17(火) 16:16:54
>将来性のないプログラムの将来を考えて変なコードを追加した結果、そこがバグの温床になっているという名
随分長い名前
496デフォルトの名無しさん:2007/07/17(火) 17:56:05
>>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からですか?
498デフォルトの名無しさん:2007/07/17(火) 21:59:30
再帰呼び出しを行い10進数を16進数に変換する関数ConHEX()を使って、表示するプログラムを作成せよ
という課題が出たのですが ConHEX()についていろいろ調べたのですが見つかりませんでした。。
どなたか教えて頂けないでしょうか。
499デフォルトの名無しさん:2007/07/17(火) 22:05:00
>>498
先生にもう一度課題を聞いたほうがいいよ
多分ConHEXという関数を作れって課題だと思うけど。
500デフォルトの名無しさん:2007/07/17(火) 22:06:57
そんな関数あったっけ?
もしかして「再帰呼び出しを行い10進数を16進数に変換する関数」を
ConHEX() という名前で書け、という課題なんじゃないのかい?
501デフォルトの名無しさん:2007/07/17(火) 22:07:01
「使って」じゃなくて「作って」でわ・・・
502デフォルトの名無しさん:2007/07/17(火) 22:08:03
なんだこの重婚は
503デフォルトの名無しさん:2007/07/17(火) 22:13:05
>>499>>500>>501
やっぱりConHEXは無いのですか。
ありがとうございました。
自作することにします。
504デフォルトの名無しさん:2007/07/17(火) 22:18:46
数回前の講義で先生お手製として紹介されたという可能性もある。
505デフォルトの名無しさん:2007/07/17(火) 22:21:21
その発想はなかった
506デフォルトの名無しさん:2007/07/17(火) 22:24:47
エスパーktkr
507442:2007/07/17(火) 22:26:46
>>488 そうですか、わかりました。
>>493 そうです。

他に別なもの考えてみます。結局100マスの予感がしますが・・
ありがとうございます。
508デフォルトの名無しさん:2007/07/18(水) 00:07:04
#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に代入した値が使われてないと返されるんですけど、何がいけないのでしょうか?お願いします
509デフォルトの名無しさん:2007/07/18(水) 00:09:59
>>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 = …のところで出てます。
でも他にもいろいろおかしいと思います。どう直せばいいのか…お願いします。
511デフォルトの名無しさん:2007/07/18(水) 00:33:14
>>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;
}
513デフォルトの名無しさん:2007/07/18(水) 00:43:48
average の値は捨てていいの?
514デフォルトの名無しさん:2007/07/18(水) 00:45:20
未定義とか言われてます。
むしろコイツを使いたいのですが・・・。
515デフォルトの名無しさん:2007/07/18(水) 00:49:28
そもそも平均は整数でいいの?
516デフォルトの名無しさん:2007/07/18(水) 00:49:45
ave_p()で何でreturnしない?
517デフォルトの名無しさん:2007/07/18(水) 00:53:05
>>515 今はそれどころじゃないのでとりあえずは整数でいいです。
>>516 上で作った関数がvoidなのでなんかよくわからないですけど無理っぽいです。
518デフォルトの名無しさん:2007/07/18(水) 00:54:08
^^;
519デフォルトの名無しさん:2007/07/18(水) 00:56:00
いますぐ戻り値の型をintにしてreturn average;するんだ
520デフォルトの名無しさん:2007/07/18(水) 00:56:13
>関数が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;
}
522デフォルトの名無しさん:2007/07/18(水) 01:06:09
やりたいのはこうじゃないの?

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
そうです!
どうして今までのだとダメだったんでしょう?
524デフォルトの名無しさん:2007/07/18(水) 01:12:42
どうしても何も、wa の平均をせっかく average に入れたのに、
average を使わずに wa を表示してもダメじゃないわけないじゃん

図でも書いてみて1行1行追っていけばいいよ、どこに何が入ってるのか
525デフォルトの名無しさん:2007/07/18(水) 01:14:11
でも最後のprintfで%dをaverageにするとおかしくなりますよね
それはどうしてですか?
526デフォルトの名無しさん:2007/07/18(水) 01:16:12
順番に考えてからコード化してる?訳ないよな。
思いつくままにコーディングしてるから訳わかんなくなるんですよ。
527デフォルトの名無しさん:2007/07/18(水) 01:21:10
素人すぎて細かいことはよくわからないんです。
とりあえずアドバイスをいただきながらもこうやって作ってみたんですが、
これを2次元配列を用いて処理させるようにいじるのは簡単ですか?
プログラムの実行する内容としては全く同じです
528デフォルトの名無しさん:2007/07/18(水) 01:29:05
>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
みなさん、ありがとうございました
530デフォルトの名無しさん:2007/07/18(水) 01:42:35
#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;
}
531デフォルトの名無しさん:2007/07/18(水) 01:52:15
>>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))とすると実行した場合にエラーはでないんですが
プログラムが終了してしまい、デバッガがこの指定に問題があると指していました

おそらく添字が間違っているのですがどう直せばいいのかわからない状態です
よろしくお願いします
533デフォルトの名無しさん:2007/07/18(水) 03:48:30
与えたx,yの範囲は大丈夫?
534デフォルトの名無しさん:2007/07/18(水) 04:16:11
image = (unsigned char *)malloc(sizeof(char)*800*600);
で確保してるからimageの型はunsigned char *なんだよな?
yは0〜599、x+1は0〜799に収まってるかい?
535デフォルトの名無しさん:2007/07/18(水) 05:05:20
はい、範囲の指定は収まっていました
image[800][600] で宣言した場合は、image[y][x] と *(image+600*y+x)となるであってると思うのですが
うーん、もう1度ちょっと見直してみます。すみません。
536デフォルトの名無しさん:2007/07/18(水) 05:31:29
その画像は1ピクセル1バイトなの?
256階調モノクロ?
537デフォルトの名無しさん:2007/07/18(水) 05:53:18
画像データはBMPを読み込んで
更にそれを255と0で2値化したものを使っています。

ttp://www.silphix.com/kaiba/image/7/
ここにあるtrace()という関数で配列をポインタに置き換えています。
トレースしてみると最初の判定部分、関数内のswich文のcase5で止まります。
538デフォルトの名無しさん:2007/07/18(水) 06:43:13
mallocに失敗してるって事は無い?
imageはNULLになってない?
539デフォルトの名無しさん:2007/07/18(水) 07:52:22
初歩的なことですが教えてください

1つ目のファイル(main関数がある)で定義したグローバル変数nおよび構造体aを、
2つ目のファイル(自分で作った普通の関数がある)で使っていて、それを一つ目のファイルにヘッダファイルを作ってインクルードしたら、
2つ目のファイルからエラーが出て、nとaは定義されてないと出たのですが、
この場合2つ目のファイルでnとaをそのまま使うにはどのようにしたらいいのでしょうか?


540デフォルトの名無しさん:2007/07/18(水) 07:59:39
539
すみません。自己解決しそうです。
541デフォルトの名無しさん:2007/07/18(水) 09:37:03
しそうってなんだ?
542デフォルトの名無しさん:2007/07/18(水) 09:51:05
>>539
適当にやってコンパイルエラー消しても
根本的な問題の解決にならんだろ。また起こるぞ。
externでぐぐれ
543デフォルトの名無しさん:2007/07/18(水) 12:11:35
このエクスターァン星人め(`・ω・´)
544デフォルトの名無しさん:2007/07/18(水) 17:00:08
5つの整数を入力して、平均値と中央値を出すプログラムを作る問題があるんですが、中央値の出し方が検討もつきません。よろしくお願いします。
545デフォルトの名無しさん:2007/07/18(水) 17:04:30
ググれ
546デフォルトの名無しさん:2007/07/18(水) 17:05:31
qsort関数用の比較関数を作ってソート

要素数が偶数なら添え字の平均値のintで小数点以下を落としてその次の添え字の要素を引っ張り出して
要素数が奇数ならど真ん中の添え字の要素を引っ張りだせばいいんだよ(´・ω・`)
547544:2007/07/18(水) 18:49:09
>>546
申し訳ないのですが、その文の意味もわかりません。専門用語抜きで概略を教えて頂ければありがたいです。
548デフォルトの名無しさん:2007/07/18(水) 19:12:26
>>547
5つの整数値を小さい順にならべ変え、真ん中(最小を1番目、最大を5番目とすると3番目)にある値が中央値
549デフォルトの名無しさん:2007/07/18(水) 19:17:20
>>547
「整数値」ってのは「整数」の「値」って意味だからね。
小さい順ってのは判るよね。
あーそれから、大きい順に並べても大丈夫だから。
550デフォルトの名無しさん:2007/07/18(水) 19:21:26
>>548
ソースも載せてください。
551デフォルトの名無しさん:2007/07/18(水) 19:31:31
#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;
}
552544:2007/07/18(水) 20:01:40
>>548-549
五つの数字を入力するプログラム
→昇順または降順にソート
→三番目に並んだ数値を表示
このような流れですか? 
553デフォルトの名無しさん:2007/07/18(水) 20:02:11
そしてスルーされる>551
554544:2007/07/18(水) 20:11:10
>>550は自分のレスではないんですが、>>551の方ありがとうございます。
555デフォルトの名無しさん:2007/07/18(水) 20:22:44
最近、C言語をやり始めてたのですがが友人のPCでコンパイラ(MinGW)を使って早速「hello world」と表示させるプログラムを作ったけど
gcc: installation problem, cannot exec `as': No such file or directory
と出てきてコンパイラされないそうです。
もしよかったら解決方法を教えてくれませんか
ちなみにOSはVistaと聞きました。
556デフォルトの名無しさん:2007/07/18(水) 22:36:06
>>555ファイズ
その友人は普段MinGWでコンパイルしてるわけじゃないんでしょ。
じゃなきゃそんな基本的なエラー出ないからな。

自分でMinGWインストールしたの?
じゃあ、この辺を参考にして再インストールしてみ
ttp://www2.atwiki.jp/ccw/pages/6.html
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個しか入力できないんですけどどうしてでしょうか?
558デフォルトの名無しさん:2007/07/18(水) 23:00:04
>>557
きみの環境が一文字ニバイトだからと予想

0から9まで一バイトずつヘキサで表示してみなよ
559デフォルトの名無しさん:2007/07/18(水) 23:03:56
>>544
なあみんな、そのレベルの出題でソートが要求されてるのだろうか?
中央値は最大値と最小値の真ん中のことじゃないのか。
560デフォルトの名無しさん:2007/07/18(水) 23:09:48
奇数個だし、中央値で間違いないと思うが
561デフォルトの名無しさん:2007/07/18(水) 23:14:10
>中央値は最大値と最小値の真ん中のことじゃないのか。
何この曖昧な書き方
562デフォルトの名無しさん:2007/07/18(水) 23:23:58
>>558
ヘキサとはなんですか??なんか初心者なのでいまいちわからないです…
563デフォルトの名無しさん:2007/07/18(水) 23:29:44
>>559
最小値と最大値を足して2で割った値とでも言いたいのだろうが、
中央値といえばソートして中央に位置する値のことだと統計の世界で決まっている。
http://ja.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E5%80%A4
564デフォルトの名無しさん:2007/07/18(水) 23:30:05
>557
改行文字を読み込んでんだろ
scanf(" %c", s+i);
にして改行文字読み飛ばせばいい
565デフォルトの名無しさん:2007/07/18(水) 23:30:14
16進数。printfで%xとか
566デフォルトの名無しさん:2007/07/18(水) 23:32:09
>>557
一文字ごとにEnter叩いているだろ。そいつが次のscanf()で食われているんじゃね?
567デフォルトの名無しさん:2007/07/18(水) 23:38:15
ヘキサデシマル=16進法
デシマル=10進法
ヘキサ=6
568デフォルトの名無しさん:2007/07/19(木) 00:08:19
>>566
なるほど改行文字が原因だったんですね…。勉強になりました
569デフォルトの名無しさん:2007/07/19(木) 00:52:33
え?C言語?おいしいの?
っていうくらい素人な奴のために
C言語のいい本を教えてくれないか
570デフォルトの名無しさん:2007/07/19(木) 01:04:01
>>569
試食版でぐぐれ



ごめんちょっと言ってみたかっただけ
571デフォルトの名無しさん:2007/07/19(木) 01:16:45
ぶっちゃけ、自分で本も選べない人でも理解できる入門書なんて、見たことない
572デフォルトの名無しさん:2007/07/19(木) 01:41:20
初心者がいい入門書を誰にも聞かずに選べるわけねー
573・∀・)っ-○◎●:2007/07/19(木) 01:46:38
高橋まなちゃん
574デフォルトの名無しさん:2007/07/19(木) 01:46:40
初心者なんだから無理に選ばずに何冊か買え
575デフォルトの名無しさん:2007/07/19(木) 01:57:57
何冊も買わずにまず本屋でいろいろ立ち読みしたほうがいいよ
本屋で挫折してもいいし、できそうだと思ったら1冊買って、それから挫折してもいい
576デフォルトの名無しさん:2007/07/19(木) 04:18:52
ふと思ったのだが、入門書ってどんな分野でもあるんだろーか
「初めてのアデノシン三リン酸」とか
「猫でもわかるカロタイプ」とか
「明解マロン派」とか
「1週間で分かるロッドマン・フィルブリック」とか
「ヨハネ・パウロ2世完全攻略」とか

大多数が何?誰?って言うような奴にも入門書があったりするんかな
577デフォルトの名無しさん:2007/07/19(木) 04:44:30
>「ヨハネ・パウロ2世完全攻略」
801本のタイトルにしか見えん。

化学系の院生やってたけど、ある程度マニアックな題材になると
それを学ぶこと自体が「入門」ではあり得なくなるので
そういう本は必然的に「専門書」と呼ばれることになるんだと思う。
学部生が読むような量子化学の初歩を書いた入門書はあるけど、
化学とは関係ない人が見たらそんなの専門書以外の何物でもないし。
578デフォルトの名無しさん:2007/07/19(木) 18:18:57
審問ですが、char型の配列に日本語を格納して参照すると文字化けが起こるのですが
良い対策知りませんか?
579デフォルトの名無しさん:2007/07/19(木) 18:20:33
審問してどうすんだw質問です。_(。_。)_
580579:2007/07/19(木) 18:25:56
ちなみにprintf()で直接日本語を入れれば化けません。
581デフォルトの名無しさん:2007/07/19(木) 18:30:55
>>578
問題の起こる最小のコードを晒してくれないか?

下は *おそらく* うまくいく例
#include<stdio.h>
int main(void){
char mojiretu[100];
printf("文字列を入力して下さい : ");
fgets(mojiretu, sizeof(mojiretu), stdin);
printf("%s", mojiretu);
return 0;
}
582579: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文字ずつ表示する関数を作ったんです。
583デフォルトの名無しさん:2007/07/19(木) 18:39:38
putcharかよ
584デフォルトの名無しさん:2007/07/19(木) 18:40:01
>>582
hoge[i] じゃなくて hoge[j] じゃなかろうか?
585579:2007/07/19(木) 18:40:13
fgetsの役目が分かりませんが、ありがとうございました。
586デフォルトの名無しさん:2007/07/19(木) 18:42:31
ぐぐれかす
587デフォルトの名無しさん:2007/07/19(木) 19:08:26
私、eclipseのCDT使ってるのですが、
printf(); scanf("%d",&hoge);ってやると最初のprintf()が表示されないので、
printf(); fflush(stdout); scanf("%d",&hoge)ってやらないと駄目なんですよね。
こういうのって人それぞれですか?
588デフォルトの名無しさん:2007/07/19(木) 19:32:32
環境依存だが、確実に表示されていないと困る場面では、出力ストリームをflushしたほうがいい。
589デフォルトの名無しさん:2007/07/19(木) 19:42:54
ご回答ありがとうございます
590デフォルトの名無しさん:2007/07/19(木) 19:53:58
でも普通は行単位バッファリングを期待してしまうけどな。
591デフォルトの名無しさん:2007/07/19(木) 19:59:58
もうこれをやるしかないだろ。 m9(^д^)プチャー
592デフォルトの名無しさん:2007/07/19(木) 20:01:17
たしか\nで改行するとちゃんと吐き出すんだっけ?
593デフォルトの名無しさん:2007/07/19(木) 20:22:45
>>577
レスさんくす。
C言語の入門書も関係ない人が見たら専門書にしか見えないのかな。
そうすると、C言語?おいしいの?って奴は大変だな。1冊読破する前に挫折しそうだ。

>801本のタイトルにしか見えん。
すまん。
アマゾンにあったC言語の書籍名に、テキトーにググって見つかったよく知らない単語を入れ替えただけで、全く何も考えてなかった。
つーかヨハネ・パウロ2世って前ローマ教皇か。有名人じゃん、駄目だな俺。
594デフォルトの名無しさん:2007/07/19(木) 20:33:52
UNIXと言えば何かすごいことのように思ってしまうのと似たようなもんかと
595デフォルトの名無しさん:2007/07/19(木) 20:37:19
MSのvisual系の入門書からはじめると往々にして挫折する罠
今でもみるとゾッとするw
596デフォルトの名無しさん:2007/07/19(木) 21:33:54
回文(eyeとかnoon)かどうかを判定するプログラムがどうしても作れません
というか思いつきません
どなたかヒントorアドバイスください
597デフォルトの名無しさん:2007/07/19(木) 21:36:27
半分か真ん中までと、以降に分けて、逆方向に文字を比較とか
598デフォルトの名無しさん:2007/07/19(木) 22:30:33
>>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 {
/*回文でない*/
}
599デフォルトの名無しさん:2007/07/19(木) 22:32:30
よし、俺がサンプルをあげよう

いかないなかい
600デフォルトの名無しさん:2007/07/20(金) 00:37:16
>>596
つエキスパートCプログラミング
601デフォルトの名無しさん:2007/07/20(金) 00:44:25
エスパーCプログラミング とかって無いのかな
602デフォルトの名無しさん:2007/07/20(金) 00:46:52
>>601
その本を書ける人は、売れないことが分かっている本を書かない
603・∀・)っ-○◎●:2007/07/20(金) 01:18:17
>>600
クソ本
604デフォルトの名無しさん:2007/07/20(金) 01:18:57
クソ本というか古いだけ
605・∀・)っ-○◎●:2007/07/20(金) 01:22:08
まあ悪い本じゃないよ。ただ、もっと良い本はある。
C++のくだりは不要だったな。

回文判定は、環境依存だけど、strrevしてstrcmpが簡単。
606デフォルトの名無しさん:2007/07/20(金) 01:37:29
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;
}
607デフォルトの名無しさん:2007/07/20(金) 01:49:06
>>605
所詮お前は○産大未満
608・∀・)っ-○◎●:2007/07/20(金) 02:09:16
京産大乙
609デフォルトの名無しさん:2007/07/20(金) 02:10:37
strrevしてstrcmpって無駄多すぎだろ。
610・∀・)っ-○◎●:2007/07/20(金) 02:14:52
その無駄ってのが
コーディングの手間の問題なのか実効効率の問題なのかだわな。
数MHzの石で動かすの?

突き詰めれば0終端文字列にstrlen使うくらいなら、PASCAL文字列使ったほうが
効率がいいとか、そーいう次元の話になっちゃうよ。
611・∀・)っ-○◎●:2007/07/20(金) 02:17:45
実効→実行

MacのAPIは文字列はどっちでも受けられるようになってる。
612デフォルトの名無しさん:2007/07/20(金) 02:20:42
>>609 激しく同意。すでに入れ替えて比較ってのは無駄だって話が出てたのにね・・・
所詮○産大未満
613デフォルトの名無しさん:2007/07/20(金) 02:23:49
Cの初学者に向けての課題としての回文判定だろうに、実行効率とかコーディングの手間とかバカすぎるな。
614デフォルトの名無しさん:2007/07/20(金) 02:27:21
bsearch ()は重複した値があるときはどれを選ぶかは不定なのですか??
qsort()の後bsearch() して最初にヒットするものを表示させようとしても
一番先頭をさしてくれません。
615・∀・)っ-○◎●:2007/07/20(金) 02:29:55
quick sort自体が元の順序を保持しません。
stable sort(ライブラリにあるかどうかはやっぱり環境依存)かバブルソートを使いましょう。
616・∀・)っ-○◎●:2007/07/20(金) 02:31:58
>>613
大丈夫、どのみち課題を自分でやろうとしない子はホストか●男優かリアルドカタくらいしか進路ないから
617デフォルトの名無しさん:2007/07/20(金) 02:34:07
強烈だけど半分ぐらいは事実なんだろうなー……
618・∀・)っ-○◎●:2007/07/20(金) 02:35:36
ちなみにbsearchも同じ値に対する順序は不定ですね。
619デフォルトの名無しさん:2007/07/20(金) 02:36:50
汁○優ちょっとうらやましいかも
620デフォルトの名無しさん:2007/07/20(金) 02:38:42
ヒントくれって言ってるだけで、課題を放棄してるわけじゃないだろ
と少し擁護してみるが、まぁ他人の将来なんか知ったこっちゃ無い
621デフォルトの名無しさん:2007/07/20(金) 02:50:15
>>615
バブルソートなんか使うくらいなら、
元のインデックスを含めて qsort しろよ
622デフォルトの名無しさん:2007/07/20(金) 03:06:22
んまぁ、団子ちゃん、もちつけや。どうせお前だって、限りある時間の中で生きている
人間に過ぎないんだ。お互いに生きているこの時間を有意義に使おうや。
どうせいつかは死ぬんだ、楽しく生きた方がマシだろ?あんたの顔は(ryだが。
さびしがりやってのは、すぐに自分を誇示して自分を慰め始めるから困るぜ。
623・∀・)っ-○◎●:2007/07/20(金) 03:08:58
どっちが速いかなんて要素数依存じゃん。
関数呼び出しのオーバーヘッドとか考えると微妙だよ。
むろん、自身のスタック再帰よりもコールバックの比較関数がね。

まあquicksort程度なら俺は暗記してるけどさ。
バブルソートはシンプルだし近い要素同士の比較だからキャッシュのヒット率は上げやすい。
まあ、要素数がそんなに無い場合だが。

C++のソートならコンパレータをインライン展開できるから速い。
ちなみに俺はよく使うのはstd::vectorコンテナとstable_sortだな。
アレって実現方法は大概、ヒープソートやマージソートあたりだな。
624デフォルトの名無しさん:2007/07/20(金) 03:12:47
知ってる単語ならべて一生懸命だなぁ
625デフォルトの名無しさん:2007/07/20(金) 03:14:13
たまには効率なんて考えずSTLやらBoostやらを存分に使って仕事がしたいな
626・∀・)っ-○◎●:2007/07/20(金) 03:18:01
だからqsortよりSTLのソートのほうが実行効率もコーディング効率もいいってば。
実測してみ?数値型の比較ならファンクタを作る必要すらない。

まあCスレで言うのもなんだが。
627・∀・)っ-○◎●:2007/07/20(金) 03:20:24
C の qsort と STL の sort の速度比較
http://0xcc.net/blog/archives/000052.html

個人ブログだけどこの辺で納得ヨロ
628デフォルトの名無しさん:2007/07/20(金) 03:23:32
世の中にはほいほいSTLを使うことができない環境もあるんです
実行効率とコーディング効率がすべてじゃない環境もあるんです
察してください
629・∀・)っ-○◎●:2007/07/20(金) 03:31:47
環境ってのは物理的な縛りよりも堅物の上長縛り?
それは俺も同じだ。
630デフォルトの名無しさん:2007/07/20(金) 03:34:00
そもそも C のスレで C++ の話をされても・・・
631デフォルトの名無しさん:2007/07/20(金) 03:35:13
メモリのこともたまには思い出してあげてください・・・
632・∀・)っ-○◎●:2007/07/20(金) 04:10:13
要点は>>623の最初の3行だよ。
ようはCとC++の逆転現象がおきるくらい、qsortではコールバックのオーバーヘッドが大きいってこと。

>>621の方法だと、配列の添字を保存する領域を別途確保したうえで
qsortの呼び出しの度に添字をセットする羽目になるね。
まあ、ヒープソートでもオーダ安定させるには似たようなことする必要があるけど。
それでいてbsearchはどうしようもない。

まあ、ヒープソートのツリー構造のままダイレクトに二分探索かけるのが妥当じゃねーの。
http://ja.wikipedia.org/wiki/%E3%83%92%E3%83%BC%E3%83%97%E3%82%BD%E3%83%BC%E3%83%88
633デフォルトの名無しさん:2007/07/20(金) 09:39:23
4時まで起きて頑張ってたのか、お疲れさん
634デフォルトの名無しさん:2007/07/20(金) 11:25:01
こいつって簡単にすませたい事をぐだぐだ文句いいながら
自分から難しくしていって失敗するタイプだな。
635デフォルトの名無しさん:2007/07/20(金) 11:43:32
これだからダンゴは嫌われる。
636匿名:2007/07/20(金) 14:01:58
C言語のプログラミングについてなんですけど、答えてくれる人いませんか?
637デフォルトの名無しさん:2007/07/20(金) 14:02:34
遠慮なく申せ
638匿名:2007/07/20(金) 14:03:32
6ヶ月分のガスの使用量を求める。というものなのですが大丈夫でしょうか?
639デフォルトの名無しさん:2007/07/20(金) 14:06:16
その程度、悪いが朝飯前だ
640デフォルトの名無しさん:2007/07/20(金) 14:06:42
>>638
東京ガスですか?
641デフォルトの名無しさん:2007/07/20(金) 14:09:40
>>638
料金形態を詳しく
642デフォルトの名無しさん:2007/07/20(金) 14:10:13
>>636
うぜえ消えろ
643お願いします!:2007/07/20(金) 14:11:13
「2個のサイコロ振りをシミュレートするCプログラムを書け。1個目のサイコロ振りにも2個目サイコロ振りにも関数randを使い、2つの出目の和を計算する。」
この問題です!よろしくお願いします!
644デフォルトの名無しさん:2007/07/20(金) 14:12:16
>>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;
}
645デフォルトの名無しさん:2007/07/20(金) 14:13:50
>>643


#include <stdlib.h>
#include <stdio.h>
int main() {
printf("%d", rand() % 10 + 2);
return 0;
}
646デフォルトの名無しさん:2007/07/20(金) 14:21:09
>>644
コンパイルしてないでしょ
647デフォルトの名無しさん:2007/07/20(金) 14:46:04
>>645
変なサイコロ使ってるんだな
648デフォルトの名無しさん:2007/07/20(金) 14:46:31
種無しか!
649デフォルトの名無しさん:2007/07/20(金) 14:57:50
まあ種なんて実際使うんじゃなけりゃほっといてもいいじゃん
650デフォルトの名無しさん:2007/07/20(金) 15:16:44
>>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
651デフォルトの名無しさん:2007/07/20(金) 15:18:57
1・6にたくさん、2・5にちょっと鉛を仕込んであるサイコロを想定してんですが。。
652デフォルトの名無しさん:2007/07/20(金) 15:24:37
教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 92代目
http://pc11.2ch.net/test/read.cgi/tech/1183511364/
653デフォルトの名無しさん:2007/07/20(金) 15:26:12
>>652 じゃなくてこっちこっち
C/C++の宿題を片付けます 93代目
http://pc11.2ch.net/test/read.cgi/tech/1184506311/
654デフォルトの名無しさん:2007/07/20(金) 22:47:28
3次元配列に文字列をつっこむってのがどうしても理解できない

str[][2][40] = {
{"dog", "Hun"}
{"no", "nein"}
};

って一体どういう風に格納されてるの?
655デフォルトの名無しさん:2007/07/20(金) 22:50:34
>>654
dog\0の後ろは0x00で埋まる。今回の場合なら36個の0で。
int i[100] = { 0 };が全て0で初期化されるのと同じ理由。
656デフォルトの名無しさん:2007/07/20(金) 22:56:52
>>654
str[]はchar *の配列(char **)が格納され {"dog", "Hun"}, {"no", "nein"}
str[][2]はcharの配列(char *)が格納され "dog", "Hun"とか"no", "nein"
str[][2][40]はcharが格納される 'd', 'o', 'g', '\0'など
657デフォルトの名無しさん:2007/07/20(金) 23:01:45
なんか違う
658デフォルトの名無しさん:2007/07/20(金) 23:10:39
659654,658:2007/07/20(金) 23:14:28
名前入れ忘れてた

頭が物故割れそうだ
660デフォルトの名無しさん:2007/07/20(金) 23:37:58
4次元配列とかどうやって紙に書くつもりなんだろうか
661デフォルトの名無しさん:2007/07/20(金) 23:38:57
宇宙は何次元だったけ???
662654:2007/07/20(金) 23:40:04
>>660
まあ…そうなんだけどね…

せめて手がかりでもつかめればと
663デフォルトの名無しさん:2007/07/20(金) 23:43:04
>>660
紙は平面なのだから、まず3次元配列から疑問に思えよ。
その3次元char配列なら、(1次元配列である)文字列を
縦横2次元に並べるという形で表現できる。

それ以上の次元の配列も同様に、数次元毎に1つのグループとして、
それを縦横に並べるようにすれば、平面で何次元でも表現できる。
それが見やすいかどうかは別問題だが。
664デフォルトの名無しさん:2007/07/21(土) 00:40:30
多次元配列は理解している(つもり)だ。
テキストの例題なぞ今更だ。すらすら解ける。

だが、仕事で使うのはWIN32−APIぐらいなもんだ。
普通にプログラムしたって二次元配列すら滅多に使わないよ。

画像扱っていないからな。

665664:2007/07/21(土) 00:42:28
×画像扱っていないからな。
○画像扱っていないからかな。
666デフォルトの名無しさん:2007/07/21(土) 01:03:53
正式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*/
667デフォルトの名無しさん:2007/07/21(土) 01:08:03
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 ;
}
668デフォルトの名無しさん:2007/07/21(土) 01:09:14
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;
}
669デフォルトの名無しさん:2007/07/21(土) 01:11:24
&とか*とか必要と思われるところに付け足しましょう
670654:2007/07/21(土) 01:13:31
str[0][0][40] = ウホッ
str[0][1][40] = いい男…
ry)
str[x][y][z] = しーましェーん!
っていうふうになること考えれば少しわかったようなわからないような

でもなんで>>654の初期化で2単語しか入れないのに2次元目が[2]なんだ?
ただ余裕とってるだけ?
671デフォルトの名無しさん:2007/07/21(土) 01:14:43
ポインタで取り回せということですね、ちょっとやってみます。

というか改行多すぎる言われて面倒だ
672デフォルトの名無しさん:2007/07/21(土) 01:16:46
int i[2];
i[0]=1;//OK
i[1]=2;//OK
i[2]=3;//NG
673654:2007/07/21(土) 01:22:48
各次元でそれぞれヌル(でいいのかな)が必要なのか

いろいろ助かった
みんなありがとう
674デフォルトの名無しさん:2007/07/21(土) 01:22:51
>>669
ポインタで指定したらmain関数にすら帰ってこなくなったw

自分自身何度かポインタなり色々変えてみたりもしたつもりだ、まぁ1時30分で寝るけどな
675デフォルトの名無しさん:2007/07/21(土) 01:27:23
>>669
だめだ、ポインタにしたら(null)が戻ってくるようになった。じゃあ寝るな

おやすみ
676デフォルトの名無しさん:2007/07/21(土) 01:27:35
>>673
こんな感じでイメージすればいいんじゃないかな。
ttp://vista.jeez.jp/img/vi8494882248.png
677デフォルトの名無しさん:2007/07/21(土) 01:28:57
あ、しまった。冠詞じゃないから eins だ。
ま、いっか。
678デフォルトの名無しさん:2007/07/21(土) 01:29:32
char str[5] = "baka";
str[0] b
str[1] a
str[2] k
str[3] a
str[4] \0

最初は5個分って意味で、0〜4で5個分になる
679デフォルトの名無しさん:2007/07/21(土) 01:32:20
わざわざ図解サンクス

完全な理解には遠いがだいぶスッキリしてきた
早速課題プログラム作ってくる
680デフォルトの名無しさん:2007/07/21(土) 01:42:40
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 個並べる形になる。
681デフォルトの名無しさん:2007/07/21(土) 17:04:24
多次元数列で質問した俺が再来

/* 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);
682デフォルトの名無しさん:2007/07/21(土) 17:09:10
/* 比較部 */
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
683デフォルトの名無しさん:2007/07/21(土) 17:14:40
最初のコメントが崩れたので補足

要求された動作(ハングマンゲーム)
ある単語(この場合contatenation)をマジックワードとして設定、文字数分ハイフンを表示
プレイヤーは文字数から単語を推測、一文字ずつ文字を入力
その文字が単語に含まれていたら該当する部分を表示する
(例)------------- → a入力 → ----a---a----

wikipedia
ttp://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%B0%E3%83%9E%E3%83%B3_(%E3%82%B2%E3%83%BC%E3%83%A0)
684デフォルトの名無しさん:2007/07/21(土) 17:24:25
さらに補足
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);
685デフォルトの名無しさん:2007/07/21(土) 17:36:58
'\0'がないんだからまともに動く方が不思議だろ
686デフォルトの名無しさん:2007/07/21(土) 17:50:24
マジスカ
コンパイラが自動で付加するというのを読んでほとんど気にしてなかった…

どこをどうすればいいんでしょう
687デフォルトの名無しさん:2007/07/21(土) 17:56:51
correct_word[i] = '\0'; を-で埋めた後に追加するか、correct_word[40] = {0}として0で初期化する。
688デフォルトの名無しさん:2007/07/21(土) 18:01:46
おお…ちゃんと動くようになった
変数も時々初期化忘れてとんでもない数値になったりするし大切なんだね…

危ない穴持ったまま突き進むとこだった
本当にありがとう
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となってしまいます。
どこが間違ってるのかわかりません。お願いします。
690689続き: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);
691デフォルトの名無しさん:2007/07/21(土) 18:25:53
横からで申し訳ありませんが
>correct_word[40] = {0}として0で初期化する。
0で初期化したら'\0'は必要ないんですか?
692689続き: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;
}
693デフォルトの名無しさん:2007/07/21(土) 18:32:15
>>691
\0と0が同じだから
694デフォルトの名無しさん:2007/07/21(土) 18:37:11
intは%lfじゃなくて%d
695デフォルトの名無しさん:2007/07/21(土) 18:47:01
ありがとう
ちゃんと動きました
696デフォルトの名無しさん:2007/07/21(土) 18:50:34
689のものです。
分割数1000くらいまでは動作するんですが、分割数を10000とかにするとセグメントエラーがでるんです。
なんでですか?
697デフォルトの名無しさん:2007/07/21(土) 18:53:29
そりゃ配列のサイズが1000だからだろ
698デフォルトの名無しさん:2007/07/21(土) 18:54:03
>>690だけパッと見たけど
>scanf("%lf", &n);
>scanf("%lf", &m);
がおかしい
scanf("%d", &n);
scanf("%d", &m);
に汁
699デフォルトの名無しさん:2007/07/21(土) 18:54:44
解決してたのかorz
700デフォルトの名無しさん:2007/07/21(土) 18:55:55
>>696
セグメントエラーはメモリでアクセスしちゃだめなところにアクセスしてる
>>697が原因だろうね
701デフォルトの名無しさん:2007/07/21(土) 18:57:05
>>696
スタックオーバーフロー
コンパイラオプションでスタック領域を拡張するか
ヒープメモリーを使え
702デフォルトの名無しさん:2007/07/21(土) 19:10:08
for文のとこでエラーになってたのか
配列のサイズ大きくしたら動作しました
ありがとうございました
703デフォルトの名無しさん:2007/07/21(土) 19:14:33
>>702
malloc()とfree()覚えなよ
704デフォルトの名無しさん:2007/07/21(土) 19:26:34
>>703
malloc()とfree()ですか…
勉強してみます
705デフォルトの名無しさん:2007/07/21(土) 19:33:59
スタックオーバーフローじゃないから、mallocもfreeもその程度の分割数じゃ必要ない
706デフォルトの名無しさん:2007/07/21(土) 19:44:45
>>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;
}
以上です
709デフォルトの名無しさん:2007/07/21(土) 20:15:27
for(i=1; i<6; i++)
710デフォルトの名無しさん:2007/07/21(土) 20:20:55
>>707
X[5],Y[5]って宣言したんだから、0〜4を使わないと駄目だよーww
711デフォルトの名無しさん:2007/07/21(土) 20:32:02
for(i=1; i<6; i++)、c=X[1]+X[2]+X[3]+X[4]+X[5];
ワロタwww
712707:2007/07/21(土) 21:11:13
できました!!>>711以外の先輩方ありがとうございます。
713デフォルトの名無しさん:2007/07/21(土) 21:14:33
ガキかよw
714デフォルトの名無しさん:2007/07/21(土) 21:17:31
これこそワロタ
715デフォルトの名無しさん:2007/07/21(土) 22:13:52
while (*p) {
*p = toupper(*p);
p++;
}

を、

while (*p)
*p++ = toupper(*p);

にできるのはなんでなんだぜ?
716デフォルトの名無しさん:2007/07/21(土) 22:16:12
?++ってのは、演算後にインクリメントって事じゃないの?
逆に++?だと、インクリメント後に演算って感じかな

とc初心者の私が答えてみる
717デフォルトの名無しさん:2007/07/21(土) 22:16:15
インクリメントとは何かが分かってれば特に疑問は感じないと思うんだが…
718デフォルトの名無しさん:2007/07/21(土) 22:16:50
いや、>>715 は未定義じゃないの?
719715:2007/07/21(土) 22:21:29
なんとなくわかったような…
頭が固いと苦労するな…(´・ω・)
720399: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
721399: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;
}
っていう考え方もあると思うのですが理解してもらえますかね???
でもこれじゃあエラーがでちゃうんです。。。
どこがプログラム的におかしいか教えてもらえませんか?
722デフォルトの名無しさん:2007/07/21(土) 23:11:54
>>720
エラーの内容くらいコピペしてくらはい。
ifのネストが大きすぎるのでは?とESPしてみる。
723デフォルトの名無しさん:2007/07/21(土) 23:12:51
>>722
ネストなんてしてねぇ・・・OTL
配列であるnの使い方がおかしいよ。
724デフォルトの名無しさん:2007/07/21(土) 23:12:56
理解に苦しむよーw
エラトステネスの篩はどういうものかわかる?
あと、セミコロンを出し惜しんじゃダメよ
725デフォルトの名無しさん:2007/07/21(土) 23:13:06
・・・とりあえずセミコロンは書こうや
726デフォルトの名無しさん:2007/07/21(土) 23:13:12
>>721
どこがエラトステネスの篩なのかさっぱり分らんだろ
727399: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)
って書いてありました。おねがいします。。。
728デフォルトの名無しさん:2007/07/21(土) 23:18:02
>>727
基本が全然できてないんすけど・・・
C言語を勉強するのかエラトステネスのアルゴリズムを理解したいのか・・・
729399:2007/07/21(土) 23:18:22
>>398を先生に見せたらエラトステネスの篩じゃないって言われました(泣)
だから別に作ってみたんです。
730デフォルトの名無しさん:2007/07/21(土) 23:18:54
>>729
どこの学校だ?そんな講師がいる学校、辞めろ
731399:2007/07/21(土) 23:23:57
もし>>720>>721のプログラムを生かす形で作るとしたらどうなりますか?
無理言ってすいません。。。
732デフォルトの名無しさん:2007/07/21(土) 23:24:43
>>731
生かすも何も、それ自体がエラトステネスの篩の手順を無視しているし
どうやってそれで素数を求めるんだ?
733デフォルトの名無しさん:2007/07/21(土) 23:25:53
734デフォルトの名無しさん:2007/07/21(土) 23:27:09
>>398は間違ってるねw
表示のところの
for(c=1,i=3; i<=MAX; i+=2) {

for(c=1,i=0; i<=MAX; i++) {
にすると。。
735399:2007/07/21(土) 23:28:52
まず2の倍数じゃないnを求めて
次に3の倍数じゃないnを求めて
次に5の倍数じゃないnを求めて



最後に31の倍数じゃないnを求めて
残ったnを表示する

見たいな感じで作ろうとしたんですけど。。。
736デフォルトの名無しさん:2007/07/21(土) 23:29:49
>>720
int a,n[1000];
a=n%2
nの使い方もおかしい
737デフォルトの名無しさん:2007/07/21(土) 23:31:12
>>735
それじゃまるで素数は1個しか残らないみたいじゃない
738デフォルトの名無しさん:2007/07/21(土) 23:34:06
俺も素数を表示するソース作ったが見るか?
739399:2007/07/21(土) 23:34:29
>>737
それではじめにnは1から1000までって定義して>>735みたいにしたら
素数残るかなって思ったんですけど。。。
740399:2007/07/21(土) 23:35:48
>>738エラトステネスの篩を使ってるなら是非見せてください!
741デフォルトの名無しさん:2007/07/21(土) 23:37:37
名前欄は「720」にしたほうがいいと思う
742デフォルトの名無しさん:2007/07/21(土) 23:40:36
>>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;
}
743デフォルトの名無しさん:2007/07/21(土) 23:41:19
>>740
エラトステネスの篩ではないので見せないでいいか
744デフォルトの名無しさん:2007/07/21(土) 23:41:40
>>742
> for(i=2,c=0; i<MAX; i++) {
ここの ,c=0 は要らんかった
745デフォルトの名無しさん:2007/07/21(土) 23:45:55
>>742
prime[2]=1; < これ要らんかったw
for(i=0; i<MAX; i++) prime[i]=1; < i=2; からやった。なんか無駄を省かないでやるのまんどっち
746743:2007/07/21(土) 23:46:42
>>740
俺が見せるまでもない。俺よりも完成度が高い無駄のないプログラムのお手本が>>742
747デフォルトの名無しさん:2007/07/21(土) 23:48:07
if(!a)処理

これはどういう意味でしょうか
748デフォルトの名無しさん:2007/07/21(土) 23:49:03
>>666-668のプログラムもお願いしますだ師匠
749デフォルトの名無しさん:2007/07/21(土) 23:49:04
>>747
aの中のnotを評価して0ならスルー、それ以外ならそのif以下の処理をする
750デフォルトの名無しさん:2007/07/21(土) 23:49:25
if(a!=0)と同じじゃない?
751デフォルトの名無しさん:2007/07/21(土) 23:51:11
>>749
if(a!=0)処理

これと同じってことですか?
NULLでもいいんですか?
752デフォルトの名無しさん:2007/07/21(土) 23:51:37
>>748
値渡しだから返ってこなくて正解
753デフォルトの名無しさん:2007/07/21(土) 23:54:01
>>741
いっそ、>>0721で。
754デフォルトの名無しさん:2007/07/21(土) 23:54:20
>>751
if(a==0) 処理 と同じじゃないか?

a==0 のとき !a が非ゼロ
a!=0 のとき !a がゼロだから
755デフォルトの名無しさん:2007/07/21(土) 23:56:06
>>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;
}
756720:2007/07/21(土) 23:56:58
720に変えました。
このプログラムのソースのアルゴリズムを理解しないと
点貰えないのでがんばって理解してみます!
ありがとうございました!!!!!
757デフォルトの名無しさん:2007/07/21(土) 23:58:21
ってか >>754 が言う通りだったっけ、訂正。
a=0のとき、!aはの評価が1になってif分以下の処理がされる
0以外だと !a の評価は 0 になるんでスルー。
758デフォルトの名無しさん:2007/07/22(日) 00:01:31
>>756
2から素数が見つかるごとに、その2倍以上の 素数xn (nは2以上の整数)
になるものは当然素数じゃないんで、順番に篩い落とすわけだが
既に提示されているソースは、既に篩い落とされていると分っている部分は
敢えて if(prime[i]==1) ってのを省略しているから、それが引っかかったんじゃないか?
759デフォルトの名無しさん:2007/07/22(日) 00:08:27
>>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デフォルトの名無しさん:2007/07/22(日) 00:11:03
>>759
!a の型は整数型でしょ
761デフォルトの名無しさん:2007/07/22(日) 00:11:17
>>754
>>755
>>757
すみません混乱してきましたw
レスありがとうございます。
考え直してみます

>>759
すみませんintです><
762デフォルトの名無しさん:2007/07/22(日) 00:16:48
>>760
でしょって、そういうことじゃなくてint型でなければ結果は違うよって話だよ
763デフォルトの名無しさん:2007/07/22(日) 00:19:05
>>747にはaの型は書かれていない
764デフォルトの名無しさん:2007/07/22(日) 00:20:41
ここで聞いたり答えチラ見したりしつつ地道にやってるが、
既存の関数を自作しろって問題が一発で解けたりするとうれしいな

お前ら愛してる
ありがとう
765デフォルトの名無しさん:2007/07/22(日) 00:37:39
>>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
766デフォルトの名無しさん:2007/07/22(日) 00:39:16
うちのbccちゃんは違うよーww
767デフォルトの名無しさん:2007/07/22(日) 00:41:22
>>765
ん〜〜〜、0か1にはならんかったよ。俺んとこはこうなった。
a:0 !a:4.94066e-324
a:0.1 !a:5.23869e-11
a:5 !a:2048
768デフォルトの名無しさん:2007/07/22(日) 00:46:06
!の意味がわかっていないアホバカり
769デフォルトの名無しさん:2007/07/22(日) 00:46:39
>>766-767
!a の書式指定は %d じゃないと…

これも追加してみて
printf("%g\n", 0, 0);
printf("%g\n", 0, 1);
printf("%g\n", 0);
770デフォルトの名無しさん:2007/07/22(日) 00:53:13
>>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;
}
771デフォルトの名無しさん:2007/07/22(日) 01:04:25
結局>>757が正解。
aがどんな型であろうと、!aはint型。
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010
772デフォルトの名無しさん:2007/07/22(日) 04:32:32
C言語よおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおい

お前は壁を乗り越えれば乗り越えるほど新しい壁作ってんじゃねーよおおおおおおおおおおおおおおおおお

1つのことを理解するたびにお前が遠くなっていく気がするぜ
773デフォルトの名無しさん:2007/07/22(日) 08:30:53
そりゃあんた、自分で「思い込み」という壁を作りながら壁を乗り越えるからだ。
774デフォルトの名無しさん:2007/07/22(日) 09:34:08
>>773
いや、それがさ聞いてくれよ

いままでちゃんと動いてたのに関数1個追加しただけで急に動かなくなったりするわけよ
775デフォルトの名無しさん:2007/07/22(日) 09:37:26
糞きたねープログラム書いてんじゃないのか?
一週間間を置いた後に読めるか?
776デフォルトの名無しさん:2007/07/22(日) 09:47:08
>>775
読むのは以前の問題だな、関数にすると仕様がちょっと変わってくるだろ
777デフォルトの名無しさん:2007/07/22(日) 09:55:30
関数一個追加しただけなら、その関数周辺を洗えばいいだけだから楽なもんだろ。
778デフォルトの名無しさん:2007/07/22(日) 09:59:06
その洗うのがまた面倒なんだ

ある関数に文字列を入力するようにしてたとする、今度は条件文をつけてその文字列に
送るようにすると、文字入力が省略されたりするんだ
779デフォルトの名無しさん:2007/07/22(日) 10:23:04
文字入力
if(条件) 関数(文字列);

文字入力が省略されたらまずい場合こうすればいいだけのことじゃないか?
780デフォルトの名無しさん:2007/07/22(日) 10:26:29
>>778
もう夏休みなの?
781デフォルトの名無しさん:2007/07/22(日) 10:46:44
>いままでちゃんと動いてたのに関数1個追加しただけで急に動かなくなったりするわけよ
まさしく、>773。
782デフォルトの名無しさん:2007/07/22(日) 10:58:12
int x=0;
printf("%s",x );

ここで変数xの値によって違う文字列を出力したいのですが
このPrintfの中で引数xの後ろに?とかつけて文字列を指定
するやり方があったと思うのですが思い出せません。
どなたか構文教えてください。
783デフォルトの名無しさん:2007/07/22(日) 11:01:15
intを%sはおかしくないか?
その文字列を格納してある変数を指定しないと
784デフォルトの名無しさん:2007/07/22(日) 11:01:51
三項演算子でググれ
785デフォルトの名無しさん:2007/07/22(日) 11:06:00
>>783>>784
ありがとうございました!見つかりました!
786デフォルトの名無しさん:2007/07/22(日) 11:22:55
>>784
条件演算子という名前も思い出してあげてください。
787デフォルトの名無しさん:2007/07/22(日) 11:56:37
だが、断る!
788デフォルトの名無しさん:2007/07/22(日) 12:55:12
>>772
C言語は高級アセンブラなんだと考えろ。
そうすれば、仕様を覚える度に謎は謎でなくなる。
C99は、もはや高級言語になってしまったがな。
789デフォルトの名無しさん:2007/07/22(日) 13:13:50
こんな感じで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;
}

浮動小数で正しく表現できない数が出ちゃってるから駄目なんですかね
790デフォルトの名無しさん:2007/07/22(日) 13:23:00
アンダーフロー
791789: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秒かかると思うのですが
分かりません。教えてください。お願いします。
793デフォルトの名無しさん:2007/07/22(日) 14:54:20
>>792
>30回sleepするので
何を言っている。

親プロセス     子プロセス

fork() -─────-┐
│           │
│この間、10秒.   │
│           │
↓           │この間、20秒
.:            │
.:            │
.: wait()        │
.:            │
.: ←-──────┘
exit(0)
794デフォルトの名無しさん:2007/07/22(日) 14:54:31
ifで分岐してるから
795デフォルトの名無しさん:2007/07/22(日) 14:58:14
今時メンテ以外でforkなんて使ったりするもんなの?
796792:2007/07/22(日) 15:05:26
>>793
ありがとうございます。
でもまだよくわからないんです。
親プロセスでsleep実行してるときって子プロセスの処理できるんですか。
797デフォルトの名無しさん:2007/07/22(日) 15:11:24
scanfで文字列として数値を入力したあとにこの入力した値をdouble型に変換したいのですがどうすればいいでしょうか?
798デフォルトの名無しさん:2007/07/22(日) 15:13:44
strtodでググれ
799デフォルトの名無しさん :2007/07/22(日) 15:18:42
>>797
strtod()を使え
800デフォルトの名無しさん:2007/07/22(日) 15:19:40
>>797
strtod呼べ
このスットコドッコイ
801デフォルトの名無しさん:2007/07/22(日) 16:36:35
乱数のプログラムですが、
time関数を使うために
srand((unsigned int)time(NULL));
を使うとコンパイル時に 未定義のシンボルNULLとエラーがでてしまいます。
どうすればよいでしょうか。
802デフォルトの名無しさん:2007/07/22(日) 16:41:00
>>801
使用している環境は?stdio.h やら stdlib.h あるいは iostream など取り込んでいるか?
803デフォルトの名無しさん:2007/07/22(日) 16:41:47
#インクルード タイム。h
って書いた?
804デフォルトの名無しさん:2007/07/22(日) 16:42:24
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個発生させるというものです。
806デフォルトの名無しさん:2007/07/22(日) 17:05:22
それで NULL が使えないのか・・・。
なら stddef.h でもインクルードしとけ。
807デフォルトの名無しさん:2007/07/22(日) 17:08:15
どこの処理系だよ。
808デフォルトの名無しさん:2007/07/22(日) 17:08:40
なんで 0 じゃだめなのか?>>805
809デフォルトの名無しさん:2007/07/22(日) 17:12:33
<stddef.h > インクルードしましたがやはりエラーは消えませんでした。
808様 0に変えることでコンパイル成功しました。ありがとうございます。
810デフォルトの名無しさん:2007/07/22(日) 17:13:34
>>809
OSとコンパイラを教えてください
811デフォルトの名無しさん:2007/07/22(日) 17:14:36
0 にすれば問題はないけど、
NULL が使えないというその処理系は凄く気持ち悪いな。
他にも変な所がありそうで怖い。
812デフォルトの名無しさん:2007/07/22(日) 17:16:24
そのプロジェクトはいったん忘れて

nulltest.cってファイル作って下のソース書いて実行してみたら。
これで通らなかったから根本的なところでなんかおかしい。
#include <stdio.h>
int main(){ return (int)NULL; }
813デフォルトの名無しさん:2007/07/22(日) 17:21:08
安易な解決法を提示したがために、
後々困ることにならない事を祈る。
814デフォルトの名無しさん:2007/07/22(日) 17:21:50
Cコンパイラ:Borland C++ Compilerを使っています。
812様のソース実行しましたが、やはりエラーがでてしまいました
815デフォルトの名無しさん:2007/07/22(日) 17:24:43
バージョンが古すぎるんじゃね?
#define NULL 0でも書いて対応するしかなさそ。
816デフォルトの名無しさん:2007/07/22(日) 17:30:19
確かに古いのかもしれません。
#define NULL 0 と書いたら NULLが使えるようになりました!
色々とご指摘ありがとうございます
817デフォルトの名無しさん:2007/07/22(日) 17:30:24
いくらバージョンが古くても、NULL がないってことあるのかなあ。
インストール手順で何かミスがあったとしか・・・。

NULL が使えないってことは、size_t とかも使えないんだろうか。

#include <stddef.h>
int main() { return (int)(size_t)0; }

は通る?
818デフォルトの名無しさん:2007/07/22(日) 17:34:52
817様のソースは 通りました
インストール手順は、他のでは上手くいくのでミスはないかと・・・
819デフォルトの名無しさん:2007/07/22(日) 17:39:08
size_t は使えるのか・・・。
NULL だけ使えないって何か不思議だなあ。
まあ、NULL だけ使えないみたいだから、
自前で定義するか 0 を直接使うかってところか・・・。

stddef.h を探して NULL の定義を直接埋め込んだのでもいいとは思う。
820デフォルトの名無しさん:2007/07/22(日) 17:39:45
そのウンココパイラ捨てろw
821デフォルトの名無しさん:2007/07/22(日) 17:46:25
ヘッダファイル内で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");
}
}

さっぱりわかりません
よろしくお願いします
824デフォルトの名無しさん:2007/07/22(日) 17:49:31
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]);
}
}

これもさっぱりです・・・
教えてください
827デフォルトの名無しさん:2007/07/22(日) 18:20:47
さっぱりって言われると何教えていいか分かんないよ
先生にでも聞いたら?
828デフォルトの名無しさん:2007/07/22(日) 18:22:04
簡易CG作成のプログラムなんですけど、
円を作ってそれを移動、壁で反射、色が点滅などやらなければいけなくて
移動までは出来るようになったんですが後がさっぱりでs

助けてくだしあ><
829デフォルトの名無しさん:2007/07/22(日) 18:26:03
>825
宿題の答えが知りたいだけなら、宿題スレ行けよ
830デフォルトの名無しさん:2007/07/22(日) 18:45:28
私も冷たいシャワーを浴びてさっぱりです
831デフォルトの名無しさん:2007/07/22(日) 20:15:39
ファイルのオープンに関して質問させてください
文字列を名前にした場合
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とかしてみましたが上手くいきません

結構悩んだのですがさっぱりです!!
解説よろしくお願いします
832デフォルトの名無しさん:2007/07/22(日) 20:17:34
sprintf使え
833デフォルトの名無しさん:2007/07/22(日) 20:23:11
>>831
char buf[100];
int i;
for(i=0;i<=2;i++) {
sprintf(buf,"&d.txt",i);
fp = fopen(buf,"r");
//
}
834833:2007/07/22(日) 20:23:46
失敗
×sprintf(buf,"&d.txt",i);
○sprintf(buf,"%d.txt",i);

835デフォルトの名無しさん:2007/07/22(日) 20:34:36
bccだが>>812問題なかったぞ
バージョンは5.5.1
836デフォルトの名無しさん:2007/07/22(日) 20:53:17
>>832 >>834 >>835
ありがとうございます!!
凄い悩んでたのがスッキリしますた
sprintf活用してみます
837デフォルトの名無しさん:2007/07/22(日) 20:54:19
全くの初心者です。
います。C言語の基礎の基礎という本に添付されたCDに入っていたLSI Cを使ってプログラム
のコンパイルをしようとしています。書かれていたプログラムをSample1.c
という名前で保存しました。コマンドプロンプト画面で
C:\CGENGO\PRACTICE>DIRを入力して調べると469 Sample1.cが保存されて
いるのが分かります。
同じ画面でC:\CGENGO\PRACTICE>Lcc Sample1と入力しても
SAMPLE.EXEが作成されません。どうしたらよいか教えてください。
838デフォルトの名無しさん:2007/07/22(日) 20:58:32
C言語どころかパソコン初心者…?
まずその本に書かれている通り導入したのか?
839デフォルトの名無しさん:2007/07/22(日) 21:00:00
Windows 環境変数 PATH
でぐぐる
840デフォルトの名無しさん:2007/07/22(日) 21:26:55
>>837
マジで悪いことは言わないからLSI-Cはやめてbccかgcc(MinGW)にしとけ。
乗りかえるの今からでも全く遅くないから。
841デフォルトの名無しさん:2007/07/22(日) 21:33:39
>>837
VisualC++2005ExpressEditionでもいいぞ
842デフォルトの名無しさん :2007/07/22(日) 21:50:12
VisualC++2005ExpressEditionは初心者が
C学ぶのに使うと、ANSI Cの標準関数で
非推奨な関数(scanfとか)使うとwarrningでまくりで
混乱するんじゃないか?
843デフォルトの名無しさん:2007/07/22(日) 21:53:10
コピペしてそのままデバッグすると、モノによるが一瞬で消えるしな
844デフォルトの名無しさん:2007/07/22(日) 21:58:16
皆さんありがとう。参考にさせていただきます。(初心者)
845デフォルトの名無しさん:2007/07/22(日) 22:42:45
>>829
すいません、教えて欲しいんです。
自分でできるようになりたいです。
846デフォルトの名無しさん:2007/07/22(日) 22:44:36
どうして学校の先生に聞かないんだい?
そういうのも含めて授業料払ってるんだから、もったいないよ。
847デフォルトの名無しさん:2007/07/22(日) 22:44:48
>>845
じゃあ自分でできるまでがんばれ
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; }
全体はこんな感じです。
850デフォルトの名無しさん:2007/07/22(日) 22:50:31
>>848
その説明のどのあたりが分からないかいってみそ。
851デフォルトの名無しさん:2007/07/22(日) 22:52:28
デフォで(何も入力しないで)Yesにするってことでは?
852デフォルトの名無しさん:2007/07/22(日) 22:53:16
>>849
その行、意味ないような気がするが。
853デフォルトの名無しさん:2007/07/22(日) 22:55:33
>>489
その行のプログラム中での存在意義が知りたいの?
854デフォルトの名無しさん:2007/07/22(日) 22:55:57
僕も意味がないように思って質問しました。
>>851さんの言ってることが正しいのでしょうか??
855デフォルトの名無しさん:2007/07/22(日) 22:57:43
>>853さん
そうです。なんの意味があるのかわからなくて…
あとおかしい部分ってありますか?
856デフォルトの名無しさん:2007/07/22(日) 22:58:02
>>854
if()でline[0]を見る前に、gets()を通してるから、初期化しても意味ないように見えるけど。
857デフォルトの名無しさん:2007/07/22(日) 22:58:06
>>846
明日、提出なんでs

>>847
時間が・・
858デフォルトの名無しさん:2007/07/22(日) 23:00:35
>>857
だーかーらー宿題は宿題スレで質問しろって
http://pc11.2ch.net/test/read.cgi/tech/1184506311/
859デフォルトの名無しさん:2007/07/22(日) 23:01:46
期限ギリギリまで自分で考えても分からなければ、「分かりませんでした」って言いに行けよ。
生徒の頭悪いのは教師がなんとかするしかないんだから、文句は言えんだろ。
860デフォルトの名無しさん:2007/07/22(日) 23:06:38
>>858
だーかーらー丸投げしたいわけじゃねーんだよ

>>859
そうすることにする
861デフォルトの名無しさん:2007/07/22(日) 23:08:35
死ねよ。
862デフォルトの名無しさん:2007/07/22(日) 23:10:08
大学はそんなに甘くない
頭も態度も悪けりゃ落とすだけ
863デフォルトの名無しさん:2007/07/22(日) 23:10:27
>>860
宿題を貼り付けて「教えてください」って、丸投げだろう。
自分はこういうふうに考えたとか、分からない箇所をもっと絞り込んで質問するとかしないと。
864デフォルトの名無しさん:2007/07/22(日) 23:10:28
明日提出で時間無いから自分で考えるのは無理だけど、
丸投げはしたくないから教えろってどんだけわがままなんだw
素直にあきらめるのが一番だな
865デフォルトの名無しさん:2007/07/22(日) 23:10:36
生徒はまったくついていけず
教師はますます授業の難易度を下げていく
日本学生の質の悪さは先進国でダントツトップとなる

こうして日本は平和になった
866デフォルトの名無しさん:2007/07/22(日) 23:11:56
>>859
教師も頭悪そうだから丁度いいかもね。
867デフォルトの名無しさん:2007/07/22(日) 23:12:48
>>865
>日本学生の質の悪さは先進国でダントツトップとなる
断然トップトップ?
868デフォルトの名無しさん:2007/07/22(日) 23:15:34
>>856さん
じゃあやっぱあの行はいらないですか??
869デフォルトの名無しさん:2007/07/22(日) 23:15:49
860は偽者じゃまいか
870デフォルトの名無しさん:2007/07/22(日) 23:16:00
断凸だと思ってたぜ
871デフォルトの名無しさん:2007/07/22(日) 23:18:16
>>868
不要
872デフォルトの名無しさん:2007/07/22(日) 23:26:19
大学は気持ち悪いくらいに甘々
技術者の端くれともいえないゴミが大学で教鞭振ってる現状は異常
教授なんてぶっちゃけ事務職(+他校とのパイプ役)以外のなんでもない
873デフォルトの名無しさん:2007/07/22(日) 23:28:28
int a[2]={10.20};printf("%d%d,a,&a[0]") 2つの数値表示させたとき、どうなる?一緒?
874デフォルトの名無しさん:2007/07/22(日) 23:30:46
でもあれだよな
y/nで聞かれているのにn以外だったら継続ってのもなんだよな
まぁ別にいいけどさ
875デフォルトの名無しさん:2007/07/22(日) 23:31:33
>>873
まず試してからこうなったんだけどって質問に来いよ
876デフォルトの名無しさん:2007/07/22(日) 23:33:07
0番目しか見てないからnipponchachachaでもループ抜ける
877デフォルトの名無しさん:2007/07/22(日) 23:37:25
>>873
つうかコンパイルとおらねぇだろ、それ。
なんかもういろいろ間違いすぎだ
878デフォルトの名無しさん:2007/07/22(日) 23:42:15
>>873
俺がコンパイラならキレる
879デフォルトの名無しさん:2007/07/22(日) 23:54:38
int a[2]={10,20};
printf("%d %d",a,&a[0]);
とりあえずコンパイル通るようにしてみた。
%dのままでいいかどうかはシラネ
880デフォルトの名無しさん:2007/07/22(日) 23:55:22
これは凄い間違い探しだ
881デフォルトの名無しさん:2007/07/23(月) 00:02:10
>>877-878
思わずワロタ

コンパイラ超がんばれ
882デフォルトの名無しさん:2007/07/23(月) 00:04:30
同じ値にしたいなら

("%d %d",a[0],a[0]);

でいいじゃないか
883デフォルトの名無しさん:2007/07/23(月) 00:36:11
イロイロすまんかった。解決した。

ありがとう^^ コンパイラに切れられないように精進します。
884デフォルトの名無しさん:2007/07/23(月) 02:04:06
文字列操作について質問させて下さい。
strcpyで、コピー元とコピー先が重なる場合の動作は、定義されない。
とあるんですが、これは
char str[] = "abcdef";
char *p1, *p2;
p1=str; p2=&str[1];
strcpy(p1, p2);
とした場合の動作も未定義となるのでしょうか?
885デフォルトの名無しさん:2007/07/23(月) 02:05:17
ダメです。
886デフォルトの名無しさん:2007/07/23(月) 02:43:32
>>884
おもいっきり重なってないか?
重なったら未定義らしいんですが、重なってたら未定義ですか?って質問してるぞ。
887884:2007/07/23(月) 03:33:59
>>885-886
回答ありがとうございました。
888デフォルトの名無しさん:2007/07/23(月) 03:42:31
>>884
この場合の「重なる場合」とは、どこか一部でも重なっている場合を指す。
889デフォルトの名無しさん:2007/07/23(月) 06:40:06
Windows PCの名前は何文字まで可能でしょうか?
890デフォルトの名無しさん:2007/07/23(月) 06:46:26
やればわかる
891デフォルトの名無しさん:2007/07/23(月) 14:00:31
C言語を少しだけ勉強したい。コンパイル用に安いVisual C++を入手
する方法を教えてください。バージョンは古くてもいいです。
892デフォルトの名無しさん:2007/07/23(月) 14:02:37
>>891
無料じゃだめか?
VisualC++2005ExpressEdition
MicrosoftのHPからダウンロードできる
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
893デフォルトの名無しさん:2007/07/23(月) 14:21:40
>>891 その前に、BCCとCpad for BCCにしとき。
894デフォルトの名無しさん:2007/07/23(月) 17:15:06
BCC なんて古くて死ぬぜ。
895デフォルトの名無しさん:2007/07/23(月) 17:16:24
VC++2005EEのCL.EXEがいいぞ
896デフォルトの名無しさん:2007/07/23(月) 17:17:02
まあ両方入れて同時に使ってみるべし
897デフォルトの名無しさん:2007/07/23(月) 17:17:49
今更 BCC とか
898えいいち ◆GRGSIBERIA :2007/07/23(月) 18:12:49
#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の値が変になってしまいます。
ですが、コメントを外すと正常に表示されます。二つのアドレスも同じです。
どうしてそうなるのか、またどうすれば改善できるのか教えてください。お願いします。
899デフォルトの名無しさん:2007/07/23(月) 18:13:21
スレタイ嫁
900デフォルトの名無しさん:2007/07/23(月) 18:29:55
いや、これは出力がC++なだけで、Cの質問と思ってもいいのでは。
でも質問のソースは何か抜けてる。
もう一回書いてみて。printf()になおすのが望ましいが。
901デフォルトの名無しさん:2007/07/23(月) 18:34:53
よかないよ。
902デフォルトの名無しさん:2007/07/23(月) 18:35:32
vc2005ってNRVO効いたのか
903デフォルトの名無しさん:2007/07/23(月) 18:42:43
#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;
}
904デフォルトの名無しさん:2007/07/23(月) 18:46:57
>名前の違う変数をいくつか宣言し、forとポインタを使っていっぺんに初期化をしたいのですが
普通に宣言時に初期化したほうがいいんじゃね?
つうか配列とかC++ならvectorみたいなコンテナ使った方がいいんじゃね?
って突っ込みは野暮ですか?
905デフォルトの名無しさん:2007/07/23(月) 18:53:15
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文で回してあげればいいんだよ
と教えてもらいましたがいまいちよくわかりません。
908デフォルトの名無しさん:2007/07/23(月) 19:15:46
>>906
3時間何の勉強してたんだ?
一問目は配列とfor文だけわかれば出来ると思うんだが
それ以降もif文使えばできる
909デフォルトの名無しさん:2007/07/23(月) 19:16:17
宿題スレでもいけ
910デフォルトの名無しさん:2007/07/23(月) 19:16:30
911デフォルトの名無しさん:2007/07/23(月) 19:16:35
つーか宿題スレ池
912デフォルトの名無しさん:2007/07/23(月) 19:24:54
#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 とか
914デフォルトの名無しさん:2007/07/23(月) 19:41:25
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;
}
918デフォルトの名無しさん:2007/07/23(月) 19:51:05
>>917
p--;って何がしたいんだ。
919デフォルトの名無しさん:2007/07/23(月) 20:00:07
for文の初期化はどこにあるんだ
920デフォルトの名無しさん:2007/07/23(月) 20:08:30
>916
Unreachable code in function mainの意味は「main関数に到達不能なコードがあります」だ(return文の後に書いたコードにも同じ警告が出るはず)。
しかし実際には警告と異なり、>>914が書いたように実行されてしまう。
921デフォルトの名無しさん:2007/07/23(月) 20:20:57
初心者にVC++2005EEなんて進めても、今度は使い方を教えてくれってなるだろw
922デフォルトの名無しさん:2007/07/23(月) 20:20:59
文字コードについて、わかりやすく解説してあるサイトはないでしょうか?
ASCCIコードやJISなど、何進数を使って、どういう特徴があるかなど
923デフォルトの名無しさん:2007/07/23(月) 20:34:22
ASCCIコード に一致する日本語のページ 約 73 件中 1 - 50 件目 (0.20 秒)
924デフォルトの名無しさん:2007/07/23(月) 20:36:23
>何進数を使って
925デフォルトの名無しさん:2007/07/23(月) 21:01:43
>何進数を使って
ワロタww
16進数でも10進数でも2進数でも値は同じだよ
926デフォルトの名無しさん:2007/07/23(月) 21:07:43
927デフォルトの名無しさん:2007/07/23(月) 21:11:33
>>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からでも動くと思います。
931922:2007/07/23(月) 22:04:03
サンクス
932デフォルトの名無しさん:2007/07/23(月) 22:04:50
-10の2進数は 11110110であってますでしょうか?
933デフォルトの名無しさん:2007/07/23(月) 22:07:24
>>932
合ってる。
基数の変換はWindowsの電卓でできるよ。
934923:2007/07/23(月) 22:11:22
はい、ありがとうございました。
935デフォルトの名無しさん:2007/07/23(月) 22:17:59
>>930
動くかも知れんがあまりそういうことはやらないんじゃない?
ローカル変数をスタックに積む順番ってC言語の仕様で決められてたっけ?
936デフォルトの名無しさん:2007/07/23(月) 22:31:23
10 は 0000 1010
反転して 1111 0101
1足して 1111 0110
2の補数表現には反転して1足すのが楽
937デフォルトの名無しさん:2007/07/24(火) 00:12:39
>>930
だから、なんでスレタイ無視してC++で書くの?

>>935
決まっていない。そもそも、スタックフレームを形成するかどうかさえ決まっていない。
つーか、まともなコンパイラなら、ちゃんと最適化すればアドレス解決演算子を使っている
a以外はスタックに置かない。それどころか存在そのものを否定するかもしれん。
938デフォルトの名無しさん:2007/07/24(火) 01:19:40
>>936
別のやり方ですね
939デフォルトの名無しさん:2007/07/24(火) 01:22:05
普通のやり方かと・・・
940デフォルトの名無しさん:2007/07/24(火) 01:29:23
別のやり方とは?
941デフォルトの名無しさん:2007/07/24(火) 01:34:12
1を引いて反転するとかを言いたいんじゃない?
いや、一緒なんだけどさ・・・足すほうが俺は計算しやすいな。
942デフォルトの名無しさん:2007/07/24(火) 01:46:38
Cで書いたアプリケーション中で、./image/image1.bmpってファイル参照を書いてます。
これをコンパイルして、そのディレクトリで実行したら画像は表示されるのに、
別のディレクトリから、../../app みたいに実行すると画像が表示されません。
どうやったらどこから実行しても画像が表示できるようになりますか?
943デフォルトの名無しさん:2007/07/24(火) 01:55:51
符号反転に-1を使うのは、なにか自分の定義に自分自身を使うようで、なんかイヤ。
944デフォルトの名無しさん:2007/07/24(火) 02:17:32
>>942
画像ファイルの指定を絶対パスにてみては?
945デフォルトの名無しさん:2007/07/24(火) 02:20:24
>>943
・・・??
946デフォルトの名無しさん:2007/07/24(火) 03:14:43
>>942
>>944 の言うように絶対パスにするとか
readlink("/proc/self/exe"); とか getenv("_") とかソースに埋め込むとか
いろいろあるだろうけど基本的にはC言語の範疇じゃないな.
947デフォルトの名無しさん:2007/07/24(火) 03:36:21
>>942
これで助けになるかな?
#include<stdio.h>
#include<libgen.h>

int main(int argc, char *argv[]){
printf("%s/image/image1.bmp\n", dirname(argv[0]));
return 0;
}
948デフォルトの名無しさん:2007/07/24(火) 03:48:29
>>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;
}
949デフォルトの名無しさん:2007/07/24(火) 10:12:47
#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;
950デフォルトの名無しさん:2007/07/24(火) 10:16:46
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と表示されます。
なぜでしょうか?
951デフォルトの名無しさん:2007/07/24(火) 10:26:20


   ま た s c a n f か

952デフォルトの名無しさん:2007/07/24(火) 10:29:47
両方のforのループカウンタでiを使ってるけどこれは意図してこう書いてるの?
953デフォルトの名無しさん:2007/07/24(火) 10:48:43
Visual C++を入手するには
Visual Studioを購入しなければならないのですか?
954デフォルトの名無しさん:2007/07/24(火) 10:51:30
コマンドライン版だけ欲しいってことならPlatformSDKでも落としとけ
955デフォルトの名無しさん:2007/07/24(火) 10:52:58
>>953
VisualC++2005ExpressEditionは無料でダウンロードできるよ
956デフォルトの名無しさん:2007/07/24(火) 10:53:22
>950
>for (i = int_bits() -n -1;i>=0;i--)
>temp *= 2;
>n++;
iじゃなくて別の変数にすべきだし>=じゃなくて>だろってのはおいといても、temp << i で十分だろ
957デフォルトの名無しさん:2007/07/24(火) 10:53:32
そのメール欄からして>>891

答え書いてあるのに読めないのか?
別人だとしてこのスレぐらい全部読めよ
っていうか入門書だとかに大抵無料のコンパイラついてくるんだからそれ使えよ
958デフォルトの名無しさん:2007/07/24(火) 11:19:11
>892 大変失礼しました。わたしの質問891が1時間ほど待っても表示され
なかったのでgive upしてしまったのです。よく分かりました。
ありがとうございました。
959デフォルトの名無しさん:2007/07/24(火) 16:38:46
>>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 )とでてしまいました。
どうしてでしょうか?
960デフォルトの名無しさん:2007/07/24(火) 16:46:03
int_bits()がどこから出てきたのか我々には分かりません。
961デフォルトの名無しさん:2007/07/24(火) 16:50:05
>>960
>>949にあるんだけどね。
流れを追えないだけじゃなく、見当違いだから黙ってていいよ。

>>959
sum += x * (temp << i)でいいということだろ。
962デフォルトの名無しさん:2007/07/24(火) 17:00:22
>>961
temp << i
sum += x * temp;

でも問題ないだろ
セミコロンが無いのはともかく
963デフォルトの名無しさん:2007/07/24(火) 17:06:01
いやそれは問題あるだろ
temp <<= i; としたいのか?
964デフォルトの名無しさん:2007/07/24(火) 17:09:48
なんだってこのスレはこんなに頭の弱い子ばかりなんだろう……
965デフォルトの名無しさん:2007/07/24(火) 17:11:45
入門篇だからだよ
966デフォルトの名無しさん:2007/07/24(火) 17:12:54
すいません、わかりました。

temp = temp<<i;

でいけました。ご迷惑おかけしました
967デフォルトの名無しさん:2007/07/24(火) 17:27:22
何だこのバカさ加減は。
968デフォルトの名無しさん:2007/07/24(火) 17:33:01
その他人を見下す性格、あらためた方がいいと思うよ
969デフォルトの名無しさん:2007/07/24(火) 17:54:09
何百回も繰り返しcallされる関数が有るのですが、最初にcallされ
た場合に限り、特別な処理がしたいと思っています。staticなフラ
グを宣言すれば出来るには出来るのですが、何百回もcallされるの
に、最初の一回の為にフラグをチェックするのはちょっとバカバカ
しい。何か良い方法は無いでしょうか?
970デフォルトの名無しさん:2007/07/24(火) 17:56:01
>>969
間接コール?
971デフォルトの名無しさん:2007/07/24(火) 17:59:00
>>969
「最初にcallされた場合」フラグを関数内に持たず、関数外から引き数で与えては?
高々数百回程度じゃ歯糞にもならないけどね。
972デフォルトの名無しさん:2007/07/24(火) 18:04:34
関数ポインタで

func = first_func;
...
func = second_func;
とかやればいいんだけど普通の関数コールに比べてオーバーヘッドが発生するんで
フラグのチェックよりマシとは言いがたい。
973デフォルトの名無しさん:2007/07/24(火) 18:11:30
>最初の一回の為にフラグをチェックする
のではなく、
2回目以降全ての為に(1回目も)フラグをチェックする
と考えてはどうだろう。

いや、どうでもいいけどね。
974デフォルトの名無しさん:2007/07/24(火) 18:12:42
>>972
オーバーヘッドについて詳しく。
私の知る限り、イミディエイト関数呼び出しとレジスタ間接関数呼び出しで
大きく処理時間が異なるCPUはないのだけれど。
#寧ろ、某CPUはレジスタ間接の方が速いし。
975デフォルトの名無しさん:2007/07/24(火) 18:19:44
>>974
昔のパソコンは結構効いてたけど、最近のはあんまり関係ない気がする。
976デフォルトの名無しさん:2007/07/24(火) 18:23:11
レジスタに関数のアドレスをセットするのがオーバーヘッドになるって事でしょ
977デフォルトの名無しさん:2007/07/24(火) 18:32:38
>>976
それもまた、今のCPUなら殆ど無視できる。
978デフォルトの名無しさん:2007/07/24(火) 18:38:05
計測は力なり
979デフォルトの名無しさん:2007/07/24(火) 18:40:33
Efficeon搭載機を使う、とか…
980デフォルトの名無しさん:2007/07/24(火) 18:42:15
多少汚くても高速なCPUが力押しで処理してくれるのはいいんだが
初心者の小規模なプログラムだと「こっちのほうが高速だぜ」って言われても実感できない…
981デフォルトの名無しさん:2007/07/24(火) 18:53:48
知らぬ間にメモリ参照のコスト0の新技術が開発されたのかと思ったぜ
982デフォルトの名無しさん:2007/07/24(火) 18:56:23
関数呼び出しそのもののオーバーヘッドに対して、充分無視できるって話なだ。
983デフォルトの名無しさん:2007/07/24(火) 19:08:34
いや、static なフラグのチェック処理と比べるべきじゃないか。

このフラグのチェックも、
キャッシュと分岐予測が効けば大したことなさそうではある。
まあ、コスト 0 ではないだろうが。
984デフォルトの名無しさん:2007/07/24(火) 19:23:13
だからそもそも、高々数百回ごときで時間云々する意味がないっしょ。
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週目で.が入ってしまいます。
こういう問題はどのようにすれば解決するのでしょうか?
986デフォルトの名無しさん:2007/07/24(火) 19:34:36
987デフォルトの名無しさん:2007/07/24(火) 19:50:55
>>985
scanf("%1023[^\n]", str)
素直にfgets(str, sizeof(str), stdin)を使うべきだとは思うが。
988デフォルトの名無しさん:2007/07/24(火) 19:52:15
>>985
scanfは空白で入力が区切られるようになっている。
989デフォルトの名無しさん:2007/07/24(火) 22:39:57
1Gは1000.000バイトらしいのですが、どうやって求めるのでしょうか?
どうやれば、ギガをバイトにするのでしょか?
990デフォルトの名無しさん:2007/07/24(火) 22:42:56
これはひどい
991デフォルトの名無しさん:2007/07/24(火) 22:43:46
>>989
単位なんだから、もとめるもなにもないだろう。
K -> M -> G で、1000倍していけばいいよ。
992デフォルトの名無しさん:2007/07/24(火) 22:45:12
>>989
どこからの情報ですか?
993デフォルトの名無しさん:2007/07/24(火) 22:48:24
1024
994デフォルトの名無しさん:2007/07/24(火) 22:49:35
>>992
HDDメーカじゃないかな
あの業界だけ1000単位
995デフォルトの名無しさん:2007/07/24(火) 22:50:40
テラワロスとかって書き込みみても、どのくらいワロスのかピンとこないかわいそうな子。
996デフォルトの名無しさん:2007/07/24(火) 22:51:14
Kなら1024だけどkなら1000
容量なら1024だけどスループットなら1000
997デフォルトの名無しさん:2007/07/24(火) 22:57:41
サンクスです

>>992
解説の例題問題にありました。
998989:2007/07/24(火) 23:04:10
>>991
となると、1000.000.000 ではないのでしょうか?
999デフォルトの名無しさん:2007/07/24(火) 23:06:47
>>998
だね。
1000000だと1M。
1000デフォルトの名無しさん:2007/07/24(火) 23:09:42
1000なら1K
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。