プログラムをお勉強するスレ

1 名前:自称プロ名無ぴ [2009/08/29(土) 17:58:39]
講師: メ

環境: http://codepad.org/
2 名前: [2009/08/29(土) 18:31:15]
勉強したいなら自分で努力しろボケが
3 名前:自称プロ名無ぴ [2009/08/29(土) 18:33:54]
C言語演習1
unsigned int の値を10進数の文字列に変換する関数を作成しなさい。
4 名前: [2009/08/29(土) 18:37:24]
itoa使え
5 名前:自称プロ名無ぴ [2009/08/29(土) 19:13:35]
>>3
#include <stdio.h>

char* ul2dec(char* buf, unsigned int val)
{
unsigned int keta = 1000000000;
unsigned int temp;
int i;
int j = 0;
int flag = 0;
for (i = 0; i < 10; ++i) {
temp = val / keta;
val -= (temp * keta);
keta /= 10;
if (temp) {
flag = 1;
}
if (flag) {
buf[j] = temp + '0';
//printf("[%c]", buf[j]);
++j;
}
}
buf[i] = '\0';
return buf;
}

int main(void)
{
char buf[32];
unsigned int val;

val = (unsigned int )-1;
printf("[%u]\n", val);
printf("[%s]\n\n", ul2dec(buf, val));

val = 1234567890;
printf("[%u]\n", val);
printf("[%s]\n\n", ul2dec(buf, val));

val = 9;
printf("[%u]\n", val);
printf("[%s]\n\n", ul2dec(buf, val));

val = 0;
printf("[%u]\n", val);
printf("[%s]\n\n", ul2dec(buf, val));

return 0;
}

6 名前:自称プロ名無ぴ [2009/08/29(土) 19:15:59]
>>3
#include <stdio.h>

char* ul2dec(char* buf, unsigned int val)
{
  unsigned int keta = 1000000000;
  unsigned int temp;
  int i;
  int j = 0;
  int flag = 0;
  for (i = 0; i < 10; ++i) {
    temp = val / keta;
    val -= (temp * keta);
    keta /= 10;
    if (temp) {
      flag = 1;
    }
    if (flag) {
      buf[j] = temp + '0';
      //printf("[%c]", buf[j]);
      ++j;
    }
  }
  buf[i] = '\0';
  return buf;
}

int main(void)
{
  char buf[32];
  unsigned int val;

  val = (unsigned int )-1;
  printf("[%u]\n", val);
  printf("[%s]\n\n", ul2dec(buf, val));

  val = 1234567890;
  printf("[%u]\n", val);
  printf("[%s]\n\n", ul2dec(buf, val));

  val = 9;
  printf("[%u]\n", val);
  printf("[%s]\n\n", ul2dec(buf, val));

  val = 0;
  printf("[%u]\n", val);
  printf("[%s]\n\n", ul2dec(buf, val));

  return 0;
}
7 名前: [2009/08/29(土) 19:16:56]
新人がこんな関数作ったらレビューで1時間は説教する
8 名前:自称プロ名無ぴ [2009/08/29(土) 19:22:33]
CADって知ってる?
なんか使えるようになって欲しいみたいなんだけど
9 名前:自称プロ名無ぴ [2009/08/29(土) 19:23:16]
メキシコならどんな関数つくるん?
ライブラリつかうのはなしで
10 名前:自称プロ名無ぴ [2009/08/29(土) 19:25:42]
>>8
OrCadならしってる
11 名前: [2009/08/29(土) 19:47:54]
>>9
引数ポインタを戻り値にしない
ketaとかtempとか変な変数名は使わない
unsigned intが10進数で10桁に収まるからこう書いているとコメントに記述する
意味がないflagは使わない
iとjを使い間違えてバグっていない

という関数を書く
12 名前: [2009/08/29(土) 19:49:16]
あと関数名とか引数の順番もよく考えた関数を書く
13 名前: [2009/08/29(土) 19:56:28]
あとバッファオーバーフロー防ぐためにバッファのサイズを引数に追加する
14 名前:自称プロ名無ぴ [2009/08/29(土) 20:03:57]
>>6
% とか/ を使わずにかけたら神なのにな
15 名前:自称プロ名無ぴ [2009/08/29(土) 20:25:03]
それはさすがに無理だろ
シンプルじゃなくなる
16 名前:自称プロ名無ぴ [2009/08/29(土) 20:25:49]
>>11
>iとjを使い間違えてバグっていない
さすがメキシコ様
17 名前:自称プロ名無ぴ [2009/08/29(土) 23:55:34]
>意味がないflagは使わない
意味あるやんけ
18 名前:自称プロ名無ぴ [2009/08/30(日) 02:59:16]
Cとかよくわかんないんだけど
flagの値1以外になるのこれ
あと
if (temp) {
 buf[j] = temp + '0';
 //printf("[%c]", buf[j]);
 ++j;
}
じゃだめなの
19 名前:自称プロ名無ぴ [2009/08/30(日) 07:44:37]
 http://codepad.org/
で実行してみるとわかるけど駄目
20 名前:自称プロ名無ぴ [2009/08/30(日) 08:51:46]
if (temp) {
 flag = 1;
}
if (flag) {
buf[j] = temp + '0';
 :

がよくて

if (temp) {
buf[j] = temp + '0';
 :

がだめとかC難解過ぎる・・・
21 名前:自称プロ名無ぴ [2009/08/30(日) 09:04:02]
>>20はゆとりだな
22 名前:自称プロ名無ぴ [2009/08/30(日) 09:06:04]
え、なんで?
23 名前:自称プロ名無ぴ [2009/08/30(日) 14:24:30]
1000と言う値がどのように表示されるか考えてみようよ
24 名前:ハトダンナ ◆CHADANur5o [2009/08/31(月) 15:37:50]
仕事の合間に。

#include <stdio.h>
#define BUFFER_SIZE 32

char *ultos_recur(char *buf, unsigned int num, char *bufend)
{
 if (num >= 10) {
  buf = ultos_recur(buf, num / 10, bufend);
 }
 if (buf != bufend) {
  *buf++ = num % 10 + '0';
 }
 return buf;
}

void ultos(char *buf, unsigned int num, int buffer_size)
{
 *ultos_recur(buf, num, buf + buffer_size - 1) = '\0';
}

int main()
{
 char buf[BUFFER_SIZE];
 unsigned int val;
 
 val = (unsigned int)-1;
 ultos(buf, val, BUFFER_SIZE);
 printf("[%u] -> [%s]\n\n", val, buf);
 
 val = 1234567890;
 ultos(buf, val, BUFFER_SIZE);
 printf("[%u] -> [%s]\n\n", val, buf);
 
 val = 9;
 ultos(buf, val, BUFFER_SIZE);
 printf("[%u] -> [%s]\n\n", val, buf);
 
 val = 0;
 ultos(buf, val, BUFFER_SIZE);
 printf("[%u] -> [%s]\n\n", val, buf);
 
 val = (unsigned int)-1;
 ultos(buf, val, 4);
 printf("[%u] -> [%s]\n\n", val, buf);
 
 return 0;
}
25 名前: [2009/08/31(月) 15:43:03]
おおスゲー
26 名前:自称プロ名無ぴ [2009/08/31(月) 16:12:28]
メキシコがスゲーって言ってるからすげえんだろうな
27 名前:人狼教諭 ◆doomsroUk. [2009/08/31(月) 16:38:43]
こう言うの見るといっつも「なんでいちいち{で改行するの」って思う。
28 名前:人狼教諭 ◆doomsroUk. [2009/08/31(月) 16:39:59]
{ *ultos_recur(buf, num, buf + buffer_size - 1) = '\0';}

じゃ何でダメなん?
いや全然意味分かってないけど。
29 名前:自称プロ名無ぴ [2009/08/31(月) 16:45:30]
さすがチャダはNHKで講師してるだけあるな
30 名前:自称プロ名無ぴ [2009/08/31(月) 16:46:35]
#include <stdio.h>
#define BUFFER_SIZE 32
char *ultos_recur(char *buf, unsigned int num, char *bufend)
{if (num >= 10) {buf = ultos_recur(buf, num / 10, bufend);}
if (buf != bufend) {*buf++ = num % 10 + '0';}
return buf;}
void ultos(char *buf, unsigned int num, int buffer_size)
{*ultos_recur(buf, num, buf + buffer_size - 1) = '\0';}
int main()
{char buf[BUFFER_SIZE];unsigned int val;
val = (unsigned int)-1;ultos(buf, val, BUFFER_SIZE);printf("[%u] -> [%s]\n\n", val, buf);
val = 1234567890;ultos(buf, val, BUFFER_SIZE);printf("[%u] -> [%s]\n\n", val, buf);
val = 9;ultos(buf, val, BUFFER_SIZE);printf("[%u] -> [%s]\n\n", val, buf);
val = 0;ultos(buf, val, BUFFER_SIZE);printf("[%u] -> [%s]\n\n", val, buf);
val = (unsigned int)-1;ultos(buf, val, 4);printf("[%u] -> [%s]\n\n", val, buf);
return 0;}
31 名前: [2009/08/31(月) 16:55:01]
;}で改行したら;で終わる行と;}で終わる行が混在して見づらいやんけ
32 名前:自称プロ名無ぴ [2009/08/31(月) 16:55:44]
問題ないけど見にくいから
33 名前:人狼教諭 ◆doomsroUk. [2009/08/31(月) 17:03:22]
あー、;で終わる行と終わらない行は凄く意味が違うのね、、、
;は「この処理は次の行まで続いてますよ〜」って意味なのかな、、、
◆続きを読む 次100 最新50 全表示 お絵描く 削除依頼 掲示板に戻る (*・∀・)<16KB
名前: コマンド:
FILE: FILE削除PW

TrackBackURL :: http://chadan.org/test/tback.cgi/talk/1251536319/
RSS/ATOM Data :: Board: RSS1.0 RSS2.0 ATOM Thread: RSS1.0 RSS2.0 ATOM
Level3-BBS System (alpha9) / by 3Lab::CGI