トップページ⇒tech
1001コメント293KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2007/06/13(水) 20:48:18
前スレ

C言語なら俺に聞け(入門篇) Part 13
http://pc11.2ch.net/test/read.cgi/tech/1179301993/
0153デフォルトの名無しさん2007/06/17(日) 06:58:42
>>152
> fscanf(file,"%d",&i);
これで test100 を %d の書式指定でint型のiに代入しても
適切に代入されへんよ。一度文字列として受け付けてから
atoiでiに代入してみては?
0154デフォルトの名無しさん2007/06/17(日) 07:20:43
>>152
そんなページで勉強しちゃダメだってば。

>馴染みのscanf関数に似たfscanf関数があります。
こんなこと書いている時点でお察し。
0155デフォルトの名無しさん2007/06/17(日) 09:12:34
ゲーム作ってみたんだけど、どうでしょうか?

#include <stdio.h>
#include <conio.h>
#include <string.h>
#define INPUT_MAX 15
#define STR_MAX 127
int main(void)
{
char m_number[] = "concatenation"; /* マジックナンバー */
char str[STR_MAX] = {0};
char c;
int i,j,b;
/* 文字列の数だけハイフンを表示 */
b = strlen(m_number);
for(i = 0; i < b; i++) str[i] = '-';
printf(" 入力できる回数:%d\n %s\n",INPUT_MAX,str);
/* 入力した文字列とマジックナンバーを比較 */
for(i = 0; i < INPUT_MAX; i++){
c = getche();
for(j = 0; j < b; j++){
if(m_number[j] == c)
str[j] = c;
}
printf(" %s %2d\n",str,i+1);
if(!strcmp(m_number,str)) break;
}
if(i == INPUT_MAX) printf(" 〜GAME OVER〜 (..、)ヾ(^^ )ヨシヨシ\n");
else printf(" YOU WIN!! (*^-゚)vィェィ♪\n");
return 0;
}
0156デフォルトの名無しさん2007/06/17(日) 09:16:48
どうと言われても

いいんじゃないでしょうか
0157デフォルトの名無しさん2007/06/17(日) 09:23:45
次はスーパーマリオにでもチャレンジしてみてはいかかでしょうか?
0158デフォルトの名無しさん2007/06/17(日) 09:26:26
奥行きのあるペーパーまり尾でも
0159デフォルトの名無しさん2007/06/17(日) 09:27:08
struct POINT2D{
double x;
double y;
};
/*----------------------------------------------------------
(二次元)ベクトルの大きさを求める
----------------------------------------------------------*/
double ScalarVector2D( POINT2D vec ){
return sqrt( vec.x * vec.x + vec.y * vec.y );
}

/*----------------------------------------------------------
(二次元)任意のベクトルを単位ベクトル化
----------------------------------------------------------*/
void Normalize2D( POINT2D *vec ){
double scalar;

/* ベクトルのスカラーを求める */
scalar = ScalarVector2D( *vec );

/* ベクトルに大きさがない */
if( scalar == 0.0 )
return;

/* 各成分をスカラーで割る */
vec->x /= scalar;
vec->y /= scalar;
}
これで単位ベクトル求めようとして 下みたいにしたらエラーが出るんですが… ボスケテ
POINT2D *pointA;
cout << "input x1 > "; cin >> pointA->x; cout << "input y1 > "; cin >> pointA->y;
cout << Normalize2D(pointA) << endl;
0160デフォルトの名無しさん2007/06/17(日) 09:29:08
>>155
スクエ二に就職できんじゃね?
0161デフォルトの名無しさん2007/06/17(日) 09:31:35
このスレから天才プログラマーが生まれるとは夢にも思っていなかったな
0162デフォルトの名無しさん2007/06/17(日) 09:33:49
159に答えていただけませんか…
こんなんじゃマイメロみたいにスッキリできない
0163デフォルトの名無しさん2007/06/17(日) 09:36:55
>>159
> cout << Normalize2D(pointA) << endl;
なんでこんなことができると思ってんだ。心で濃いよ
0164デフォルトの名無しさん2007/06/17(日) 09:40:03
なんで出来ないのかがわからんのです
0165デフォルトの名無しさん2007/06/17(日) 09:41:03
153さん154さんありがとうございます!!そしてすいませんまた質問します。
読み込むファイルの中の文章の母音(a,b,c,d,e)を「−」に変えるプログラム
(例えばテキストファイルの中身が「abcde」なら「-bcd-」になるテキストをつくる)
をつくったんですけど最後に「-bcd-$жL!жD」みたいにバグ文字が入力
されてしまいます。バグを表示しないようにするアドバイスもしよければお願いします。
#include<stdio.h>
int main(void){
FILE *fin,*fout;
char stn[FILENAME_MAX],str[80],c;
int i=0;
printf("filename: \n");
scanf("%s",stn);
fout=fopen("bou.txt","w");
if((fin=fopen(stn,"r"))==NULL)return (-1);
while((c=getc(fin))!=EOF){
if(c=='a'||c=='o'||c=='e'||c=='i'||c=='u')
str[i]='-';
else
str[i]=c;
i++;}
fprintf(fout,"%s",str);
fclose(fin);
fclose(fout);
return 0;}
0166デフォルトの名無しさん2007/06/17(日) 10:01:34
勝手に作り変えてやんよ

#include<stdio.h>
int main(void){
FILE *fin,*fout;
char stn[FILENAME_MAX],c;
printf("filename: ");
scanf("%s",stn);
if((fin=fopen(stn,"r"))==NULL)return (-1);
fout=fopen("bou.txt","w");
while((c=getc(fin))!=EOF) {
if(c=='a'||c=='o'||c=='e'||c=='i'||c=='u')
fputc('-',fout);
else
fputc(c,fout);
}
fclose(fin);
fclose(fout);
return 0;}
01671652007/06/17(日) 11:08:19
>>166
ありがとうございます。166さんのはなぜかバグ文字が出ないですね、すごいw
なんで165のだとバグ文字がでるんだろう…。
もしよければ165でバグ文字でる原因のほうも教えてくれるとうれしいです。

あと165の2行目「母音(a,i,u,e,o)」でした…オレバカだorz
0168デフォルトの名無しさん2007/06/17(日) 11:12:45
>>167
> fprintf(fout,"%s",str);
strの一番最後に文字列の終端を示す \0 を入れていないと
文字列の最後がおかしくなるよ。 str[i]='\0' (iはそれまで入れてきた文字列の最後の位置)
を入れてみては?
01691652007/06/17(日) 11:23:51
あぁーそうだった!オレ、リアルにアホだ…。
作ってると細かい知識が飛び飛びになってしまうなぁ…。気をつけないと。

>>166さん>>168さん、本当にありがとうございます!
0170デフォルトの名無しさん2007/06/17(日) 11:37:07
if(strchr("aiueo", c))
0171ひろみつ2007/06/17(日) 12:33:42
すみません。今から、C言語を勉強するメリットはありますか?
0172デフォルトの名無しさん2007/06/17(日) 12:37:28
組み込みや講義・宿題、高速に処理するライブラリの作成等で学ぶ必要に迫られていないなら
今から学ぶメリットはかなり小さいといわざるを得ない。
0173ひろみつ2007/06/17(日) 12:39:07
>>172 どうもありがとうございます。
高速に処理するライブラリはつくるかもしれないので、
一応やっときます。
0174デフォルトの名無しさん2007/06/17(日) 14:03:48
最近どこ行ってもJavaやらPHPやらで、俺寂しいんだぜ。
0175デフォルトの名無しさん2007/06/17(日) 17:11:36
c言語ができる無料ソフトでおすすめはどれですか?
0176デフォルトの名無しさん2007/06/17(日) 17:12:47
VCExp2005
0177デフォルトの名無しさん2007/06/17(日) 17:15:47
初心者ならTeraPadとBCC
0178デフォルトの名無しさん2007/06/17(日) 17:21:08
個人的には、初心者にはVC2005EEだと思うんだが。
なんていうか、設定が簡単。

C99非対応とか、規格からみて怪しいとかあるので、
基本以上のことするにはあまりオススメ出来ない
0179デフォルトの名無しさん2007/06/17(日) 18:05:39
今LSI86をインスコしたのですが>>176-178さんがお勧めのほうを使ったほうがいいですかね?
0180デフォルトの名無しさん2007/06/17(日) 18:08:44
両方入れとけ
0181デフォルトの名無しさん2007/06/17(日) 18:09:34
今時LSICだけはないだろw
0182デフォルトの名無しさん2007/06/17(日) 18:11:05
LSI入れるならBCCに汁
0183デフォルトの名無しさん2007/06/17(日) 18:14:25
Z80CPU
0184デフォルトの名無しさん2007/06/17(日) 18:15:58
今時 LSI-C とか異常
0185デフォルトの名無しさん2007/06/17(日) 18:18:34
いまさらLSI-Cとか、ちょっとなぁ・・・
0186デフォルトの名無しさん2007/06/17(日) 18:30:44
LSI-Cは16bitコンパイラだから、作成したバイナリが(コンパイラ自体もか?)
Windows Vista で動かなかったりするんじゃないかな。
ビスタ持ってないから分からんが。
0187デフォルトの名無しさん2007/06/17(日) 18:31:53
いや、かなり素直なDOSアプリだからたぶん動くだろうけど
そういう問題じゃないんだよw
0188デフォルトの名無しさん2007/06/17(日) 18:37:33
>>175
http://72.14.235.104/search?q=cache:paSHmCoCDSwJ:www.borland.com/jp/products/cbuilder/freecompiler.html+Borland+C%2B%2B&hl=ja&ct=clnk&cd=2&gl=jp&lr=lang_ja&client=firefox
> Borland C++Compiler 5.5のダウンロードは、こちら(8.46MB)をクリックして下さい。
CPad for Borland C++Compiler
ttp://www.vector.co.jp/soft/dl/win95/prog/se141451.html
0189デフォルトの名無しさん2007/06/17(日) 18:39:00
>>187
どういう問題?
intが16bitだとか?
0190デフォルトの名無しさん2007/06/17(日) 18:45:22
こっちの方がいいのでは?
http://www.codegear.com/jp/downloads/free/cppbuilder
0191デフォルトの名無しさん2007/06/17(日) 18:46:10
別のコンパイラをさて使おうかと思った時に
変化が大きすぎるよな。
0192デフォルトの名無しさん2007/06/17(日) 18:47:33
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
0193デフォルトの名無しさん2007/06/17(日) 18:49:21
192 名前:デフォルトの名無しさん 投稿日:2007/06/17(日) 18:47:33
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
今なら初心者向けと言うと VC++ 2005 Express Edition 以外考えられないな。
0194デフォルトの名無しさん2007/06/17(日) 18:51:32
bcc を使うと >>193 みたいな人になるのか。
0195デフォルトの名無しさん2007/06/17(日) 18:58:02
貧乏人だと VC++ 2005 Express Edition を初心者でも使うのかw
0196デフォルトの名無しさん2007/06/17(日) 18:59:53
まぁ、初心者ならなおさら Express Edition なんてお勧めできないね。知識がある人向け。
学生なら MS Visual Studio 2005 Academic Edition でも買っておきな。
ttp://www.7dream.com/product/n/a01b00/p/0446437
0197デフォルトの名無しさん2007/06/17(日) 19:18:35
何が違うんだ?
0198デフォルトの名無しさん2007/06/17(日) 19:25:35
学習用としては十分だろ。
デフォルトでC++のプロジェクトになってしまうから、空のプロジェクトを作ってmain.cを追加する。
そのまま実行すると一瞬で消えてしまうから、Ctrl+F5で実行する。
これだけ知ってればとりあえず無問題。

ただstdbool, stdintあたりがないのは確かに辛い。
が、C99前提にしてるなら他をあたるべきだな。
0199デフォルトの名無しさん2007/06/17(日) 19:33:23
折角 C99 覚えても、
VC で使えないからあまり意味がない。
0200デフォルトの名無しさん2007/06/17(日) 19:50:14
んー・・・ていうか、C99流行ってないから覚えなくて良いと思う・・・
0201デフォルトの名無しさん2007/06/17(日) 19:54:00
うんじゃVC2005EEで決まりだな。
0202デフォルトの名無しさん2007/06/17(日) 20:04:27
>>200
__FUNCTION__って使えたら便利だなぁとか時々思うんだけどなぁ
0203デフォルトの名無しさん2007/06/17(日) 20:06:16
>>201
0204デフォルトの名無しさん2007/06/17(日) 20:08:54
Expressじゃなくてもいいけど簡単にデバッガ使える環境の方が理解がはるかに早いと思うよ。
0205ひろみつ2007/06/17(日) 20:11:56
CygwinについてるCコンパイラまじおすすめ
0206デフォルトの名無しさん2007/06/17(日) 20:14:16
>>205
なにが?
とマジレス
0207デフォルトの名無しさん2007/06/17(日) 20:23:21
(205が)かわいそうだからgccだと脳内補完してあげようよ
0208デフォルトの名無しさん2007/06/17(日) 20:27:38
>>202
C99 は __func__ だし。
0209デフォルトの名無しさん2007/06/17(日) 20:30:09
>>198
拡張子cでも、IDEで作ったプロジェクトではデフォルトで/TP指定されていないか?
0210デフォルトの名無しさん2007/06/17(日) 20:33:51
うん、gccは確かにお勧め。c以外もコンパイルできるからね。
0211デフォルトの名無しさん2007/06/17(日) 20:46:59
初心者はボーランド5.5つかっとけ
BCC developerだ
0212デフォルトの名無しさん2007/06/17(日) 20:48:03
なぜならお手軽だからだ
0213デフォルトの名無しさん2007/06/17(日) 21:03:53
後で C++ もやろうと思っても
BCC は仕様古いからなあ。
0214デフォルトの名無しさん2007/06/17(日) 21:04:53
>>29
BCC ってこんな事が起こるコンパイラだろ?
0215デフォルトの名無しさん2007/06/17(日) 21:07:30
>>214
はい
>>42
こういうことになるコンパイラです
0216デフォルトの名無しさん2007/06/17(日) 21:09:16
そこでcl.exeの出番です
0217デフォルトの名無しさん2007/06/17(日) 21:13:30
C++ Builder 2007では直っているのかな?>>42
0218デフォルトの名無しさん2007/06/17(日) 21:15:23
仕様がどうなってるかをすっ飛ばして直ってるとか挙動がおかしいとか
0219デフォルトの名無しさん2007/06/17(日) 21:20:23
>>218
?
0220デフォルトの名無しさん2007/06/17(日) 21:23:15
>>218
仕様って
「実行されないコード」と警告吐きながら実際は実行されていることを「仕様です」で片付けるのか?
0221デフォルトの名無しさん2007/06/17(日) 21:27:12
警告文のほうをなおすかもな
0222デフォルトの名無しさん2007/06/17(日) 21:30:05
これで直ってなかったらある意味面白い
だれかBCB6以上持ってない?
0223デフォルトの名無しさん2007/06/17(日) 21:31:31
こんな警告が出たんだけどなんで?
./main.c:7: 警告: incompatible implicit declaration of built-in function ‘strcpy’
0224デフォルトの名無しさん2007/06/17(日) 21:37:57
>>223
コンパイラ分からんけど、ちゃんとstring.hをincludeしてるか?
0225デフォルトの名無しさん2007/06/17(日) 21:38:14
つ#include <string.h>
0226デフォルトの名無しさん2007/06/17(日) 21:39:24
>>224-225
さんくすこ
理由もお願い
0227デフォルトの名無しさん2007/06/17(日) 21:40:08
strcpyがstring.hで宣言されてるから
0228デフォルトの名無しさん2007/06/17(日) 21:41:23
ビルトイン関数 'strcpy' と矛盾する宣言かもしんない
的な警告なの?
0229デフォルトの名無しさん2007/06/17(日) 21:42:36
環境は FC5 で〜
gcc でコンパイルなの
で〜、string.h インクルードしなくても動いたよ
でも警告が出てたの
0230デフォルトの名無しさん2007/06/17(日) 22:02:31
char型の配列に全角文字を格納したい場合はどのようにすればよいのでしょうか?

char[0] = 'あ';

のようにやってもできなくて・・・
0231デフォルトの名無しさん2007/06/17(日) 22:04:12
>>230
strcpy(s, "あ");
0232デフォルトの名無しさん2007/06/17(日) 22:05:46
日本語は2バイトだから1バイトのcharには入らないので>>231
0233デフォルトの名無しさん2007/06/17(日) 22:06:44
>>226
strcpyという関数のプロトタイプ宣言はstring.hで記述されている。
それをincludeしなかった場合、int strcpy()と解釈される。
これが組み込み関数のstrcpyと互換の無い型だ、と判断されている警告。
(だったと思うが嘘だったらすまん)

gccは賢いので、勝手にライブラリからstrcpy探してきたり
組み込み関数のstrcpy使ったりして動作するように実行ファイルを作ってくれる。
0234デフォルトの名無しさん2007/06/17(日) 22:29:26
Cって何でCっていうの?
0235デフォルトの名無しさん2007/06/17(日) 22:29:45
Bの次だから
0236デフォルトの名無しさん2007/06/17(日) 22:36:09
BCPLを調べてみよう
0237sage2007/06/17(日) 23:09:09
わからないので至急教えてください。

次のようにすると整数値のスタックが実用できる。試してみよ。(mainに
適当にpush();pop();を書いて、スタックに積んだ順番と出来てきた
順数を比べよ。
実際には使うには足らないところがある。それはどこか?


int srk0[100];
int stkp=0;

void push(Iint i);{
stk0[stskp++]=+;
}
int pop(){
return sstko[--stkp];
main(){
/***具体的な実行本体***/

/***ここまでがプログラム***/
}
0238デフォルトの名無しさん2007/06/17(日) 23:12:32
stk0[stskp++]=+;
0239デフォルトの名無しさん2007/06/17(日) 23:13:55
>>237
sageはメル欄に。
>実用
実装じゃないか?
色々とドコから突っ込んで良いのか分からないが、書き間違いか?

急ぐのも分かるが、ちょっと落ち着け。

>実際には使うには足らないところがある。それはどこか?
書き間違いを全てスルーして、↑が質問だとすると、
多分スタックに保存されてる数値が100超えた時のエラー処理が無い、ということじゃないか?
0240デフォルトの名無しさん2007/06/17(日) 23:17:52
237です。なんか課題で、自分もよくわかっていない。色々と突っ込んで
くれるなら、よろしく。タイプミスはよくするので
0241デフォルトの名無しさん2007/06/17(日) 23:20:12
>>237
あとはpushされていない(スタックにデータがない)ときにpopしたときの処理も
0242デフォルトの名無しさん2007/06/17(日) 23:25:59
/***具体的な実行本体***/

/***ここまでがプログラム***/
に入れるみたい
0243デフォルトの名無しさん2007/06/17(日) 23:26:17
>>240
じゃ、まぁヌクモリでもって一応突っ込んでおく。
今度からは先にコンパイル通して来いな。

void push(Iint i);{ /* ← セミコロン要らない。Iintは多分intの間違い*/
stk0[stskp++]=+; /* +は多分iの間違い */
}
int pop(){
return sstko[--stkp]; /* sstkoは多分srk0 */
/* ここに括弧の閉じ} が足りない */
main(){
/***具体的な実行本体***/

/***ここまでがプログラム***/
}
0244デフォルトの名無しさん2007/06/17(日) 23:35:49
ありがとうございます
/***具体的な実行本体***/
              ←
/***ここまでがプログラム***/

←には何がはいるかわかりますか
0245デフォルトの名無しさん2007/06/17(日) 23:38:50
>>244
値を表示して、pushする
popして、その値を表示する
>>242のあれだとここでstskpの範囲チェックもする
0246デフォルトの名無しさん2007/06/17(日) 23:48:39
>>245
値を表示してpushしてpopするのはわかるんですが
そのプログラムを作れないのです
0247デフォルトの名無しさん2007/06/17(日) 23:51:46
>>243さんが教えてくれたように直しましたが、pop内でのエラーが
出ました
0248デフォルトの名無しさん2007/06/17(日) 23:53:31
stkなのかsrkなのかはっきりしろよ
0249デフォルトの名無しさん2007/06/17(日) 23:56:20
stkなのかsrkなのかと言われてもわかりません。すいません。
かなりの初心者なので
0250デフォルトの名無しさん2007/06/18(月) 00:06:59
お願いです。おしえてください。
自分で調べるには限界です
0251デフォルトの名無しさん2007/06/18(月) 00:07:27
>>246
pushする数値はどうやって取得させたいんだ?
とりあえず乱数で
#include <stdio.h>
#include<stdlib.h>  // srand() rand() のヘッダ
#include<time.h>   // time()のヘッダ
int stk0[100];
int stkp=0;
void push(int i){
stk0[stkp++]=i;
}
int pop(void){
return stk0[--stkp];
}
int main(){
int a,i=0;
srand(time(NULL)); // 乱数初期化
printf("push\n");
for(;i<10;i++){
a=rand();   // 乱数生成
printf("%d\n",a);
push(a);
}
printf("\npop\n");
for(i=0;i<10;i++){
a=pop();
printf("%d\n",a);
}
return 0;
}
0252デフォルトの名無しさん2007/06/18(月) 00:11:39
237のところに書いたようにしか聞いていないので正直
わかりません
■ このスレッドは過去ログ倉庫に格納されています