C言語なら俺に聞け(入門編)Part 64

このエントリーをはてなブックマークに追加
201デフォルトの名無しさん
>>197
何がはいっていたら、というよりも
printfの引数としても、何も表示されない値があれば知りたいのです

>>199
やはり難しいですか…ありがとうございます。
>>200
char型の中身が出力可能な値であれば、出力用文字列に連結して…といった方法でしょうか
たしかにこれでも結果的に意図する処理は可能となります
202デフォルトの名無しさん:2010/05/20(木) 23:58:29
>>201
んだから、もしその値があったとして、いつその値を使うの?
常に空も、常に出力もダメなんでしょ?
203デフォルトの名無しさん:2010/05/20(木) 23:58:55
>>195
char c = 0;
printf("%c", c);
204デフォルトの名無しさん:2010/05/20(木) 23:59:28
>>203
だめよそれ。
./a.out > foo.dat
として内容をみてみればいい
205デフォルトの名無しさん:2010/05/21(金) 00:03:41
char outbuf[80];
char c;

c = 0;
sprintf(outbuf, "%c", c);
printf("%s", outbuf);

c = 'a';
sprintf(outbuf, "%c", c);
printf("%s", outbuf);
206デフォルトの名無しさん:2010/05/21(金) 00:04:08
>>202
例えば前後に別の文字リテラルが出力されたとして、その間を詰めたい時に
使いたいです
207デフォルトの名無しさん:2010/05/21(金) 00:06:03
でもそれを条件をもとにprintfを行うかどうかを分岐するのはいやなんだよね
208デフォルトの名無しさん:2010/05/21(金) 00:08:53
>>205
サンプルコードまでつけて頂いて、ありがとうございます。
文字列に格納してから出力するのが一番簡単でしょうか
その方法でやってみようと思います

>>207
はい、できれば。といっても、2〜3行ソースが増えるだけなんですけどね
209デフォルトの名無しさん:2010/05/21(金) 00:10:39
いいえ、分岐を行うのが一番簡単で速いです。
210205:2010/05/21(金) 00:12:11
>>205の方法にしても0を入れるかどうかの判断が必要なんじゃないか?
と思わんでもないが、納得したならそれでいいや。
階層によっては>>205の方が楽に進むこともあるだろし。
211デフォルトの名無しさん:2010/05/21(金) 00:14:50
>>198
だから何もしなければいい。
カンマを打つロジックは必ず通るだろうから。
212デフォルトの名無しさん:2010/05/21(金) 00:26:15
>>209
横着してました。その方向でいこうと思います。

>>211
すみません勘違いしてました。そういう意味ですか。
ありがとうございます。
213デフォルトの名無しさん:2010/05/21(金) 00:29:04
冗談に聞こえるかもしれんが「何もしない」というのは最も最適なコードなんだぜ?
一番速く処理できてバグの入り込む余地も全く無い完全な形。
やらんでいいことはやらないっていう、良い意味での手抜きはどんどんするべきだ。
214デフォルトの名無しさん:2010/05/21(金) 00:30:17
char c = 0;
printf(c?"%c":"",c);
215デフォルトの名無しさん:2010/05/21(金) 00:52:11
>>213
真理だな。
216デフォルトの名無しさん:2010/05/21(金) 01:38:00
>>192

http://codepad.org/wz1ntxB5

Nは入力させるようにしてしまった。#defineさせたかったんだろうね。。
こんなんでも一応うp
217デフォルトの名無しさん:2010/05/21(金) 01:47:06
気持ち悪いコードだw
218デフォルトの名無しさん:2010/05/21(金) 01:47:36
>>192
のりかかった船なので作り直した
http://codepad.org/zol3iRyi
219デフォルトの名無しさん:2010/05/21(金) 01:52:19
>>217
うむ
良きに計らえ
220デフォルトの名無しさん:2010/05/21(金) 07:04:29
>>194
ありがとうございました。
221デフォルトの名無しさん:2010/05/21(金) 08:20:56
>>220
いえいえ
222194:2010/05/21(金) 09:56:55
>>191 #include <stdio.h>
#define COLUMN 4
void in(double (*data)[COLUMN], char name){ int i, j;
  printf("%d行%d列の行列%cの各要素を入力してもらいます\n", COLUMN, COLUMN, name);
  for ( i = 0 ; i < COLUMN ; i++) {
    printf("第%d行の要素を入力して下さい>>>", i+1);
    for ( j = 0 ; j < COLUMN ; j++)
      scanf("%lf", &data[i][j]);
  }
  printf("各要素の値は次の通りです\n");
  for ( i = 0 ; i < COLUMN ; i++) {
    for ( j = 0 ; j < COLUMN ; j++)
      printf("%c[%d][%d]=%f\t", name, i+1, j+1, data[i][j]);
    printf("\n");
  }
}
int main(void) { int i, j, k;
  double a[COLUMN][COLUMN], b[COLUMN][COLUMN], c[COLUMN][COLUMN];
  in(a, 'A');
  in(b, 'B');
  printf("行列Aと行列Bの積は次の通りです\n");
  for ( i = 0 ; i < COLUMN ; i++) {
    for ( j = 0 ; j < COLUMN ; j++) {
      c[i][j] = 0.0;
      for ( k = 0 ; k < COLUMN ; k++)
        c[i][j] += a[i][k] * b[k][j];
      printf("%8.3f", c[i][j]);
    }
    printf("\n");
  }
  return 0;
}
223デフォルトの名無しさん:2010/05/21(金) 11:59:41
>>126
ワロタww

マジで>>125みたいな奴ほど害になる年長者は居ないわ。
224デフォルトの名無しさん:2010/05/21(金) 18:43:10
プログラムを書かずにプログラミングが上達する道などないと思うのですがね。
本を読むのは必要条件だが、十分条件ではない。
225デフォルトの名無しさん:2010/05/21(金) 18:48:52
読むだけでは全然上達しないというのはおかしな話だとは思わんか?
226デフォルトの名無しさん:2010/05/21(金) 18:53:50
俺も224に同意
227デフォルトの名無しさん:2010/05/21(金) 18:54:33
よっぽどの天才ならともかく、一般人は読むだけじゃその場は理解したつもりになるだけで、
結局は身につかないと思うけど。
228デフォルトの名無しさん:2010/05/21(金) 18:55:41
>>225
読んだことにより、書ける可能性が発生する、とは思うけれども、それを上達というかどうかは微妙。
読んでも書けないようではね。
229デフォルトの名無しさん:2010/05/21(金) 18:57:29
とりあえず

・読むだけでも上達するし、実際効率がいい、レベルアップには必須、ただし全く書かないと上達しない
・未経験SE(または唯一日本固有のSEw)のスーパー勘違いがうざい

もうこれでいいだろ喧嘩すんなよ
230デフォルトの名無しさん:2010/05/21(金) 18:59:06
読んで上達するのは分析力だよね。でもコーディング力より分析力のほうが世間では求められる
231デフォルトの名無しさん:2010/05/21(金) 19:12:03
つまり口だけプログラマーですね
232デフォルトの名無しさん:2010/05/21(金) 19:26:48
プログラマがこんな風に言うのを、何度聞いたことがあるだろう?「簡単さ! 1行修正するだけだ!」
233デフォルトの名無しさん:2010/05/21(金) 20:11:54
>>230
それはコードを読んで、でしょ?
本なりドキュメントなりを読むことで得られる知識なくして上達はありえないよね。

そういう意味で必要条件と書いているんだろうけど、その知識を得ること自体は上達に含まれないのか?ということ。
234デフォルトの名無しさん:2010/05/21(金) 20:13:31
ここで質問に答えてる人ってプロなの?
235デフォルト:2010/05/21(金) 20:26:20
急に割り込んで申し訳ありません。学生です。
大学の課題ではないのですが、参考書に載っている説明・解説だけでは自分だけでは理解不能なので教えてください。
参考書に載っている文体を変えずに書きます
@次のプログラムの#####のところを埋めて、3人の点数を入力すると平均点を出力するプログラムを作ってみよう♪
int score[5];
int i;
float sum, average;
for( i = 0; i<=4; i = i+1) {
#####
}
for( i = 0; i<=4; i = i+1) {
#####
}
#####
A @の枠組みを用いて、3人の点数を入力すると最高点を出力するプログラムを作ってみよう♪
B10個の値 x[0]〜x[9] を入力して、x[0]〜x[9]の中に偶数があれば「○」と表示し、偶数がなければ「×」と表示するプログラムを作ろう!!!
(複数偶数があったとしても「○」と表示するのは1回だけにしてみましょう。)

配列、for、ifを用いればできると書かれているのですが平均点が0になったりちんぷんかんぷんです。。。
助けてください。
236デフォルトの名無しさん:2010/05/21(金) 20:48:10
>>235
int score[5];
int i;
float sum, average;
for( i = 0; i<=4; i = i+1) {
##### 点数の入力
}
for( i = 0; i<=4; i = i+1) {
##### 平均点の算出
}
##### 平均点を出力

という意図の問題だと思うけどそこは間違えてない?

0になったりするソースを載せてみるといいよ
237デフォルトの名無しさん:2010/05/21(金) 20:55:17
問題おかしくないか?
3人の点数なのに5人分のデーターあるぞ
238デフォルト:2010/05/21(金) 20:56:01
>>236
二つ目の平均点を算出するところなのですが、何度やっても0点やマイナスなったりするのですが。。。
239デフォルト:2010/05/21(金) 21:05:07
>>237
タイプミスです。
240デフォルトの名無しさん:2010/05/21(金) 21:07:32
sumの初期化
241デフォルト:2010/05/21(金) 21:14:14
sum の初期化をしてもきちんとした値が出力されないのですが。
一応自分が書いたプログラミングはこんな感じです。
#include<stdio.h>
int main(void){
int score[5];
int i;
float sum,average;

for(i=0; i<=4; i=i+1){
printf("成績を入力してください。");
scanf("%d",&score[i]);
}
sum =0;
for(i=0; i<=4; i=i+1){
sum += score[i];
}
average =0;
average = sum / 5;
printf("平均点は%d",average);
return 0;
}
242デフォルトの名無しさん:2010/05/21(金) 21:19:37
>printf("平均点は%d",average);
243デフォルトの名無しさん:2010/05/21(金) 21:19:51
printf は "%f" とかの方がよくね?
244デフォルトの名無しさん:2010/05/21(金) 21:27:09
averageに0を代入する必要はない
あと %d じゃない
printf("平均点は%lf",average)
245デフォルトの名無しさん:2010/05/21(金) 21:30:02
>%lf
246デフォルトの名無しさん:2010/05/21(金) 21:30:37
for(i=0; i<=4; i=i+1){
printf("成績を入力してください。");
scanf("%d",&score[i]);
}

この部分って問題ないの?scanfの悪癖にはまって以来使わなかった記憶が。。
247デフォルトの名無しさん:2010/05/21(金) 21:38:16
>>241
printf("%g", averate);
http://codepad.org/nokvbVQ5
248デフォルトの名無しさん:2010/05/21(金) 22:33:14
>sum += score[i];
これって型が違うと警告でない?
sum += (float)score[i];
とキャストした方がいいと思うよ。出力結果は変わらないけど、何の値を扱っているか
必ず意識するのが、経験上バグが少なくなるから
>>246
最近はコマンドラインで入力するプログラムは作らないけど、入力は文字列で
受け付けて、atof() 等で変換するのが良かったと記憶している。



249デフォルトの名無しさん:2010/05/21(金) 23:00:21

#include <stdio.h>

int main(void){

double a;
short n;
int i, j , k;

n = -15;

a = (double)87654/5 + (double)n;

printf("a = %f\n", a);

return 0;
}
↑これはコンパイルできたのに、全く同形の 次書き込み続きます
250デフォルトの名無しさん:2010/05/21(金) 23:01:55

#include <stdio.h>

int main(void){

double a;
short n; 
int i, j , k;

n = -15;

 a = (double)87654/5 + (double)n;

printf("a = %f\n", a);

return 0;
}

がコンパイルできないんですが・・・・どういうことでしょう?
本当に困ってます。
まじでわからないんですが・・・・
ちなみに改行 行間まで一緒です。
ただカーソルを段落で移動させると動き方が違うんでうしょね
あ余計なこといったかな、とにかく何が原因だろ。
251デフォルトの名無しさん:2010/05/21(金) 23:04:37
>>250
全角空白が二箇所ある
252デフォルトの名無しさん:2010/05/21(金) 23:11:35
>>250
コンパイラにパスが通ってないとか。
なんかエラーくらい出てないの?
253デフォルトの名無しさん:2010/05/21(金) 23:17:04
>>252
睨んでるのは数字、数字が全角か半角とかかなぁ?
全角空白?何それwwいきなりラスボス級の試練とか・・・
見えない全角空白どうやって確認ww

やっぱりコピペとかはやめたほうがいいかな・・・
254デフォルトの名無しさん:2010/05/21(金) 23:19:50
コピペするなら、ソースよりエラーメッセージをしろよ
255デフォルトの名無しさん:2010/05/21(金) 23:20:38
>>253
何を言っているかよく分からないが、後者のコードには全角空白が含まれている
256デフォルトの名無しさん:2010/05/21(金) 23:26:04
全角空白やタブはエディタで可視化出来るだろ
257デフォルトの名無しさん:2010/05/21(金) 23:26:43
>>254
Okw 俺がエラメみても分かんないから貼ります

pen.c: In function `main':
pen.c:6: error: stray'129\' in program
pen.c:6: error: stray '@' in program
pen.c:11: error: strary '\129' in program
pen.c:11: error: strary'@' in program
pen.c:16:2: error: warning: no newline at end of file

おそらく全角半角だろどうせwww
258デフォルトの名無しさん:2010/05/21(金) 23:27:43
>>256
やり方教えてちょんwww
259デフォルトの名無しさん:2010/05/21(金) 23:30:29
>>257
全角半角です。本当にありがとうございました。
260デフォルトの名無しさん:2010/05/21(金) 23:34:25
>>258
(1)
short n; 
の行末の全角空白を削除する。

(2)
 a = (double)87654/5 + (double)n;
の行頭の全角空白を削除する。
261デフォルトの名無しさん:2010/05/21(金) 23:37:36
>>260
ありがとうwwwwww
これでやっと4つめいける・・・・・・

これだけで1週間考えたからなw何か
目に滲んでくるわw
262デフォルトの名無しさん:2010/05/21(金) 23:43:28
>>258
サクラエディタやeclipseは全角空白は □ と表示される。他は知らん
263デフォルトの名無しさん:2010/05/21(金) 23:53:56
int nlz(unsigned k){
union {
unsigned asInt[2];
double asDouble;
};
int n;
asDouble = (double)k + 0.5;
n = 1054 - (asInt[LE] >> 20); // little endianなら1,big endianなら0
return n;
}

これがうまく理解できません><
優しく解説してくれるエロい人はいませんか?
264デフォルトの名無しさん:2010/05/21(金) 23:54:40
>>248
どのコンパイラで警告出るの?
265デフォルトの名無しさん:2010/05/22(土) 00:11:19
>>263
指数部を見ると下から何桁まで利用しているかがわかるので、
それを使って先頭に0が何個必要かを求めてる
266デフォルトの名無しさん:2010/05/22(土) 00:14:45
http://codepad.org/KR64vgw2
1.文字列を入力
2.取り除く文字を入力
3.文字を取り除いて表示
というプログラムなのですが、2の行う段階で止まってしまいます。
解説お願いします。
267デフォルトの名無しさん:2010/05/22(土) 00:17:53
>>266
- scanf("%*c%c",c);
+ scanf("%*c%c",&c);
268デフォルトの名無しさん:2010/05/22(土) 00:24:58
宿題は宿題スレへ
269266:2010/05/22(土) 00:32:44
>>267
初歩的なミスでした・・・
ありがとうございます
>>268
これは失礼しました
270デフォルトの名無しさん:2010/05/22(土) 06:41:26
はあ・・・
271デフォルトの名無しさん:2010/05/22(土) 12:52:28
プログラミングの本ってさ、サンプルがあって、行ごとに何をやってるかが記載されてるんだよね。
でもいいかえれば 他人が作成したコードを見ることにかわりはないんだから、結局本なんて買わずネットで調査すればいいじゃんかと。
272デフォルトの名無しさん:2010/05/22(土) 12:57:38
いや、やっぱり商業目的で作られた説明と無償のボランティア的な説明とではそれなりに色々違うと思う
273デフォルトの名無しさん:2010/05/22(土) 15:46:19
C言語で1〜10までの範囲でrand関数の値を所得するにはどうすれば良いですか
rnd = rand(10)
これでいいんでしょうか
274デフォルトの名無しさん:2010/05/22(土) 15:47:24
すいません。以下のプログラムの最後のwhileのところで実行時エラーになります。
どうなってますか。unsigned charをcharにしたらうまくいったんですがどうなってますか。
{
  system("echo 111 > test_1.txt");

  unsigned char* p_uc;
  p_uc = new unsigned char[10];
  FILE* fp_uc;
  if((fp_uc = fopen("test_1.txt", "r")) == NULL){
    printf("file open error line:%d\n", __LINE__);
    exit(0);
  }
  int i=0;
  while((p_uc[i++] = fgetc(fp_uc)) != EOF){ ; }
}
275デフォルトの名無しさん:2010/05/22(土) 15:55:45
>>274
assert(static_cast<unsigned char>(EOF) != EOF):
276デフォルトの名無しさん:2010/05/22(土) 15:56:55
>>273
rand() % 10 + 1
(int)((double)rand() * 10 / ((double)RAND_MAX + 1)) + 1

前者の方が速いが、僅かに偏ったり、場合によって周期が短くなったりすることがある
後者の方が遅いが、どんな場合でも安心して使える
277デフォルトの名無しさん:2010/05/22(土) 15:59:24
>>274
EOF は負の数だから unsigned char に代入した時点で値が変わる。正しく比較できない。
そのため、無限ループになって配列範囲外にアクセスしている。
278デフォルトの名無しさん:2010/05/22(土) 16:00:04
279デフォルトの名無しさん:2010/05/22(土) 16:03:54
なるほど。EOFってただの-1だったんですね。勉強になりましたありがとうございました。
とりあえず以下で回避できました。
int temp_c;
while((temp_c = fgetc(fp_uc)) != EOF){
  p_uc[i++] = temp_c;
}
280デフォルトの名無しさん:2010/05/22(土) 16:39:11
#include <stdio.h>
int main(void)
{
int a, b;
scanf("%d%d" &a, &b);
return 0;
}

これコンパイルできなかったんですが・・・
どこらかどうみても
どこも間違ってるとこないような・・
どこが間違ってるんでしょう?
281デフォルトの名無しさん:2010/05/22(土) 16:43:27
VSでやっててプロジェクトの作り間違いとかじゃねえの
282デフォルトの名無しさん:2010/05/22(土) 16:43:29
いいかげん、全角スペースは飽きた
283デフォルトの名無しさん:2010/05/22(土) 16:47:33
block_cnt[j]=ch.shot_cnt;

**省略**

for(int j=0;j<7;j++){
block_cnt[j]=block_cnt[j]-1*BLOCK_TATE/ch.shot_cnt;
if(block_cnt[j]<=0){
block_cnt[j]=0;
}
}

コンパイルはできました。
BLOCK_TATE は 20 、 ch.shot_cnt は 40 です。

block_cnt[j]はdoubleで宣言したのですが、なぜ block_cnt[j] の値が減らないのかを教えてください。
-1*BLOCK_TATE/ch.shot_cnt を -1 に変えればちゃんと減るのですが・・・。
またできれば対応策もお願いします。
284デフォルトの名無しさん:2010/05/22(土) 16:50:04
20/40 = 0
285デフォルトの名無しさん:2010/05/22(土) 16:57:12
>>280
- scanf("%d%d" &a, &b);
+ scanf("%d%d", &a, &b);

>>281-282
おちつけ
286デフォルトの名無しさん:2010/05/22(土) 17:04:19
>>285


280ですがいや意味わかりません・・・
+ -ってなんですか?
この前はscanfで組んだプログラムできたんですが・・
どこが間違ってますか?
287デフォルトの名無しさん:2010/05/22(土) 17:06:45
>>286 なんで + - しか見ないんだよ。その後ろ見れば気づくだろ。わざとか?
288デフォルトの名無しさん:2010/05/22(土) 17:10:13
>>276
後者も偏りは出るだろ。
最大値が10の倍数でもないかぎり。
偏りを無くしたかったら振り直し法を使うしかないよ。
289デフォルトの名無しさん:2010/05/22(土) 17:59:11
んで、Kernighan 先生の本はもう買ったのか?
この本は必須だからな。
まず基礎を固めないと、その上に何を積み重ねても無駄無駄。
290デフォルトの名無しさん:2010/05/22(土) 18:31:37
とりあず
intでperioikoiと perioikoinとperioikoron
を変数名にして

perioikoi = 1
perioikoin =1で
perioikoron = perioikoi+perioikoinを実行したら
4ってなるんですけど何でですか?
291デフォルトの名無しさん:2010/05/22(土) 18:34:55
>>290 再現用コード貼ってみろ。
292デフォルトの名無しさん:2010/05/22(土) 18:38:54
>>291
頼むから作ってくれ・・・
他のこと指摘されそうで怖い。頼む
293デフォルトの名無しさん:2010/05/22(土) 18:42:26
>>292
指摘されたら怖いとか、意味がわからん。
問題の原因が知りたいんじゃないのか?
294デフォルトの名無しさん:2010/05/22(土) 18:52:58
指摘を恐れる者に成長は無い
295デフォルトの名無しさん:2010/05/22(土) 19:02:00
>>293>>294
こですが・・・・
#include<stdio.h>
int main(void)
}
int perioikoi, perioikoin, perioikoron;

perioikoi = 1;
perioikoron =1;
perioikoron = perioikoi + perioikoin;

printf("%d\n", perioikoron);

return 0;
}

実行したら4になります
296デフォルトの名無しさん:2010/05/22(土) 19:02:57
間違えた こうです
#include<stdio.h>
int main(void)
}
int perioikoi, perioikoin, perioikoron;

perioikoi = 1;
perioikoinn =1;
perioikoron = perioikoi + perioikoin;

printf("%d\n", perioikoron);

return 0;
}

実行したら4になります
何故でしょうか?
試しに誰か作ってください・・・・・・
297デフォルトの名無しさん:2010/05/22(土) 19:03:18
>>290
何が4ってなるんだよ。
298デフォルトの名無しさん:2010/05/22(土) 19:04:55
>>296
おまえそれ実行してないだろ。コンパイルすらとおらねぇよ。
299デフォルトの名無しさん:2010/05/22(土) 19:05:43
また間違えた
間違えた こうです
#include<stdio.h>
int main(void)
}
int perioikoi, perioikoin, perioikoron;

perioikoi = 1;
perioikoin =1;
perioikoron = perioikoi + perioikoin;

printf("%d\n", perioikoron);

return 0;
}

誰かまじで試しにつくって・・・
perioikoiじゃなくても
piru pirumon pirumonia
でもOK
300デフォルトの名無しさん:2010/05/22(土) 19:06:45
もっと区別のつきやすい変数を使ってくれ