■掲示板に戻る■
全部
1-
最新50
read.htmlに切り替える
■ C言語のお勉強ページに対するご意見・ご感想スレ
- 1 名前:へなちょこ管理人 ★:2007/08/05(日) 07:32:58
- 移転を機に立ててみました。
これ、もうちょっと○○したほうがスマートじゃない?
とか
こんな関数つかってんじゃねーよ
とか
普通に感想とかお寄せください。
- 24 名前:へなちょこ管理人 ★:2008/12/29(月) 02:52:32
- >>23
Oh...misstake.
修正しておきますた。
- 25 名前:超絶初心者:2009/01/06(火) 00:14:19
- 演習6-9についてなのですが、問題が配列v2の並びを逆順にしたものを配列v1に格納する関数
なのですがこれをコンパイルするとv1がv2に格納されるのですがこれでよろしいのですか?
初心者であまり問題の意味も理解しきれていないのですがスイマセン…
ちなみに私はこのようにやってみました、間違っていたらご指摘ください。
void intary_rcpy(int v1[], const int v2[], int no)
{
int i;
for (i = 0; i < no; i++)v1[i] = v2[(no - i) - 1];
}
int main (void)
{
int i;int a[NUMBER], b[NUMBER];
printf("%d×2個の数値を入力してください。\n", NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("a[%d] = ", i); scanf("%d", &a[i]); printf("b[%d] = ", i); scanf("%d", &b[i]);
}
puts("bの数値を逆転したものをaに代入します。");
intary_rcpy(a, b, NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("a[%d] = %d", i, a[i]);
printf("b[%d] = %d", i, b[i]);
putchar('\n');
}
- 26 名前:へなちょこ管理人 ★:2009/01/06(火) 06:04:25
- パッと見ですが、
for (i = 0; i < no; i++)v1[i] = v2[(no - i) - 1];
この行に違和感感じました。
詳しくは帰宅した後にでも〜。
- 27 名前:へなちょこ管理人 ★:2009/01/07(水) 00:38:06
- 問題を見ると
/*
要素数がnoであるint型の配列v2の並びを逆順にしたものを配列v1に格納する関数
void intary_rcpy(int v1[], const int v2[], int no) {}
を作成せよ。
*/
とあります。
まず、
printf("%d×2個の数値を入力してください。\n", NUMBER);
ここがおかしいです。
×2個はいらないです。
その下も以下略。
まず問題をわかりやすく砕いてみましょう。
要は、
12
34
56
78
90
となってる配列(v1)を
90
78
56
34
12
という配列(v2)にすればいいのです。
なので、
v1配列の最初の値をv2配列の最後に代入
↓
v1配列の最初+1の値をv2配列の最後-1に代入
↓
以下略
これでうまくいくはず?
なんか自分の回答みると無駄な処理してるような・・・。
とりあえずこんな感じです〜。
- 28 名前:へなちょこ管理人 ★:2009/01/07(水) 00:40:23
- 付け加えると、constをつけると弄れなくなるので、
必然的にintary_rcpyに与える引数は
逆順にした値を格納する配列,入力した配列,要素数(配列の数)ですね。
眠い頭で書いてるので変なこと書いてたら吸いません。
- 29 名前:へなちょこ管理人 ★:2009/01/07(水) 00:47:04
- 久々にCのコード覗いて思ったけど未だにオレ、配列とポインタの区別できてないんだよなぁ。
なんとなく違いはわかるんだけど明文化しろって言われたらできない。
- 30 名前:超絶初心者:2009/01/07(水) 05:15:06
- 実引数bをv1に、aをv2にとしているのを、aをv1に、bをv2にと勘違いしていました。スイマセン
intary_rcpyなのですが最初の
for ( i = 0; i < no; i++ ) v1[i] = v2[i]; temp = v1[i]; v1[i] = v1[(no - 1) - i]; v1[(no - 1) - i] = temp;
for (i = 0; i < no; i++) v1[i] = v2[(no - 1) - i];に書き換えることが可能だとおもいます。
お忙しい所質問にご回答いただきありがとうございます。今後とも利用させていただきます。
- 31 名前:へなちょこ管理人 ★:2009/01/23(金) 21:02:36
- 某人生ゲームみたいなボードゲーム。サイコロを振って出た目の分進んでゴールを目指す。途中止まったマスによって様々なイベントが起こり、そのたびに所持金やプレイヤーのステータスが変化する。例えば、所持金が変化するイベントやステータスが上下するイベントがある。移動制限は作らない。
ステータスや所持金で選べる職業が変化する。ゴールしたときプレイヤーの所持金とステータスをランキングに残す。所持金のランキングとステータスのランキングと総合スコアのランキングをそれぞれ上位の10人ずつ残す。総合スコアは所持金とステータスの値を計算式にあてはめて算出する。最初にいくつか質問をして、ステータスの初期値をきめる。マスの進む数は1?6までの数をだすサイコロで決める。マス目は100マスぐらいを予定。少ないターン数でゴール出来たら所持金やステータスにボーナスがある。
- 32 名前:へなちょこ管理人 ★:2009/01/23(金) 21:08:54
- サイコロの目を決める
int saikoro = 1;
saikoro = rand() % 6 + 1;
- 33 名前:へなちょこ管理人 ★:2009/01/23(金) 21:22:29
- 【びん取りゲーム】
ルール:交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。
びんの本数: 20
先攻後攻を決めます...先攻 [1] / 後攻 [2] : 1
===========================あなたの先攻でスタート============================
何本取りますか?...3
プレイヤー>3 本取ったぞ!
□□□■■■■■■■■■■■■■■■■■ あと 17 本!
コンピュータ>1 本取ったぞ!
□□□□■■■■■■■■■■■■■■■■ あと 16 本!
何本取りますか?...2
プレイヤー>2 本取ったぞ!
□□□□□□■■■■■■■■■■■■■■ あと 14 本!
コンピュータ>2 本取ったぞ!
□□□□□□□□■■■■■■■■■■■■ あと 12 本!
何本取りますか?...2
プレイヤー>2 本取ったぞ!
□□□□□□□□□□■■■■■■■■■■ あと 10 本!
コンピュータ>1 本取ったぞ!
□□□□□□□□□□□■■■■■■■■■ あと 9 本!
何本取りますか?...3
プレイヤー>3 本取ったぞ!
□□□□□□□□□□□□□□■■■■■■ あと 6 本!
コンピュータ>1 本取ったぞ!
□□□□□□□□□□□□□□□■■■■■ あと 5 本!
何本取りますか?...1
プレイヤー>1 本取ったぞ!
□□□□□□□□□□□□□□□□■■■■ あと 4 本!
コンピュータ>3 本取ったぞ!
□□□□□□□□□□□□□□□□□□□■ あと 1 本!
=================================ゲーム終了==================================
あなたの負け!また挑戦してね!
nterキーを押すと終了...
- 34 名前:へなちょこ管理人 ★:2009/01/23(金) 21:23:57
- #include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
//びん取りゲーム
main () {
int bin_max;//びんの総本数
int bin;//残りびんの本数
int max = 3;//一度に取れるびんの最大数
int p_turn = 0;//プレイヤーターンフラグ
int p_get, m_get;//プレイヤー、コンピュータそれぞれの取ったびんの数
int i;
srand(time(NULL));
//びんの総本数を決める
bin_max = rand()%5 + 20;
bin = bin_max;
printf("【びん取りゲーム】\n");
printf("ルール:交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。\n");
printf("びんの本数: %d\n", bin_max);
//先攻後攻を決める
printf("先攻後攻を決めます...先攻 [1] / 後攻 [2] : ");
scanf("%d", &p_turn);
while(getchar() != '\n') { }
if(p_turn == 1 || p_turn == 2) {
printf("============================あなたの");
if(p_turn == 1) { printf("先攻"); }
else if(p_turn == 2) {
printf("後攻");
p_turn = 0;
}
printf("でスタート============================\n\n");
} else {
printf("不正な値を受け取りました...強制的にプレイヤーは後攻です。\n\n");
p_turn = 0;
}
//びんを交互に取る
for(; bin > 1; p_turn = !p_turn) {
if(p_turn) {//プレイヤーのターン
do {
p_get = 0;
printf("何本取りますか?...");
scanf("%d", &p_get);
while(getchar() != '\n') { }
} while((p_get < 1) || (p_get > max));
printf("プレイヤー>%d 本取ったぞ!\n", p_get);
bin -= p_get;
if(bin <= 0) { printf("プレイヤー>0になっちゃったよ・・・\n"); }
} else {//コンピュータのターン
if(bin <= max + 1) {
m_get = bin - 1;
Sleep(500);
}
else {
m_get = rand()%max+1;
Sleep(rand()%500 + 1000);
}
printf("コンピュータ>%d 本取ったぞ!\n", m_get);
bin -= m_get;
}
//残り本数の表示
if(bin >= 1) {
for(i = 0; i < bin_max; i++) {
if(i < bin_max - bin) { printf("□");
} else { printf("■"); }
}
printf(" あと %d 本!\n", bin);
}
}
printf("\n==================================ゲーム終了==================================\n");
//勝敗判定
if(!p_turn && (bin <= 0)) { p_turn = !p_turn; }
if(p_turn) {
printf("あなたの負け!また挑戦してね!\n"); }
else { printf("あなたの勝ち!\n"); }
/***********************************以下追加文********************************/
printf("Enterキーを押すと終了...");
rewind(stdin);
getchar();
/***********************************追加文終了********************************/
return 0;
}
- 35 名前:名無しさんが転んだ!:2009/01/26(月) 09:45:38
- 演習7-4の解答ページが見れなくなっています。
- 36 名前:へなちょこ管理人 ★:2009/01/26(月) 20:00:22
- >>35
ローカル見てみたらどうやら解いてないみたいです。。。
ちょっと解いてみますね。
- 37 名前:へなちょこ管理人 ★:2009/01/26(月) 23:19:05
- 現在Cのコンパイル環境がないので昔のPCでちまちまやるの面倒だった・・・。
おおざっぱですが、やってみました。挙動がおかしかったらご指摘下さい。
- 38 名前:へなちょこ管理人 ★:2009/01/26(月) 23:20:16
- /*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
unsigned set_n( unsigned x, int pos, int n) { /*…*/ }
unsigned reset_n( unsigned x, int pos, int n) { /*…*/ }
unsigned inverse_n( unsigned x, int pos, int n) { /*…*/ }
を作成せよ。
*/
#include <stdio.h>
/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
int count = 0;
while(x){
if ( x & 1U ) count++;
x >>= 1;
}
return count;
}
/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
return count_bits(~0U);
}
/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
int i;
for ( i = int_bits() - 1; i >= 0; i-- )
putchar((( x >> i ) & 1U ) ? '1' : '0');
putchar('\n');
}
/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j;
for ( j = pos -1; j < pos; j++ )
{
i <<= 1
i += 1;
}
return i | x;
}
/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j;
for ( j = pos -1; j < pos; j++ )
{
i <<= 1
i += 1;
}
i = ~i;
return i & x;
}
/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j;
for ( j = pos -1; j < pos; j++ )
{
i <<= 1
i += 1;
}
return i ^ x;
}
int main(void)
{
unsigned no;
int bit;
printf("整数を入力してください:"); scanf("%lu", &no);
puts("ビットの中身");
print_bits(no);
printf("何ビット目を処理しますか:"); scanf("%d", &bit);
printf("ON_n:\t");
print_bits(set_n(no, bit));
printf("OFF_n:\t");
print_bits(reset_n(no, bit));
printf("INVERSE_n:");
print_bits(inverse_n(no, bit));
return 0;
}
- 39 名前:へなちょこ管理人 ★:2009/01/26(月) 23:23:44
- fooooooooooooooooooooooooo
forの中のj = pos - 1ってのは全部j = 0におきかえてくだしあ。
間違えたまま保存してたw
- 40 名前:@携帯:2009/01/27(火) 13:03:01
- あー
ちゃんと引数あたえてなかったりでめちゃめちゃや。
帰宅してから直します。
- 41 名前:へなちょこ管理人 ★:2009/01/27(火) 20:12:43
- >符号無し整数xのposビット目からn個のビットを
右にn個なのか左にn個なのか・・・。
humm...
- 42 名前:へなちょこ管理人 ★:2009/01/27(火) 20:40:51
- /*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
unsigned set_n( unsigned x, int pos, int n)
unsigned reset_n( unsigned x, int pos, int n)
unsigned inverse_n( unsigned x, int pos, int n)
を作成せよ。
*/
#include <stdio.h>
/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
int count = 0;
while(x) {
if ( x & 1U ) count++;
x >>= 1;
}
return count;
}
/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
return count_bits(~0U);
}
/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
int i;
for ( i = int_bits() - 1; i >= 0; i-- )
putchar((( x >> i ) & 1U ) ? '1' : '0');
putchar('\n');
}
/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j;
for ( j = 0; j < n - 1; j++ ) {
i <<= 1;
i += 1;
}
i <<= pos - n;
return i | x;
}
/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j;
for ( j = 0; j < n - 1; j++ ) {
i <<= 1;
i += 1;
}
i <<= pos - n;
i = ~i;
return i & x;
}
/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
unsigned i = 1U;
int j;
for ( j = 0; j < n - 1; j++ ) {
i <<= 1;
i += 1;
}
i <<= pos - n;
return i ^ x;
}
int main(void)
{
unsigned no;
int bit,n;
printf("整数を入力してください:"); scanf("%lu", &no);
puts("ビットの中身");
print_bits(no);
printf("何ビット目を処理しますか:"); scanf("%d", &bit);
printf("何個処理しますか:"); scanf("%d", &n);
printf("ON_n:\t\t");
print_bits(set_n(no, bit, n));
printf("OFF_n:\t\t");
print_bits(reset_n(no, bit, n));
printf("INVERSE_n:\t");
print_bits(inverse_n(no, bit, n));
return 0;
}
- 43 名前:へなちょこ管理人 ★:2009/01/27(火) 20:43:39
- 上記の回答は右にn個処理するものです。
左にn個処理する場合は各関数の i <<= pos - n;を
i <<= pos - 1;にしたらいいと思います。
- 44 名前:へなちょこ管理人 ★:2009/01/27(火) 20:49:27
- んで、もし、posがunsignedを超えたり、nがposを超える入力があった場合のために、
pos → pos % int_bits()
n → n % pos
にしとくと安全かもしれません。
- 45 名前:へなちょこ管理人 ★:2009/01/27(火) 21:01:53
- http://newcomer.nuts-choco.com/clang/src/7/7-4.c.txt
んで、ファイル置いておきました。
- 46 名前:uuuss:2009/05/17(日) 17:28:39
- http://newcomer.s368.xrea.com/clang/
掲示板へのリンクが切れてるw
- 47 名前:へなちょこ管理人 ★:2009/05/18(月) 02:54:08
- >>46
っうぇっうぇw
一部相対リンクじゃなくて絶対リンクになってるから直すのめんどくせぇww
- 48 名前:へなちょこ管理人 ★:2009/05/18(月) 02:57:28
- nuts-chocoの方も復活してるけどいずれまた落ちるだろうからシカトw
看板だけ取り戻せてよかた〜。
みっちゃんに作ってもらった大切な看板だからなぁ。
- 49 名前:へなちょこ管理人 ★:2009/07/03(金) 21:10:19
- /*
文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、
その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str, int c) {}
を作成せよ。
*/
#include <stdio.h>
char *str_chr(const char *str, int c)
{
while(*str){
if(*str == c)
return (char*)str;
str++;
}
return NULL;
}
int main(void)
{
char str[128];
int c;
char *p;
printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n' );
printf("検索する文字を入力してください:");
scanf("%c", &c);
if( (p = str_chr(str, c)) == NULL )
printf("指定された文字は見つかりませんでした。\n");
else
printf("%cは%d文字目にありました。\n", c, p - &str[0] + 1);
return 0;
}
- 50 名前:へなちょこ管理人 ★:2009/07/03(金) 21:12:06
- char *str_chr(const char *str, int c)
{
char * res;
while(*str){
if(*str == (char)c){
res = str;
return res;
str++;
}
return NULL;
}
こうかな
29KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.htmlに切り替える