C言語なら俺に聞け(入門篇) Part 4
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/11/09(木) 00:31:01・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 3
http://pc8.2ch.net/test/read.cgi/tech/1160682950/
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
関連スレ
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/
0751デフォルトの名無しさん
2006/11/26(日) 02:04:05no=0とno=1でfseekの戻り値見てみましたが、0でした。
fseekの引数でnoを(no-1)にしてnoを1と2で試してみましたが、やっぱりno=1を読むと0 0 0になってしまいました。
戻り値の意味が間違ってるならごめんなさい。
0752デフォルトの名無しさん
2006/11/26(日) 02:07:130なら成功してますね。
>>750
あっそういう事か。ファイルを上書きして消してしまってるという事ね。
元のファイルを残したいならr+bだな。
0753デフォルトの名無しさん
2006/11/26(日) 02:11:07それで試したら無事表示できました、ありがとうございます!
オープンモード、もう一度勉強しなおしてきます。
>751
わかりづらくて申し訳ありませんでした。
上書きはwbやwb+とはまた別の書き方なんですね…
こんな深夜にお付き合い頂き、ありがとうございました。
0754デフォルトの名無しさん
2006/11/26(日) 10:26:000755デフォルトの名無しさん
2006/11/26(日) 10:33:40初心者なんでptagmaが何かわかりません。
わかりやすく説明してくださいませんか?
0756デフォルトの名無しさん
2006/11/26(日) 10:36:230757デフォルトの名無しさん
2006/11/26(日) 13:23:19内容をみるのでしょうか。何か専用のツールがあるのかなあ。
こんな感じのファイルです。
MAKEDEV-3.1.0-19.src.rpm
ご存知の方教えてください。
スレちがいならすまん。
0758デフォルトの名無しさん
2006/11/26(日) 13:29:48それはインストール用パッケージだ。詳しくは犬板でどうぞ。
>>755
>754はpragmaと言いたかったのだろう。
要は、構造体のメンバ間に埋め草が必要になる可能性を排除しておけと言うことだ。
0759デフォルトの名無しさん
2006/11/26(日) 13:33:21モード,動作,ファイルがないとき,ファイルがあるとき
r,読み込み専用,エラー,開く
w,書き込み専用,作る,クリアする
a,追記専用,忘れた,開いて末尾に移動
r+,読み書き,エラー,開く
w+,読み書き,作る,クリアする
a+,追記部で読み書き,忘れた,開いて末尾に移動
0760デフォルトの名無しさん
2006/11/26(日) 13:42:00#ptagma ではなく #pragma
C言語の範疇では定義されていない部分について、コンパイラに対して
特殊な指示を出すためのもの。
VC++なら pragmaだったけど、他のコンパイラなら違ってるかも。良く知なくてすまん。
C言語の学習を始めたばかりなら、まだpragmaとかは意識しないほうがいいかも。
ある程度基礎ができてきてから出いいので、
変数をメモリに割り当てるときの境界調整だとか、
構造体のメンバの間に詰め物がされる場合があるとか、
そういう話も調べて見るといいかも。
以下のページの説明が分かりやすそう。
ttp://mag.autumn.org/Content.modf?id=20050430014843
とりあえず、今やっている構造体のメモリ内容をファイルに書き出す&読み込む
というのは、同じ環境でやっている分には使えるけど、
書き出したファイルを別の環境で読み出す上手く行かないことがあるというのを
知っていればいいと思うよ。
0761デフォルトの名無しさん
2006/11/26(日) 13:42:020762デフォルトの名無しさん
2006/11/26(日) 13:50:48中途半端にpragmaどうこうは気にしなくてもいいかもしれんけど。
0763デフォルトの名無しさん
2006/11/26(日) 13:51:08759 宛て
0764デフォルトの名無しさん
2006/11/26(日) 15:58:571以上の値だったらマイナスをつけて返す、
-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
最上位ビットを確認し、反転する一番いい書き方ってどんなんでしょうか?
0765デフォルトの名無しさん
2006/11/26(日) 16:01:15{
return -x;
}
0766デフォルトの名無しさん
2006/11/26(日) 16:12:31最上位ビットを反転しても符号が逆でも絶対値が同じにはならん。
>>764が結局何をしたいのか書かないから
>1以上の値だったらマイナスをつけて返す、
>-1以下の値だったらプラスをつけて返す関数を作成したいのですが、
の部分より>>765が正解のように思える。
0767デフォルトの名無しさん
2006/11/26(日) 16:25:27ってなんだよ〜。くそorz
0768デフォルトの名無しさん
2006/11/26(日) 16:35:31クリアじゃなくフィルだな
int i;
for (i=0; i<10;i++) {
a[i]=0;
b[i]='a';
}
0769767
2006/11/26(日) 16:40:13おっと>>768ありがとうございます。
0770デフォルトの名無しさん
2006/11/26(日) 18:17:24そのときmainの中にある配列atai[10]の値をkaikiに渡して,
kaiki内で計算した結果のkotae1,kotae2という二つの変数をmainに返したいのですが、
どのように書いたらいいのでしょうか?
0771デフォルトの名無しさん
2006/11/26(日) 18:20:46void kaiki(int n, int* kotae1, int* kotae2)
{
...
}
main()
{
int atai[100];
int kotae1, kotae2;
...
kaiki(atai[10], &kotae1, &kotae2);
...
}
0772デフォルトの名無しさん
2006/11/26(日) 18:45:02int kotae1;
int kotae2;
};
struct kotae kaiki(int n, int const * atai)
{
struct kotae rtn;
//
rtn.kotae1 = 0;
rtn.kotae2 = 0;
//
return rtn;
}
int main()
{
int atai[100];
struct kotae kotae = kaiki(sizeof(atai) / sizeof(* atai), atai);
printf("kotae1:%d, kotae2:%d\n", kotae.kotae1, kotae.kotae2);
return 0;
}
0773デフォルトの名無しさん
2006/11/26(日) 21:56:15Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm
0 23 0 374.2 0 0 0 0 0 0 0 0 0
1 22 ・・・
があるのですが、2行4列目の数字だけをfscanf等で取り込みたいです。
このようなエクセルファイルが365個あり、順々に2行4列目だけをP[i]へ格納していこうと思うのですが、読み込みの部分が上手くいきません。
よろしくお願いします。
0774デフォルトの名無しさん
2006/11/26(日) 22:04:59その365個のファイルは、ファイル名に規則性があるの?
それとも、全部、手入力?
0775デフォルトの名無しさん
2006/11/26(日) 22:22:55年間データで
1_1.xls〜12_31.xls(1月1日〜12月31)
です。
0776デフォルトの名無しさん
2006/11/26(日) 22:37:36読みこむ部分だけ。
一行256文字以下で、二行目が整数、整数、整数、実数の並びになっているとして。
int readVal(const char *filename, double* d)
{
FILE *fp;
char line[256];
int dmy1, dmy2, dmy3;
fp = fopen(filename, "r");
if (fp == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;
if (fgets(line, sizeof line, fp) == NULL)
return 0;
if (sscanf("%d %d %d %lf", &dmy1, &dmy2, &dmy3, d) != 4)
return 0;
fclose(fp);
return 1;
}
0777776
2006/11/26(日) 22:39:50↓まかせた。
0778デフォルトの名無しさん
2006/11/26(日) 22:40:45来週もよろしく頼むぞよ
0779デフォルトの名無しさん
2006/11/26(日) 22:46:58fgets(s, sizeof(s), fp),
fgets(s, sizeof(s), fp);
P[i] = s[3]-'0';
で良いんじゃね?
0780デフォルトの名無しさん
2006/11/26(日) 22:54:270781デフォルトの名無しさん
2006/11/26(日) 23:04:28テキストとしての4列目なのではなく、4セル目なんでね?
>>776
何故%*dとせずにダミーに格納する?
>>775
xlsファイルを読むのは途方もなく面倒なわけだが、csvか何かに変換できないのか?
0782デフォルトの名無しさん
2006/11/26(日) 23:46:01>>776の方法では駄目でしょうか?
もう少しで試せるので出来次第報告します。
0783デフォルトの名無しさん
2006/11/26(日) 23:48:57拡張子ではなく内容の問題
書式等の情報が含まれるからめんどくさい
0784デフォルトの名無しさん
2006/11/26(日) 23:54:55行間は勿論改行です。
0785デフォルトの名無しさん
2006/11/26(日) 23:58:56データ保存する際にtxtとかにするって意味か
ファイル名の変更で拡張子変えるって意味かと思った
0786デフォルトの名無しさん
2006/11/27(月) 00:28:19スイマセン、そういう意味です。
伝わりにくい言い方で申し訳ないです。
0787デフォルトの名無しさん
2006/11/27(月) 01:20:44とりあえず切り出したらどうだろ?
0788デフォルトの名無しさん
2006/11/27(月) 03:03:39#include <stdio.h>
#include <conio.h>
int main()
{
int a = -32769, b = 32768;/*コメント*/
printf("a = 15\nb = 20\n");
printf("a + b = %d\n", a + b);
printf("何かキーを押してください\n");
getch();
printf("End");
return 0;
これってVC++だとコンパイルできないようなんですが、BCCではコンパイルできてしまいます。何か理由ってあるんでしょうか。
0789デフォルトの名無しさん
2006/11/27(月) 03:06:44標準じゃないライブラリconioがあるかどうか。
0790デフォルトの名無しさん
2006/11/27(月) 03:15:57括弧が足りない。
0791デフォルトの名無しさん
2006/11/27(月) 03:18:25愛も足りないねぇ 標準で済むのに
0792デフォルトの名無しさん
2006/11/27(月) 03:22:00どの括弧が足りないんでしょうか?
それとコンパイルできないのが正しい形なんでしょうか?
0793デフォルトの名無しさん
2006/11/27(月) 03:29:23getch(); → _getch();
にすればコンパイルできるんじゃないかなかな。
0794デフォルトの名無しさん
2006/11/27(月) 03:39:150795デフォルトの名無しさん
2006/11/27(月) 03:40:57ニュートン法とか二分法とか
0796794
2006/11/27(月) 04:02:27具体的にはどうすればいいんですか?
まったくわからないので教えて下さい。
0797デフォルトの名無しさん
2006/11/27(月) 04:04:12ぐぐれよ
例えば平方根を求める場合
http://www.sm.rim.or.jp/~shishido/newton.html
これのx*xをsin(x)にかえて、2*xをcos(x)に変えるとか
0798794
2006/11/27(月) 04:50:43ぐぐっていろいろ試してみましたができませんでしたorz
0799デフォルトの名無しさん
2006/11/27(月) 05:17:08だいたいこんな感じ
#include <stdio.h>
#include <math.h>
#define f(x) (sin(2 * (x)) - 0.5) /* x = 0.5 */
#define g(x) (2 * cos(2 * (x)))
#define MAXCOUNT 10
int main(void)
{
double x = 0.5;
int k;
for (k = 1; k <= MAXCOUNT; k++) {
x = x - f(x) / g(x);
printf("%17.12f %15.8e\n", x, fabs(f(x)));
}
return 0;
}
0800デフォルトの名無しさん
2006/11/27(月) 06:43:31theta=asin(x)/2;
0801デフォルトの名無しさん
2006/11/27(月) 06:47:480802デフォルトの名無しさん
2006/11/27(月) 14:15:57そうだとasin(sqrt(x))とasin(-sqrt(x))。
0803デフォルトの名無しさん
2006/11/27(月) 15:24:01曜日を出力するプログラムを作成せよ、って課題が学校で出たんですが
全く分かりません・・・
誰か教えてください
0804デフォルトの名無しさん
2006/11/27(月) 15:32:16宿題スレへどうぞ。
0806デフォルトの名無しさん
2006/11/27(月) 17:45:310807デフォルトの名無しさん
2006/11/27(月) 17:55:36C++作った人もint* p;派だというし。
もちろんC++やったことがなくてもint* p;の人はいるし、その逆もそう。結局は好みの問題。
0808デフォルトの名無しさん
2006/11/27(月) 17:57:51英数字とか漢字をを入力し、それを16進数で表示したいと考えています。
scanfで取り込んでprintfでみたいにしてみたんですがうまくいきません。
アドバイスいただけないでしょうか?よろしくお願いします。
また、このやり方で漢字を16進で受け取ることはできるのでしょうか?
0809デフォルトの名無しさん
2006/11/27(月) 18:02:01仕様も性能も。
0810デフォルトの名無しさん
2006/11/27(月) 18:15:28漢字はchar型の変数に収まらないので、文字列(char配列)として扱え。
>>809
シェアはC++のほうが明らかに上。
でもたぶん、そもそもC++とObjective-Cが目指している方向は違うと思うんだ。比べるだけ無駄だと思う。
0811デフォルトの名無しさん
2006/11/27(月) 20:41:12入力された文字列の文字コードを表示するって意味だろうか。
0812デフォルトの名無しさん
2006/11/27(月) 21:44:222バイトURLを1バイトに直したくて・・・
0813デフォルトの名無しさん
2006/11/27(月) 21:58:45ひらがなは1バイトにできん
2バイト文字だ
0814デフォルトの名無しさん
2006/11/27(月) 22:07:16汎用関数みたいな都合のいいものはないみたいね。
変換するのが英数字なら、なんとか自分で(環境依存のものを)書こう。
適当だけど、
unsigned char hoge[] = "abcde:/";
int i;
for (i = 0; i < sizeof(hoge); i++)
{
printf("%x ", hoge[i]);
}
こんな感じでコードの規則性を調べて、
unsigned char hoge[] = "abcde:/";
char str[256];
int i;
for (i = 0; i < sizeof(hoge) / 2; i++)
{
switch(hoge[i * 2]) {
case 0x82:
str[i] = hoge[i * 2 + 1] - 0x81 + 'a';
break;
default:
break;
}
}
str[i] = '\0';
こんな感じで変換するしかないんじゃない?コロンとかスラッシュは
一つずつ対応して・・・ああめんどくさい。しかも移植性なし。
0815デフォルトの名無しさん
2006/11/27(月) 23:55:540816デフォルトの名無しさん
2006/11/28(火) 06:39:06使いたいのですが、関数にして何度も使うには文が長く
参照する変数が二次元配列などが多くてごちゃごちゃしてます。
どうすれば同switch内でもう一度使えるでしょうか?
教えてください。お願いします。
0817デフォルトの名無しさん
2006/11/28(火) 06:52:16その長い文を同じswitch文の中で二ヶ所使う方がさらにごちゃごちゃするんじゃないか?
まず、その長い処理を切り出して関数にする。
関数内で使うために渡すべき変数が多すぎて引数がごちゃごちゃするようなら、
構造体等でまとまりを作って呼び出しをすっきりさせる。
まとまった処理とのインタフェースが変数がごちゃごちゃしているせいで美しくないと感じるようなら、
データ構造の変数への切り出し方を再考することも考えてみたら?
0818デフォルトの名無しさん
2006/11/28(火) 06:55:10うっす。ありがとうございます。
0819デフォルトの名無しさん
2006/11/28(火) 07:53:40case WM_CREATE:
case WM_KEYDOWN:
// 処理
って話ではないのかね。
0820808
2006/11/28(火) 12:48:13scanfで取り込んだらコードが出てくるかなと思い質問さ
していただきました。
JISコードを表示することは簡単ではないのでしょうか?
0821デフォルトの名無しさん
2006/11/28(火) 13:42:030822デフォルトの名無しさん
2006/11/28(火) 18:00:27問題なんですが、エラーは出ずにコンパイルできても
実行したら何も起きません。
宜しければどこが間違ってるか教えて頂けないでしょうか?
#include <stdio.h>
int main (void)
{
int i,no;
printf("正の整数を入力して下さい:");
scanf("%d", &no);
i = 1;
while (i <= no)
{
if (i == (2 * i))
printf("%d ", i);
i++;
}
if (no > 0)
putchar('\n');
return (0);
}
0823デフォルトの名無しさん
2006/11/28(火) 18:04:14さらに i が 2 * i と等しくなるのは i=0 の時だけ。
0824デフォルトの名無しさん
2006/11/28(火) 18:33:27#include<stdio.h>
int main (void)
{
int i,no;
printf("正の整数を入力して下さい:");
scanf("%d", &no);
for(i=1;i<=no;i<<=1)
printf("%d ", i);
if (no > 0)
putchar('\n');
return (0);
}
0825電信男
2006/11/28(火) 18:34:08うまいことできません。
AppleがyPPLEになってしまいます。
どーすればいいでしょうか?
#include <stdio.h>
int main()
{
int i = 0;
char c[] = "Apple";
char b [80];
printf("String: %s\n", c);
for(i = 0;i < 5; i++){
if ('a' <= c[i] && c[i] <= 'z' )
b[i] = c[i] + 'A' - 'a';
}
printf("Upper case: %s\n", b);
return 0;
}
0826デフォルトの名無しさん
2006/11/28(火) 18:36:50c[i]が小文字以外の時の処理を加えるといいよ
または #include<ctype.h> と b[i]=toupper(c[i])
0827デフォルトの名無しさん
2006/11/28(火) 18:46:19アドバイスありがとうございます。
ですが、2のべき乗のチェックの式がわからないのです。
>>824
例題がwhileを使ってるのでできればwhileのままでやりたいのですが…
0828デフォルトの名無しさん
2006/11/28(火) 18:53:012のべき乗なら1になるまでずーっと2で割り切れる。
forのループをwhileに直すことぐらい自分でしろ。
「2のべき乗かどうか」をチェックする必要など無い。
「2のべき乗にしかならない」値を作ればいい。
i=0;while((2<<i)<=no){printf("%d ", (2<<i));i++;}
0830デフォルトの名無しさん
2006/11/28(火) 18:59:042の0乗=1 も仲間にいれてやって
i=0;while((1<<i)<=no){printf("%d ", (1<<i));i++;}
こうだな。
0832デフォルトの名無しさん
2006/11/28(火) 19:01:46文字列の終端に '\0' もいれないといけない。
0833デフォルトの名無しさん
2006/11/28(火) 19:35:22>>829
すみません。
アドバイスありがとうざいました。
0834デフォルトの名無しさん
2006/11/28(火) 22:55:33C言語でフォルダの中身の一覧を表示させるには
どうすれば良いでしょうか。
0835デフォルトの名無しさん
2006/11/28(火) 22:57:39system("dir");
system("ls");
のどちらかでいいんじゃないかな?
0836デフォルトの名無しさん
2006/11/28(火) 22:58:09ls -R
0837デフォルトの名無しさん
2006/11/28(火) 23:05:14というエラーが出るのですがこれはどういうことなんでしょうか?
0838デフォルトの名無しさん
2006/11/28(火) 23:06:070839デフォルトの名無しさん
2006/11/28(火) 23:08:000840デフォルトの名無しさん
2006/11/28(火) 23:09:380841デフォルトの名無しさん
2006/11/28(火) 23:10:26x = y + z;
ってあれば、yとzはオペレータ'+'のオペランドで、
xとy+zがオペレータ'='のオペランド
>>840
ワロタ
0842デフォルトの名無しさん
2006/11/28(火) 23:15:41教えていただきありがとうございました。ということは=の左辺と右辺が矛盾してますよってことですか?
0843デフォルトの名無しさん
2006/11/28(火) 23:23:51矛盾しているということではなくて、=の左辺にあるものが
代入可能なものではないということ。
0844デフォルトの名無しさん
2006/11/28(火) 23:24:07エラーが出た行を貼り付けてくれれば簡単に答えられると思うが
0845デフォルトの名無しさん
2006/11/28(火) 23:32:18if((l*l+o*o)>i*i)
printf("鋭角三角形");
if((l*l+o*o)=i*i) ←ここです。
printf("直角三角形");
if((l*l+o*o)<i*i)
printf("鈍角三角形");
}
0846デフォルトの名無しさん
2006/11/28(火) 23:33:26==
0847デフォルトの名無しさん
2006/11/28(火) 23:36:230848デフォルトの名無しさん
2006/11/28(火) 23:43:540849デフォルトの名無しさん
2006/11/28(火) 23:49:03fopen関数とかその辺のファイル入出力関係の関数を使って作っていけばいいんですよね?
なにかコツとか陥り易い問題点とかあったらアドバイスよろしくお願いします。
0850デフォルトの名無しさん
2006/11/29(水) 00:01:02テキストエディタを実装するには理解すべきことがかなり多いと思うよ。
ファイル入出力だけじゃなく、GUI(描画、ユーザ入力)とか、メモリ上のデータ管理とか。
とりあえずアドバイスとしては
・いきなり高機能なものは目指さない。
・基本はしっかり学ぶ。入出力が良く分かってないなら、テキストエディタはいったん置いておいて
ある程度自由に入出力が扱えるくらいには勉強してみる。
・ちゃんとテストする。いろいろ作りこんでから上手く動かないと分かっても、原因を調べるのは大変。
・自分でいろいろな情報を調べられるようにする。
・めげない。
■ このスレッドは過去ログ倉庫に格納されています