5 :
4 :2008/06/13(金) 23:47:50
1,文字列に母音(a,i,u,e,o)が何個含まれているかをint型数値として返すような関数VowelNumber()を作成せよ。 また,この関数を使用して,キーボードから入力された文字列に 母音が何個含まれているかを表示するプログラムを作成せよ。 2, (1) ある自然数に対して,その自然数の約数は何個かを関数値として返すような 関数FactorQuantity()を作成せよ。 例として20の場合は{1,2,4,5,10,20}なので個数は6となる。 (2) ある自然数Nの約数の個数が2個だけ(1とNだけ)の場合,Nは素数である。 そこで(1)の関数FactorQuantity()を利用してNが素数がどうかを判定し, Nが素数なら1を返し,素数でなければ0を返す関数Prime()を作成せよ。 (3) (2)の関数Prime()を用いて次のプログラムを作成せよ。 2つの自然数a,bを入力させ(a<bとする),a以上b以下の素数を全て表示するプログラムを作成せよ。 ※ソースファイルは1つのファイルにまとめよ。 という2問です。 OSはリナックスです。 いままで習ったのは、printf、scanf、ループ文、if文、配列などです。まだポインタは習っていません。 解説も少し加えてくれるとありがたいです。 よろしくお願いします。
6 :
5 :2008/06/13(金) 23:48:41
>>前スレ994 float関数群が追加されたのはC95な。
C95なんてあったのか。
質問なのですが 数値演算ライブラリと数値計算ライブラリは同一のものなのでしょうか? 数値演算ライブラリと検索しても詳しく出てこなくて よろしくお願いします
日本語がわかるならそんくらい分かるだろ\・・
12 :
5 :2008/06/14(土) 00:32:18
>>7 すいません
こちらへはURLをさしてたんですね…
JavaScript なら俺に聞け、な?
日本語能力に問題がありすぎる・・・
数値演算ライブラリが何か知りたくて検索してみたのですが詳しく書いてあるサイトが無く 数値演算ライブラリと数値計算ライブラリが関係があるような記述があったので… 数値演算ライブラリとは何のことなのでしょうか よろしくお願いします
>>15 もし君がC言語の標準ライブラリのことを言っているのなら、それはたぶん数学関係ライブラリ <math.h> のことだ。
そうでないなら、それがどのようなものであるかは、すべてそのライブラリそのものに依存する。
ライブラリのマニュアルを読むこと。
>>15 標準ライブラリの数値演算関数って事ですか、たぶん1年の初期の問題なんでこれなんだと思います
ありがとうございました。
いきなり難解なやりとりだね
CPUの命令セットにない高機能な数学用関数などを 実現するライブラリのコードとか入ってるんだよね 最近のCPUは浮動小数点用の高機能命令が増えた から数値演算ライブラリそのものが小さくなってるけど、 昔のCPUは浮動小数点演算そのものの機能がなくて エミュレータが入っていた 今も組み込み用CPUだと浮動小数点演算ができない ものはたくさんある
浮動小数点のビット列ってどういう法則になってるの?
単にIEEE754でぐぐってもよい 山ほど出てくる
>>21 なんだか大変そうだけど俺頑張るよ父ちゃん!
初歩的な事で申し訳ないのですが 例えばif文でint形変数iが1〜9までの範囲ならtureだとする時はどうすればいいのでしょう。 if(i == 1,2,3,4,5,6,7,8,9)とやってみたところ、なぜか10以上の数でもtureになってしまいました。
if(1<=i && i<=9)
>>24 if()の中で,で区切って複数入れると一番右のものを判定する。
つまり、
if(i == 1,2,3,4,5,6,7,8,9) は if(9) と同じになり、9は真だから常にtrueになる。
カンマ演算子で左から右に読んでって、最後に0以外である9が評価されて必ずtrueになってる
>>25-26 おおっ!なるほど。
言われてみれば、そのとおりです。
ありがとうございました。
>>27 trueのスペルも間違えてましたorz
みなさん本当に感謝です
書き込みが無いな
31 :
デフォルトの名無しさん :2008/06/14(土) 20:44:37
誰かB木のソースもってません? 実行時間比較したいんでお願いします
>>31 C言語によるアルゴリズム事典(奥村晴彦)の付録のでは駄目なの?
手数料だけでフロッピーディスクで入手できるけど...
STL で使ってんのは赤黒木じゃなかったっけ?
「B木」って「ビーき」なのかな。「〜木」はたいてい連濁させていたんだけど。
びーぼく
37 :
デフォルトの名無しさん :2008/06/14(土) 21:49:31
プログラミング言語CのことをC言語って言うことについてどう思いますか? 英語圏では単にCと呼ばれてるみたいなのですが。 話をする場合にはCと言っても問題ないと思うのですが。 JavaやC++の語尾に言語ってつけたりしませんよね? Cだと一文字なので検索がしづらいということがありますが。
だってCってsexの意味もあるじゃん
ツェーとか言ってみる
参考書 「はじめてのC」
wikipediaは、最初「Java言語」だったけどそれじゃ変だろってことで「Java」に変更。 「C言語」も同様の提案があったけど、アホな人が頑張って「C言語」のまま。
42 :
デフォルトの名無しさん :2008/06/14(土) 22:08:08
>>38 確かにそうですが、ある単語が複数の意味を持っているということはよくあることなので。
それに中学生ではないのでCと聞いてセックスって思いませんよ普通。
文脈からプログラミング言語なのかセックスなのか分かると思いますが。
# 「はじめてのC」という書籍があります。
「はじめてのキス」という魚の本もあった。まさに釣られた。
母なる大地 Cなる言語 言語C 観念ι 勇者ライディーン 「エスペラント語」みたいなもんでしょ。呼び名としてはわかりやすいからいいんじゃないの。 >英語圏では単にCと呼ばれてるみたいなのですが。 むしろ英語圏での「the C language」「the C programming language」を直訳したんじゃないのw
>>41 それは正式名称は何かっていう議論だよね。あれはアホじゃないだろうかと思ったけど、
まあ世の中そういうものだと思う
K&Rの演習をやってるんだけど、難しいです これ一通り解けなきゃ何かを作るときとかまずいの?
>>46 できあがるものはろくなもんじゃないだろうな
基礎は大事
C調言語に御用心
>>46 まずいって、何がまずいの?
C言語理解してなくても生きていけるし、
K&Rの演習が分からなくてもプログラムは書けるよ?
解かなくても別に問題はないけど 解こうとして解けないのは大問題だろ
>>46 ドラクエで言うと
レベル1で「がいこつ」と戦うと「まったく勝てない」んです。
けど、ある程度レベルが上がると「何とか勝てる」んです。
もっとレベルが上がると「余裕で勝てる」んです。
「がいこつ」に余裕で勝てるようになると今度は
「まほうつかい」に「何とか勝てる」ようになったりするんです。
「がいこつ」に勝てないのに「まほうつかい」に挑んでもしょうがないんです。
がんばってくださいよ。ラダトームの勇者さん。
54 :
スライム :2008/06/15(日) 01:02:13
オレのことは無視かよ
がいこつ>>>まほうつかい
PRGなんてレベルを上げれば、ほとんどの敵を余裕で倒せるが 中には特殊な道具が必要、イベント上絶対に倒せない(ことになっている)とか プログラミングに於いては、必要なライブラリやAPIがなきゃ厳しい、無理なんて ものもあるしぃ〜。いくらプログラマのレベルを上げても駄目なこともあるのさぁ〜 ベイビー
>>54 スライムさんはレベル1で勝てちゃうから、ね。
けれど、あなたがいない世界では決して勇者は育たず、永遠に世界に平和が訪れません。
あなたがいたからこそりゅうおうを倒すことができた、それを忘れる事はないでしょう。
>>55 そうだっけ!?そいつぁ大きなミスだったorz
>>56 ようせいのふえがあればゴーレムをすぐ倒せるのに、使い方を知らなかったために
ゴーレムと死闘する羽目になった。つまり、APIの知識が乏しいばかりに
車輪の再開発をするプログラマのことを指しているんですよね?
ん〜まぁそんなもん。いくら経験値を稼いでLv.99にしても、それは 無駄とは言えなくとも、他に手段を選べる、必要なものを取り込む 知識や知恵も必要ということさ。そこで、攻撃重視の戦士や武道家 だけでなく、魔法が使えるキャラ、そして攻略本も。 何か参考になる資料や開発環境を整えておくことも重要さ。
>>51 K&Rの演習がプログラミングの基礎を抑えてると思ったんです。
ですが、どうやらもう少し簡単なものからやった方が自分にはいいみたいです。
>>52 すみません。未熟者です。
>>53 なるほど。
とりあえずスライム探してきます。
はぐれメタルもいるんですよね、きっと。
>>56 まず、道具の使い方がわかるくらいまでは勉強してみようと思います。
有限長の文字列を総当りで生成して、それをコンパイルしていくプログラムを作れば そのうち自分が作りたかったプログラムが自動生成されるんじゃね?
シェークスピア全集だってその方法で書けるよ。
>>60 天才!
あとは、そのプログラムが自分の望む動きをするかどうかを
自動判定するプログラムを作ればいいだけだな。
頑張れ。
量子コンピュータがあれば一瞬だぜ。
>>60 万能検証プログラムがないとゴミプログラムに埋もれて死ねる
検証プログラムも生成されるから大丈夫だよ
検証プログラムかどうかを検証するプログラムを作らないとな
悪意の無いプログラムかどうかも確認する必要があるな
69 :
デフォルトの名無しさん :2008/06/15(日) 17:40:20
式の値が0のときtrueになるというものをif文で書くとき if (![変数とか]) と書くべきか if ([変数とか] == 0) と書くべきかどちらですか? あとヌルポインタを判定する場合も流儀があれば教えてください。 if (p == NULL) か if (!p) かということ。
好みかな。一貫して使えばどれでもいい。
>>69 個人的に
◎ if (![変数とか]) <− Ok
○ if ([変数とか] == 0) <− ちょっと冗長な気がする
◎ if (p == NULL) <− Ok
△ if (!p) <− NULLは0なのだろうか!?という問題がある。
>>71 NULLは0ではないが、
0はNULLだから...
73 :
デフォルトの名無しさん :2008/06/15(日) 18:03:11
>>71 お前ド素人だろ?w
Cでプログラム書くなよw
周りが迷惑だからなw
74 :
デフォルトの名無しさん :2008/06/15(日) 18:05:05
まぁ全体で一貫してくれ
>>71 char *p;
if(!p) { }
はOK. というか C++ では NULL よりは 0 の方が好まれているようです。
>>73 あ な た の 存 在 が 迷 惑 で す。
正常な状態を検知するのに否定を使うのはセンスに欠けると思う。
77 :
71 :2008/06/15(日) 18:27:21
ちょっと調べてみた NULLの値が0でなくても、 if(!p) if(p != 0) if(p != NULL) は同じ結果になるようです。 サンクス
78 :
デフォルトの名無しさん :2008/06/15(日) 18:28:52
>>76 trueが正常とは限らないだろう。例えば、
if (!(p = malloc(n))) {
perror("malloc");
return 1;
}
正常だった場合の処理;
もっとも、この書き方は、コーディング規約で禁止しているところもあると聞くが。
それはともかく、
if (!strcmp(a, b)) ...
は頂けないかな。
if (!strcmp(a, b)) ... で等しい時に真なんだもんな。 直感に反するわ。
>>69 んーまあ比較演算子のない条件式を「変」だと思えるピュアな心があればいいんじゃないかな。
ただし、識別子と意味が食い違って紛らわしくなるような場合はいかん。いかんよ。
83 :
デフォルトの名無しさん :2008/06/15(日) 18:40:47
>if(!p) >if(p != 0) >if(p != NULL) >は同じ結果になるようです。 流石ド素人。 なかなか諧謔のセンスがある。 このような頭の悪い人間はプログラミングの世界から手を引いた方がよい。 疑似科学の学者になったほうがよいのではないか?
>>83 うっかりミスだとわかるだろうに
天下を取ったようなその書き込み
もっと大きな気持ちで行こうよ
いや、人には色々心の傷があるんだよ。触れないでおくも吉
>>83 のような口調でエラー/警告メッセージを吐くコンパイラがあったとしたら、
俺なら窓から投げ捨てる。
いやちょっと欲しいかも
>>82 if (isdigit(c)) ...
とかだと比較演算子が現れないけど、これを無理矢理
if (isdigit(c) != 0) ...
とか書く訳?
91 :
デフォルトの名無しさん :2008/06/15(日) 19:11:41
>>86 ごめんなさい、今日ちょっとイライラしているんです。
そもそも
>>69 を書いたのは私で論争を起こそうと考えたからなんです。
あー、ごめんなさいごめんなさい、CもしたことがないのにCのポインタがナントカとか言って
ごめんなさい。人間ド素人は私の方なんです。あぁ、こういうことを平然というから味の素並に
嫌われる元なんですね、ごめんなさいごめんなさい。
いちいちageる奴にろくなのは居ない
>>90 真偽を返す関数は逆に比較すべきじゃない。
書いてもいいし書かなくてもいい ただ、自分のやり方として首尾一貫するのが大事
そそ if(p) と if(p != 0) では同じ実行結果となるけどコンパイラが展開したコードは微妙に違うのをだすよね(オプティマイズの指定にもよるけど)
てことは置いといてもっと気楽に行こうよ。
そう書いたらダメとか、それは間違ってる・・とかより
>>74 や >> 95 に一票(もしかすると同一人?)
>>90 は頭を柔らかくね。何年かして、そのプログラム見たときに何か感じるものがあればいいんじゃない?
pがポインタ型なら全く同じ意味だから、 まともなコンパイラなら同じコードを生成するよ。
逆に、違うコードを吐いたところで9割9分くらいは目くじら立てることないと思う。
GetRandom関数の意味を教えてください
100 :
デフォルトの名無しさん :2008/06/15(日) 22:55:37
>>97 あああ、ちがうよ〜。 or reg, reg とするか cmp reg,0 とかの話。
>>98 そりゃ目くじらどころかござにも引っかからないだしょ。
HWND型の比較はどうやってすればいいですか?
==
106 :
aaa :2008/06/16(月) 15:30:50
scanfで入力させると 例えば int a; printf("数値:"); scanf("%d",&a) 実行結果 数値:●● ってなって入力させると改行がはいるじゃないですか? これを実行結果が 数値:●●センチ のようにできますかね?
一般的には無理 環境によっては可能かも知れないが、かなり特殊だと思う
って言うかC言語の問題じゃなくてOSの入出力インタフェースの問題だな
一回画面クリアして書き直すとか
例えば3〜入力した数までの数をある法則で計算していく時、 その中から素数を計算から除外したい時はどのようにしたらいいんでしょうか?
素数かどうかを判定して素数なら除外する
>>110 素数判定して除外すればいい。
恐らくは、こんな要領。
for (int ic = 3; ic < inputedNumber; ++ic) {
if (isPrime(ic)) continue;
someFunction();
otherFunction();
}
113 :
112 :2008/06/16(月) 17:04:10
ちっ、細かく書き過ぎて先を越されたぜ
物理シュミレーションをやりたいんだけど、いい入門書ない?
セグメンテーションエラーをなおす方法としてなにがあります?
116 :
デフォルトの名無しさん :2008/06/16(月) 19:39:41
どうやってつかうの?
べんきょうする
>>114 分野をはっきりさせないと答えられない。
>>115 どこまで進んで落ちてるのか調べればいいんじゃ?
適当にprintfいれるとか。
121 :
デフォルトの名無しさん :2008/06/16(月) 20:19:35
以下のようなデータファイルをfgetsとsscanfを使って読み込みたいのですが、 どうすればよいでしょうか? test.datの中身 1 2 3 4 5 6 7 8 9 10 11 ... 1000 char line[10000]; int a[1000]; FILE *fp; fp=fopen("test.dat","r"); fgets(line, sizeof(line), fp); とすると、lineにtest.datの内容が文字列として格納されます。 ここからsscanfを用いて、1〜1000をa[0]〜a[999]に格納したいです。 繰り返し構文を用いて何とかできませんでしょうか?
ものすごい初歩的な質問ですが宜しくお願いします。 ためしにファイル名a.cとして文字列を表示させるだけのプログラムでコンパイルを試みたところ Error E2209 a.c1: Unable to open include file 'stdio.h' Warning W8065 a.c 4: Call to function'printf'with no prototype in function main と表示されできません。 なにがいけなかったのでしょうか。
標準インクルードパスがちゃんと設定できてないとか?
>>123 レスありがとうございます。
確認してみましたができてました。
ちなみにプログラムは
#include <stdio.h>
int main(void){
printf("あああああ\n");
return 0;
}
ふつうのプログラムです。
とりあえずプログラムに間違いは全く見受けられないから、 どっかの設定に問題があるとしか。
>>124 できてないからおかしなことになっとるんじゃ
確認させてください。 ボーランド社のコンパイラを使っております。ファイルをC:\Borlandに解凍して、 ↓ 環境変数でPathの末尾に;C:\Borland\BCC55\Binを付け加える ↓ 二つのcfgファイルを作る であっていますか?
セミコロン有って98?
>>120 それをやったのですけど
そのプログラムではfread,fseekを使ってるプログラムで
ひさしぶりにつかったらどうやって組み立ててたのかわからなくて。
宿題のスレにお願いしたのですけど。
ここにはるとマルチになるので
131 :
130 :2008/06/16(月) 21:42:14
すでに現段階でマルチだよ
>>127 cfg ファイルの中身が間違っている可能性が高い
>>133 レスありがとうございます
bcc32.cfg内は
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib"
ですよね。
ilink32.cfg内は
-L"c:\Borland\Bcc55\lib"
ですよね・・・
とくにファイルの移動とかはしていません。デフォルトのままです
中身は問題なさそうだな・・・。 んで、そのファイルはどこに置いてる?
136 :
130 :2008/06/16(月) 21:54:14
prog.cですけど きちんと動けばtextフォルダ内にテキストファイルができます
あいや、cfg ファイルね
ワロタ
Binに入れています。
だが断る
cfg ファイルは非Unicodeのプレーンテキストファイル?
はい
C:\Borland\Bcc32\include\stdio.h はある?
文字コードはANSIでした。 拡張子もtxtではなくcfgに書き換えています。
環境変数かえてから再起動してないってオチでわ?
コンパイラ走ってるからそのあたりは大丈夫そうに思える。
自分のレス番名前に入れろ
「登録された拡張子は表示しない」 設定になっているがために 本当は .cfg.txt になってるのが .cfg と表示されている・・・とかはない?
151 :
122 :2008/06/16(月) 22:07:27
>>149 拡張子は全て表示するようにしています.
だが断る
153 :
122 :2008/06/16(月) 22:15:42
蛇足(?)ですが、JDKも導入しています。こちらはフツウに動作してくれます。
見てみようと思ったがダウンロードできん。
>>151 んじゃ、もう Borland は捨てよう。
インスコして即使える VC++ 2008 Express Edition にしよう。
156 :
122 :2008/06/16(月) 22:51:29
>>155 ですね・・・
Visual C++は初めて使う(学校ではUltra-C Proというソフトつかって勉強してました)のですが、まったく仕様がかわりますか?
基本画面を見ただけでごちゃごちゃしていてよくわからないのですが、、、
コマンドプロンプトからコンパイルする時にインクルードパスを指定してみたら?
158 :
122 :2008/06/16(月) 22:54:56
>>157 コマンドプロンプトの使い方がまったくわかりません;;
> bcc32.cfg内は > -I"c:\Borland\Bcc55\include" > C:\Borland\Bcc32\include\stdio.h はある? →ありました Bcc使ったこと無いんだが、Bcc55ってのとBcc32ってディレクトリできるん?
161 :
122 :2008/06/16(月) 23:01:08
>>159 >C:\Borland\Bcc32\include\stdio.h
これはBcc55の間違いでした。すみません。
>>156 基本的な使い方はそこいらのサイトに載ってると思う。
>>160-161 了解です。
bcc -ehoge.exe hoge.c
でいいのかな。
インクルードパスを明示的に指定するために
bcc -I"c:\Borland\Bcc55\include" -ehoge.exe hoge.c
とやってみるか、インクルードファイルをフルパス指定にするために
#include "c:\Borland\Bcc55\include\stdio.h"
に変えてみるとか。
って\あやしくね?Windows分かりませんで逃げていい?(汗
#include の中は \ 1つでいいよ
166 :
122 :2008/06/16(月) 23:14:16
>>162 ちょっとググってみます。
>>163 おぉぉおぉぉぉおお!できました!ありがとうございます!
しかし、もうVisualC++をインストールし終えてしまいました^^;
でもありがとうございます!
>>166 お。できたんだ?
ってことはコンフィグファイルがうまく効いてないのかしら。
その辺はますます使ったこと無いのでわかりませんが、VCに移行するんですね^^;
がんばってねー
168 :
122 :2008/06/16(月) 23:25:10
>>167 VisualC++は使い慣れるのにけっこう時間が必要のようです^^;;;
当分、メモ帳+VisualC++の併用していこうとおもいます。
167さんのアドバイスで新しい書き方を覚えましたし、満足です^^
ありがとうございました。がんばりまうs!
どうでもいいけどC言語以前の問題だと思う
さらに入門以前の問題でもある
しかし、Visual C++コマンドプロンプトの存在は bcc32.cfgを用意するなどといった手間がない分、Borland C++より優位。 インストーラの力は偉大だ。
>>168 今までのレス見てて原因分かったぞ
bcc32.cfgのincludeを指定してるパスが間違ってるんじゃないのか
見逃してたwww
コマンドプロンプトがわかりませんとか言ってる時点で・・・ まずいくべきはPC初心者板だな。
研修を受けて2週間めですが、さっぱりわかりません、助けてください。 変数ってprintfで表示できるしデバッガーでも表示出来るのはわかるのですが 計算して新しいものを入れるのにクリアしないのですか?
178 :
デフォルトの名無しさん :2008/06/17(火) 00:40:54
>>177 なにをいってるのかさっぱりわかりません、助けてください
日本語の研修ですか?
変数は初期化か上書きしかない、自分がこうしたらクリアだな と思う値で初期化するなり上書きすればクリアじゃないかな
>>178 ごめんなさい、講師の人には失礼なので聞けないので、一緒に研修受けている
人に聞いてもわかりません。
変数ってクリアしないで計算出来るんですか?
いや、講師に聞いてくださいよ…
>>180 ありがとうございます。
思う値でクリアするのがわかりません。
初期化か上書きって命令があるんでしょうか。素人ですみません。
なんかよくわからんけど 自分で値いれるんならクリアしなくてもいいよ
>講師の人には失礼なので聞けない なんというゆとり
186 :
デフォルトの名無しさん :2008/06/17(火) 00:48:09
理解できずに終わる事のほうが失礼だから聞けよクズ
>>182 講師の人の言ってることは日本語が難しいので聞いても無駄だと思って。。。
なら分かりやすく教えてくださいって聞けばいいだろ…
int a = 0; int型変数aを0で初期化 a = 1; 変数aに1を代入(上書き)
この質問者の日本語が一番難しい。
本とか買って予習したほうがいいと思うよ そうすれば講義も理解しやすいかと
ここんとこC言語以前の質問ばっかりじゃねぇか
丁寧に図解して説明してくれて他の受講生は他の学校で習ったよりわかりやすい っていっているので、聞けません。 a = 1って構文は理解したけど、なんでaが1になるのかわかりません。 型が同じだから代入できるということですか?
悪いことは言わないからまず電子計算機のなんたるかを勉強しろ
なんだ他の学校って。 職業訓練学校か? >a = 1って構文は理解したけど、なんでaが1になるのかわかりません。 そういう決まりだからだ。
大学の授業なんだろう? 授業料払ってるんだろう? 聞け 言っとくが俺らはおまえからもおまえの親からも何ももらってないんだからな
もしかしてりんごの絵とかで解説してあげないと駄目なレベルなのかな
はっきり言ってしまうと 単におまえが分不相応な講座取っただけだろ
講師の人には他の人とは差があって当然だから、基礎的な事をまずは勉強 しようねといって、コンピュータの歴史の本みたいなのを読まされています。 わたしはプログラムしたいけれども、多分、もう見捨てられているんですね。 わかりました。
コンピュータ内部の事象をイメージできない人間がプログラミングできるわけがない
ああ、新入社員の研修じゃなかったのか。よかったよかった
うーむ・・・正直相当不向きと見える
学校じゃないから真剣なんです。社会人の研修です。 なんでみんなこんなのでわかるのか泣きたいです。
a = 1って構文は理解したけど、 ↑↑激しく矛盾 ↓↓ なんでaが1になるのかわかりません。
おすすめ図書 猫でも分かるc言語プログラミング
ごめんなさい、明日も早いから寝ます。いろいろありがとうございました。
逆に質問したいんだがなんでaが1になるのが変だと思ったんだ? そういうところをはっきり書いてくれないと誰もあなたが望む答えが出来ないと思うよ
プログラマはプロ・アマ問わず本買うなりネットで調べるなりして自学自習が基本だ。 与えられた本に文句つけてる暇があったら、入門本を片っ端から読み漁れ。 講師だの学校だのにプログラム教えてもらおうなんて思ってるなら、転職・進路変更を勧める。
なんでこんなのをプログラミングの研修に回すんだ… どこの会社かしらんがおかしいだろ
たぶん変数とか代入とかの概念がないんだろう
まわりが経験者ばっかりで焦ってたんだろね
1+1はなんで2になるの?くらいのレベルの質問
>>207 a = 1 って書くのはわかるけど、aは変数じゃないんですか???
ごめんなさい、たぶんわたしがまるでわかってないんですね。
あーそうか つまり a=1 を数学の数式として見てるのか・・・
215 :
デフォルトの名無しさん :2008/06/17(火) 01:09:20
a = 1の構文に違和感を覚えるのなんてよくあること
216 :
デフォルトの名無しさん :2008/06/17(火) 01:09:55
と思ったけど
>>213 を見た限りそういうわけじゃないみたいだなwwwww
a=1; これの意味を本当に理解してる? 説明してみて
>>213 意味わかんねえよ。
「(変数) = (値);」と書いて「(変数)に(値)を代入する」って読むんだよ。
何が分からんのか言うてみろ。
たぶん「代入」が理解できてない
131だけどどなたかわかりましたか?
一番いいのは 自分で int a; a=1; してからprintfでaを表示しろ
zipファイルが落とせないの俺だけ? 出会い系のバナーしかリンクがねーんだけど。
よく言われるのは、変数は箱の名前 まず最初に int a; などのように書いてint型の変数としてaと言う箱を用意します その箱の中身に 1 と言う値を入れる(代入)にはどうすればいいか a = 1; と書くのです、これはC言語の決まりごとです
代入演算子で1を代入してるんですよね。理解しています。 でも、どうしてaが1なんですか? 取り出すところがわかりません。どうやってクリアするのですか?
225 :
デフォルトの名無しさん :2008/06/17(火) 01:14:36
2つの数の最大公約数を出すプログラミングを書いていたのですが、どうしてもうまくいきません どこが悪いか教えてもらえませんか? どんな値を入れても18000みたいな数字が出てきてしまいます。。。 お願いします #include<stdio.h> int gcd(int m,int n) /*二つの自然数の最大公約数を返す*/ { int i; if(m > n) {for(i =m; i==1; i--) {if( (m%i)==0 && (n%i)==0 ) return i; }} else if (m < n) {for(i =n; i==1; i--) {if( (m%i)==0 && (n%i)==0 ) return(i); } } } int main(void) { int x, y; puts("二つの自然数を入力してください。"); printf("自然数1:"); scanf("%d", &x); printf("自然数2:"); scanf("%d", &y); printf("二つの自然数の最大公約数は%dです。 \n", gcd(x ,y)); return(0); }
決まりごとになぜっていわれるのが一番こまるよなー。 なんで止まれは止まらないといけないのかとか
>>220 そんなところにソース上げられても誰も見ようとはしないよ
自分でリンク叩いてみろ
>>224 クリアってなんだよ。
勝手に変な概念を作るな。
どこにうpすれば。。。
おまいら釣られすぎwww
131 単品だとエラー確認できないんすよー。
あーもー、 おまえら何がしてーんだよっww
いったいこいつの頭の中がどうなってるのかを確かめたいと言う知的好奇心
131 ddofile29050.zip pass errorです みてもらえたらうれしいです
>>131 1643.zipがねーぞ?
2chなんかでリンク張るから消されたんじゃねーのw
ここは半角板じゃねぇぇ。
やぱりからかれてるんだ。
明日ゼミあるのに全くゼミ資料も裏付けもやってねー
いくらなんでもa = 1がわからないやつを2週間も放置する会社は無いだろ
a = 1; において、a という箱にはなにかしらデータが入っているから そのままではそのデータが邪魔で 1 を代入することはできない だから a からデータを取り出すなり消去する(「クリア」する)必要がある とでも考えているんじゃなかろうか
なぜreturn aで返るんですか?
>>243 そうです。
どうしてクリアしなくていいんですか?
上書きしてるから
自分でC言語のコーナーいって 自分が一番わかるであろう本をかいなよ。 そしてプログラムを自分が理解してうつ。 それがベストだろ。
248 :
デフォルトの名無しさん :2008/06/17(火) 01:30:50
>>245 箱と説明されてるのがまずかったのかな?
ホワイトボードみたいなもんだを思ってくれ
a = 1;はaって言う名前のホワイトボード書き換える行為だと
+=とか|=なら、245的クリアしない代入と言えるのだろうか?
250 :
131 :2008/06/17(火) 01:31:17
#include <stdio.h> #include <stdlib.h> #include <assert.h> #define MAX 5000 #define M 25 #define STR_MAX 256 void binary_file_process(char *fname) { float sample1; float sample2; float sample3[5]; float s1[MAX]={0}; float input_data[150][M]; char buff[100]="text/"; FILE *fin1=fopen(fname,"rb"); strcat(buff,fname); strcat(buff,".txt"); FILE *fp =fopen(buff,"w"); int i = 0,j = 0,k = 0,l = 0,m = 0,y = 0,z = 0,max=0; int count=0; fseek(fin1, 0, SEEK_SET); fread(sample3, sizeof(float), 6, fin1); fseek(fin1, 12, SEEK_SET); while(fread(&sample1, sizeof(float), 1, fin1) == 1) { s1[k] = sample1; k++; } count=k/M; max=k; for(i=0;i<max;i++){ printf("{%.1f}",s1[i]); if((i+1) % M ==0){ printf("\n"); } } printf("\n\n"); printf("k:%d count:%d max:%d \n",k,count,max); k=0; for(i=0 ; i < count ; i++){ for(j=0;j<M;j++){ printf("\t"); input_data[i][j]=s1[k]; fprintf(fp,"%f ",input_data[i][j]); if((k+1) % M ==0){ fputs("\n",fp); } k++; } } fclose(fin1); fclose(fp);} int main(){ char buf[100][STR_MAX]={'\0'}; FILE *fp; int i,j,k=0,count=0; system("dir power/*.data >memo.txt"); fp=fopen("memo.txt","r"); if(fp==NULL){ printf("prog001.c:file can't open memo.txt\n"); exit(-1); } printf("読み込み開始\n"); i=0; while(fscanf(fp,"%s",buf[i]) != EOF){ i++; } count=i; fclose(fp); printf("count:%d buf[0]=%s\n",count,buf[0]); binary_file_process(buf[0]); } なんとかまとめてみました お願いします
>>255 5行目と11行目のfor文を
i == 1 → i != 1 にかえるとおk
変数の初期化 その変数に代入すると,初期化した変数にいれられる。
>>246 そこが言ってることがわかりません?上書きってクリアとは違うんですか?
>>245 ホワイトボードじゃ、一回クリアしないと書けないぞw
MDでもカセットテープでもなんでもいいが、
繰り返し録音できるメディアはいちいちクリアしなくても
新しく録音できるだろ。
それと一緒だ。上書きだよ上書き。
>>245 C言語は、プログラマのコードが全て
つまりプログラマの責任において操作する
a = 1;
の後に、aに何を代入して上書きしようがプログラマの勝手
で、その変数aの値を使用するのは、プログラマの責任で使えってこった
データがねーから nt main(){ char buf[100][STR_MAX]={'\0'}; FILE *fp; int i,j,k=0,count=0; system("dir power/*.data >memo.txt"); でエラー
まさにカオス
何を代入してもいいのに1を代入するとかもうわけがわからないのは やっぱりむいてないんでしょうね。 書いている言葉は理解できるのにさっぱり意味がわかりません。 長々とありがとうございました。明日相談してみます。
何を代入してもいい箱には 何が代入できるのだろう。 そもさん、せっぱ
書いている言葉は理解できるのに ↑↑何か脳の病気なのか…↓↓ さっぱり意味がわかりません。
1は例えであって別に何しようが勝手だって
型なのどの規則を守ってたら
あとは
>>257 の言うとおり
何も代入してない状態の変数にも中身が勝手に入ってる
ただ、それは何が入ってるか分からないから自分が分かるように
分かる値を入れるだけ
264 :
デフォルトの名無しさん :2008/06/17(火) 01:40:50
>>255 ありがとうございます!
明日トライしてみますね!
助かりました。。
265 :
255 :2008/06/17(火) 01:50:52
>>264 あと公約数がない場合もつけたしておいたほうがいいよ
公約数がないなんてありうるの?
ねぇよwww
素数って1とそれ自身以外の約数がないんじゃなかったっけ? 2つの素数の公約数って1でいいの?
aが1かなんでもいいを入れられるのにどうして1を入れる必要が あるのかどうしてもわからないんですよ。 1じゃなくても入れられるのはわかっています。 なんで1があるのにそれを入れるのか、どういう時に入れれば いいのかわからないんです。 入れたいときにっ言うけどそれがわかりません。 フローチャートも演習でやったのは書けたけど、プログラムを見て フローチャートに出来ません。 やっぱり無理ですね。よくわかりました。
約数って素数じゃなきゃいけないんだっけ?
272 :
255 :2008/06/17(火) 01:59:11
あのプログラムだとループの i が1になった瞬間終了だから 8 7 とか入力したらバグる
>>268 全ての整数は1と(負の約数を考えるなら-1)を約数にもつ。
だから、どんな二つの整数も1を公約数に持つし、
二つの素数の最大公約数は1
変数の存在自体に疑問を持ってるということかいね つまり、全部数値を直打ちしてプログラム書けということかいね 死ぬわ
>>272 そういう意味だったか、すまん
確かに返り値返してないな
変数の意義とは何ぞや。 すなわち、テンポラリである。
女がピーかなんでもいいを入れられるのにどうしてピーを入れる必要が あるのかどうしてもわからないんですよ。 ピーじゃなくても入れられるのはわかっています。 なんでピーがあるのにそれを入れるのか、どういう時に入れれば いいのかわからないんです。 入れたいときにっ言うけどそれがわかりません。 ごめんもう寝る
いや、別に入れたくないなら入れなくていいよ。
根本的に無理だな 問題解決能力そのものがない
>>277 応用をやるために基礎があるってことでおk?
釣りだと思う人挙手 ノ
>>269 つまり、プログラムで何をするか決めてない、理解してないのに
プログラムの構文を習った所で、そんな状態になるわな
まず、これから先に何かをする為に、そうルールでプログラムは動くって覚るしかない
変数は、プログラムを組むなら絶対使うからw
例えば、条件分岐(習ったかどうか知らんが)
int value;
// 何らかの処理でvalueに何らかの数値が入る
...
if ( value == 0 ) {
// 0の時だけにしたい処理
...
}
こんな感じで使う
a = 1; なんて、構文を教えてるだけだ、それに意味なんか求めるな
つまりみなさんよくわかないけど使ってるんですね わたしもそうすることにします
>>283 それがいい
やってるうちに分かってくる b
285 :
デフォルトの名無しさん :2008/06/17(火) 03:49:54
c言語でbmpファイルを読み込んで、それを表示させるプログラムを作るには、 ウインドウ作成プログラムも作らないといけないのですか
Cとウィンドウ作成の関係について詳しく
おいちゃんの作ったプロ、グラマーなクソースなら HTMLのTBL形式に出力しちゃうわよぉ〜ん
これは ひどい
スレ違うかもしれません。だが教えて欲しい! 昨年プログラムとして とあるソフト入社したんだが、C言語でやってる。 しかし!入社して一年たっても全くと言って良い程 C言語がわからす、プログラムなんて持っての他。 テストばかり。テストばかりなのが嫌ではないのだが、 将来首切られる事ってあり得るのかな? ちなみに勤務態度や 勤務状態(遅刻や早退)は良い。 やっぱプログラマ出来ないとリストラされるのでしょうか?
時や場所をわきまえない奴は首
入社したのが新卒なのか、中途で他業種からなのかとか 背景がさっぱりわからんし、同じようにテストを受けてるのが 一人だけとか他にも同期で何人かいるとかでも違うしなあ。 体力ある企業で新卒でそれをさせてるなら育成の可能性が あるから首ってことはないだろうけどなあ。 それに体力無いところは適当な案件見つけてすぐにでも 経歴偽装してデスマな現場に放り込まれそうだけどなw
289ですが、専門卒で新卒でソフト会社入って 一年でやめて、違う業種で一年やって 三年程のブランクを経て今ある会社に入りました。 形としては中採かな。1ヶ月程たった。 自分づもプログラムに向いてないのは 分かってるけど、違う業界でやっていくか、 とりあえず分からないなりに 努力していくか悩んでいるのです。 スレ違う失礼しました。 ただ、このスレ野中にはプログラムの人もいるかなと思い、 参考程度に聞いてみた。 結局は自分だけど、皆さんならどうしますか?
プログラムの人ってなんだよw プログラマだろ
とりあえずちゃんとした文章を書こうよ
まーまだ20代なんだからやる気次第かもね〜
質問です。char変数に代入する方法がわかりません。次のようなプログラムなんですが、 char fruits; int kind; printf("どれが好き?\n1.リンゴ\n2.みかん\n3.バナナ\n"); scanf("%*d,%d",kind); switch(kind){ case 1: fruits = "リンゴ"; break; case 2: (中略) } printf("あなたは%sが好きです",fruits); fruitsに文字を代入するところでエラーが出てしまいます。どう変えれば動くようになりますか?
#include <string.h> (省略) char fruits[64]; int kind; printf("どれが好き?\n1.リンゴ\n2.みかん\n3.バナナ\n"); scanf("%*d,%d",kind); switch(kind){ case 1: strcpy(fruits, "リンゴ"); break; case 2: (中略) } printf("あなたは%sが好きです",fruits);
別に fruits[0] = "リンゴ"[0]; 〜〜 fruits[6] = "リンゴ"[6]; fruits[7] = "リンゴ"[7]; break; でもいいけど。
大きさを宣言するんですね! うっかり忘れてました。thxです。
>>299 うっかり…なのか?
何だかchar型に文字列のポインタ入れようとしたり、基本的なことが分かってないように思えるんだが
302 :
デフォルトの名無しさん :2008/06/17(火) 09:33:14
>>286 BMPファイルを読み込んだ後にそのBMP画像を画面に出力すること
と言われて、BMPファイルをメモリに読み込ませることはできたんですけど
出力するプログラムがわかりません
303 :
デフォルトの名無しさん :2008/06/17(火) 09:37:10
>>286 BMP画像を読み込んで、その読み込んだBMP画像を画面に出力する
というプログラムを作成するのに、そのまま出力することができるんですか
BMP画像を読み込ませることはできたんですが、それを画面に表示
させる方法がわかりません
スレ違い
つまり「日本語なら俺に聞け(入門篇)」のスレへ行け、ということですね。わかりますた
問04(最終問題) テキストサウンドノベルを作成する事。 キー入力でメッセージを表示し、途中で選択肢を含める。(最大3つまで) 画面をスクロールさせることは禁止。ページ切り替えは、画面全消去で対処する事。 テキスト行数は、最低50行から最大100行までとする。 画面全消去方法は、先生に聞くこと。 これってCじゃなくC++ですか?
質問だけですが、分かる方お願いします。 cは拡張キーワードというのがありますが、 どういった場合に使用するのでしょうか? 具体的な使い方とか乗っているサイトありませんか?
>>308 拡張キーワードって __asm __stdcall などのこと?
それぞれが必要なときに使うんだよ。
使い方は処理系のマニュアルを読む。
>テキストサウンドノベル これはひどい
>>269 亀レスだが、その疑問はコンピュータサイエンスのプログラム意味論や
計算とは何かの範囲になるので、ここではスレ違い。
エレガントなコードを書くのに参考になるような本って何かありますか? Short coding以外で
>>177 > 変数ってprintfで表示できるしデバッガーでも表示出来るのはわかるのですが
> 計算して新しいものを入れるのにクリアしないのですか?
そうだよね、変数は値(を書いた札)を入れる箱だから、元の値が邪魔になるよね。
っていうアレではないか。
316 :
デフォルトの名無しさん :2008/06/17(火) 19:01:20
1つのスイッチと4個のLEDを使ってプログラムを作ろうと思っています。 スイッチを押すとLED1が点灯→もう一度押すとLED1に続いてLED2が点灯、さらに1回押すとLED3も点灯 というように押すたびに点灯するLEDが増えてくというものを作ろうとしているのですが、 まったくできません。 プログラムをどのように書くと1つのボタンでLEDが点灯する数を増やしていくことができるのでしょうか? こういう風に
どういう接続かしらんけど ポートに出力するデータに対して 最初は0 左シフトして1インクリメント を繰り返せばOKなんじゃない?
>>317 今は
while(1){
if (P2.DR.BIT.B0==0){
P1.DR.BYTE=0x01;
}
}
これでボタン押すとLED1が点灯する状態です。
>>ポートに出力するデータに対して
>>最初は0
>>左シフトして1インクリメント
この辺はどんな命令文で指示すればいいのでしょうか?
char outdata = 0; while(1){ if (P2.DR.BIT.B0==0){ P1.DR.BYTE=outdata<<1; outdata++: if (outdata > 4) outdata = 0; } }
>>319 詳しくありがとうございますw
char outdate=0;
の行でエラーが出るのですが、乱数使うときの#include<studlb>みたいな前置きみたいの必要なんですかね?
組み込みスレで聞いたほうがよくないか?
エラーの内容くらい読め
釣りだろ
>>321 まーIOポートも変数みたいに使えるようになってるからいいんでね?
>>320 char outdata = 0;
を
BYTE outdata = 0;
かな?
char型じゃないのかね?
それか
chara outdata;
outdata = 0;
のように行を分けないといけないとか
char outdata; outdata = 0; こうだorz
釣りじゃないですが
2500(E) ILLEGAL TOKEN: "char"
2225(E) UNDECLARED NAME: "outdata"
っていうエラーが出てしまいます。
>>324 さんのも試してみたのですが、BYTEでも同じエラーでした。
変数を定義できる場所とできない場所がある。
面倒だからこうするか P1.DR.BYTE = 0; while(1){ if (P2.DR.BIT.B0==0){ P1.DR.BYTE=P1.DR.BYTE<<1; P1.DR.BYTE++: if (P1.DR.BYTE > 4) P1.DR.BYTE = 0; } } でもP1.DR.BYTEって読み込みできるのかな?
{ char outdata = 0; while(1){ if (P2.DR.BIT.B0==0){ P1.DR.BYTE=outdata<<1; outdata++: if (outdata > 4) outdata = 0; } } } さらに面倒だからこうしちゃえば?
日立のSHCか?
H8/3664で遊んだときにどこかの会社の 無料の統合環境もこんな感じで組めたな。
たぶん制御系スレが一番詳しいはずってか初心者が組み込みに手出すのは無謀じゃないのか
>>328-329 >>P1.DR.BYTE++:
>>outdata++:
最後の点々はセミコロンじゃないとエラーでるけど:じゃないと意味ないんですかね?
ちなみにセミコロンに変えて実行するとLEDは点灯するけど点灯の仕方がランダムみたいになってます;;
>>330 日立のH8/3052Fです
>>333 あ、ごめんコロンになってたかな?
セミコロンに直してください。
ランダムというかウェイトいれないといくらマイコンって言ってもその程度の
ロジックならかなり早い点等を繰り返すはず。
なので変な点等になる。
点等orz 点灯ね
スイッチ押してる間ずっとP2.DR.BIT.B0が0だったりして。 制御系って適当に作りまくってると火を吹きそうなイメージなんだけど大丈夫なんだろか
>>336 多分タクトスイッチが押されるとアースしてるんじゃね?
あんまりよく読んでないけどP2.DR.BIT.B0はスイッチの入力か? 上のレスのソースだと、スイッチが0の状態ままだと、 ひたすらインクリメントなりシフトなりするだろうから 一回押すたびに点灯という動作にはならないんじゃないか? おそらく、スイッチがどちらかの状態になったらパパパパとつくだけかね。
よくわかんないけど、ボタンを放すまで待つとか、そういう処理はいらないのかな
{ char outdata = 0; char count = 0; while(1){ if (count == 0) { if (P2.DR.BIT.B0==0){ P1.DR.BYTE=outdata<<1; outdata++; if (outdata > 4) outdata = 0; count = 255; } } count--; } }
341 :
340 :2008/06/17(火) 20:54:13
応急策ね
{ char outdata = 0; char count = 0; while(1){ if (count == 0) { if (P2.DR.BIT.B0==0){ P1.DR.BYTE=outdata<<1; outdata++; if (outdata > 4) outdata = 0; count = 255; } } else { count--; } } }
本当はマイコンが持ってるタイマーとか使えばいいんだろうけど いきなりそれだと敷居があがるので、ベタなカウンターでやってみた。
突然ごめんなさい。 合計 50 49 48 47 46 *** 45 44 43 42 41 *** 40 39 38 37 36 *** 35 34 33 32 31 : 30 29 28 27 26 : 25 24 23 22 21 : 20 19 18 17 16 : 15 14 13 12 11 : 10 9 8 7 6 : 5 4 3 2 1 合計 *** *** *** *** *** を表示するプログラムって一次元配列を使ってどの様に書けますか? おねがいします
ずれた・・・すみません;;
>>345 できたよ
int main()
{
char s[] = " 合計\n 50 49 48 47 46 ***\n 45 44 43 42 41\
***\n 40 39 38 37 36 ***\n 35 34 33 32 31 :\n 30 29 28 27 26 :\n 25 24 23 22 21 :\n\
20 19 18 17 16 :\n 15 14 13 12 11 :\n 10 9 8 7 6 :\n 5 4 3 2 1\n合計 *** *** *** *** ***";
printf("%s", s);
return 0;
}
>>348 ちょっwwww カルーアミルクを噴出しちまったじゃねーかYO!
>>338 スイッチの入力です。
>>343 さん
試してみました。
スイッチを押す回数 LED
1回 ○●○○
2回 ○●●○
3回 ○●○○
4回 ●○○○
リセットしてやり直すと、また点き方が変わったりしてしまいます。
マイコンがダメなんですかね。
理想は
スイッチを押す回数 LED
1回 ○○○●
2回 ○○●●
3回 ○●●●
4回 ●●●●
なんですけど
351 :
343 :2008/06/17(火) 21:30:04
あーLEDってP1.DR.BYTEのどのビットに接続されてるかわかる? それ確認してなかったよ
>>348 ああ驚いた
>>348 の前がどこかわからんけど
const char table[] = {0x00, 0x01, 0x03, 0x07, 0x0f}:
count = 0;
count = (++count % 5);
P1.DR.BYTES = outtable[count];
テーブルがシンプルだったりして・・・
>>351 ○○○● P1.DR.BYTE=0x01;
○○●● P1.DR.BYTE=0x03;
○●●● P1.DR.BYTE=0x07;
●●●● P1.DR.BYTE=0xf;
こういうことですか?
>>353 あー
まあそれでOKです。
シフト演算が思惑通りに動いてない気がする(私の勘違いの可能性大)
ので
>>352 のような配列で持ってたほうがいいかも
<<345 できたお #include <stdio.h> int main(){ int a,b,z,i,d; int c=50; //1行目から10行目 printf("\t\t\t\t\t\t合計\n"); for(a=0; a<10; a++){ for(b=0; b<5; b++){ i += c; printf("\t%d",c); c--; } printf("\t%d",i); printf("\n"); d += i; } //11行目 printf("合計"); for(a=0; a<5; a++){ for(b=1; b<11; b++){ c += 5*b; } printf("\t%d",c); } printf("\t%d",d); scanf("%d",z); }
357 :
355 :2008/06/17(火) 22:21:10
配列使ってないうえに合計がめちゃくちゃだった スマソ
358 :
355 :2008/06/17(火) 22:28:05
>>354 {
char outdata = 0;
int sw_cur = 1;
int sw_prev = 1;
while(1){
sw_cur = P2.DR.BIT.B0;
if( !(sw_cur ^ sw_prev) ) continue;
sw_prev = sw_cur;
if( sw_cur == 0 ){
P1.DR.BYTE = outdata << 1;
outdata++;
if(outdata > 4) outdata = 0;
}
}
}
>>359 ああ、すまん。こうだな。
if( sw_cur == 0 ){
P1.DR.BYTE = (1 << outdata);
outdata++;
if(outdata > 4) outdata = 0;
}
>>353 のようにしたいなら、たしかH8はI/Oにバッファが
あったような気がするから
P1.DR.BYTE |= (1 << outdata);
すりゃいいんないかな?
できなったら、もうひとつ変数用意すりゃいい。
>>345 #include <stdio.h>
#define TOTAL_NUM 50
#define COL 5
int main(void){
int i, c=TOTAL_NUM, tmpsum=0, colsum[COL]={0};
for(i=0; i<COL; i++){printf("\t");}
printf("\t合計\n");
for(; c>0; c--){
printf("\t%4d", c);
colsum[(TOTAL_NUM - c) % COL] += c;
tmpsum += c;
if((c % COL) == 1){
printf("\t%4d\n", tmpsum);
tmpsum = 0;
}
}
/*最終行*/
printf("合計");
tmpsum = 0;
for(i=0; i<COL; i++){
printf("\t%4d", colsum[i]);
tmpsum += colsum[i];
}
printf("\t%4d\n", tmpsum);
return 0;
}
昨日相談したものですが、今日会社からほかのメンバーは皆開発に 行くけどわたしだけテスト要員として来月から配属されることに 決まったそうです。 多分、辞めろっていうことなんでしょうね。 なんで自分だけわかんないのか悔しいけど、頭の構造が違うんで しょうね、こういうのがわかる人は。
お前を採用したのは会社なんだからお前を活用する責任も会社にある 黙って居座ってればいいのだ
給料くれるなら別に良いよ 気にスンナ
自信がないっていってたんだし、そのままいきなり開発に 放りこまれるよりは親切なほうだと思うけどなあ。 テストの間に勉強すればいい。
テストってデバッグ要員のことだったのか 資格試験でも受けてるのかと思った テスト要員でも雇ってもらえるならいいじゃないか 辞めろって言われるまで居座ってやれ
会社に行ったらテスト要員になった 辞めろってか
辞めろよ
多分、若干おかしくなりかけていたから講師から人事に相談されてたっぽい ですね。スレ違いなのでもう終わります。 教えてくれた人、ありがとうございます。 プログラムがちゃんと書ける人って自分のやってることを説明できて親切で すね。ほうんとうにありがとうございました。
しかし開発要員に採っておいて使えないのにクビ宣告しないなんて 世の中良心的な会社もあったもんだね つまり当たりを引いたわけだ
ワシは単にコネでねじこまれたという説を推すよ
俺が新人の頃は同期に全然できない奴がいて、そのうちのひとりは研修中に辞めたよ
まあ開発部隊に入りたいならゆっくりでもいいから勉強することだねー
入らないほうが幸せにはなれるかもな
ゆっくりしていってね(AA略)
公務員はプログラミングできるのか? 医者はプログラミングできるのか? 弁護士はプログラミングできるのか?
趣味でプログラムできる人もいるんじゃね?
仕事でそういう二足のわらじを履いてる人は結構いるよ 有名どころだとLZHの作者はお医者さんだったっけ
森田将棋の人も医学部だったね 医師免許はとってないのかな
382 :
デフォルトの名無しさん :2008/06/18(水) 20:40:56
文字列の入力を促し、入力。 その文字列の先頭の文字と同じ文字が文字列の中にいくつふくまれるかを求めるプログラム。 先頭の文字も数のうちに入れる。 (ポインタを用いる) お願いします
384 :
デフォルトの名無しさん :2008/06/18(水) 20:43:33
ここはC言語を学ぼうとしている人のためのスレです 情報処理の単位が欲しいだけの人はお帰りください
386 :
デフォルトの名無しさん :2008/06/18(水) 20:46:55
ばればれの自演は逆効果w
388 :
デフォルトの名無しさん :2008/06/18(水) 20:49:45
文字列の入力を促し、入力。 その文字列の先頭の文字と同じ文字が文字列の中にいくつふくまれるかを求めるプログラム。 先頭の文字も数のうちに入れる。 (ポインタを用いる)
大学で資格の関係でどうしてもC言語をやらなければなりません どうしてもわからない問題があるのでどなたか教えてください 問題1 三角形の底辺の幅、あるいは段数(どちらか一つ)を入力すると、逆三角形を表示する。例えば、底辺5あるいは段数3を入力すると ***** *** * となる。 2 下記のように横と縦の累計を計算して表示する。 配列は使わないこと。 3 10個以下の任意のn個(データ数は入力)のデータを入力し、逆順に出力する。 実行結果は奇数と偶数個の例を示すこと。 4 下記のように横と縦の累計を計算して表示する。 ただし、1次元配列を使うこと。 どの問題でもかまいません 本当に困っているので教えてください
>>382 #include <stdio.h>
int main(void)
{
/* 入力された文字列を収めるためのcharの配列を宣言 */
/* その他の必要な変数を宣言 */
fputs("please input a string : ", stdout);
/* fgets()を使ってcharの配列に入力された文字列を格納 */
/* 文字の数を数えるint変数を0に初期化する */
/* charへのポインタにcharの配列の先頭の文字を指させ、
chraへのポインタが指している先の文字が'\0'でない間、
charへのポインタを1ずつ文字列の先へずらしながら、
以下の処理を繰り返す */;
/* もしchraへのポインタが指している先の文字が
charの配列の先頭の文字と等しければ */
/* 文字の数を数えるint変数を1増やす */
/* printf()を使って文字の数を数えたint変数の値を表示する */
return 0;
}
391 :
デフォルトの名無しさん :2008/06/18(水) 20:55:59
C言語始めて2ヶ月でこんなもんだいだされました。 文字列の入力を促し、入力。 その文字列の先頭の文字と同じ文字が文字列の中にいくつふくまれるかを求めるプログラム。 先頭の文字も数のうちに入れる。 (ポインタを用いる)
>>1 を読んでください
それでわからないようならあなたの日本語力と知性は壊滅的なのでおとなしく退学することを勧めます
ああそうですか。 マルチ視ね
>>382 #include<stdio.h>
#include <stdlib.h>
int main()
{
int *c, count = 1, i;
c = (char *)malloc(1);
puts("入力どうぞ");
if ((i = getchar()) == EOF) {
printf("ちゃんと入力しろ\n");
exit(1);
}
while ((*c = getchar()) != EOF) {
if (i == *c) count++;
}
printf("%d\n", count);
return 0;
}
できました
これはひどい(笑
>>382 #include<stdio.h>
#include <stdlib.h>
int main(void)
{
int *c, count = 1, i;
c = (int *)malloc(1);
puts("入力どうぞ");
if ((i = getchar()) == EOF) {
printf("ちゃんと入力しろ\n");
exit(1);
}
while ((*c = getchar()) != EOF) {
if (i == *c) count++;
}
printf("%d こです\n", count);
return 0;
}
すいませんこっちでした
どっちも微妙にまちがってんじゃねえか
だめだこりゃ
故意だろ
>>382 有限長の文字列を総当りで生成して、それをコンパイルしていくプログラムを作れば
そのうち自分が作りたかったプログラムが自動生成されるんじゃね?
そして自分が作りたかったプログラムかどうかを 判定するプログラムが要るという話になるんですね分かります
404 :
デフォルトの名無しさん :2008/06/18(水) 21:44:13
故意はかんべん
なんだこのviper的なノリはwww
>>389 どうしても分からないなら資格取れるわけないじゃん
なんかおかしくね?
恋はかんべん
409 :
デフォルトの名無しさん :2008/06/18(水) 23:28:46
関数を呼び出す時って他の文字に置き換えてから使えたほうがいいんですか? 例えばadd関数を呼び出してif文に入れるときの場合 x=add(n); if(x==1) みたいな感じか if(add(n)==1) どちらがいいんでしょうか? 下のほうでやっていたら友達にそのやり方は見にくくてありえないしプロがそんなことやったら確実に怒られるといわれたんですがどうなんでしょうか?
場面にもよるが、ステップによるデバッグがしづらいかもしれない。>後者
いや好きにすればいいと思うよ ただ、関数の結果を他にも使う予定があるなら上の方が良いんじゃない?
412 :
デフォルトの名無しさん :2008/06/18(水) 23:36:20
できる限り前者でやったほうがいいんですか? 習ってる途中で後者の方がわかりやすいと思ったのですがプログラムできる友達に言われたので…
>>409 その関数が非常に高コストで、その判定部がループの中にあるなら
よくないなあとは思うけど、そうでないなら別に気にしない。
その友達がプロで怒られた経験があるのであれば、もう少し細かい
理由を教えてもらえばいいんでない?
414 :
デフォルトの名無しさん :2008/06/18(水) 23:40:21
ほかにも使うというのは x=add(n); if(x==1) if(x==2) みたいな感じですか? あとプログラマーみたいな人たちの間ではどちらが主流なんでしょうか?
ちなみに、プロになれば周りのコードにあわせるということのほうが大事。 優劣をつけられない記法の差において、俺はこうすべき!って一人で 走ってるなら怒る。
>>409 その友達がどの程度のプロなのかはこの際置いておくとして、どちらがいいとか悪いとか言うことはない。
明確なことは、前者は変数を一つ使用し、後者は使用しないということである。
add() の返す値をただ一回しか評価しないのなら、後者のように書いて何の問題もない。
値を何度も評価するのなら、前者のように一時変数に格納する必要があるか、なくても効率がいいかもしれない。
後は単なる好みの問題である。
文脈によるがこの場合はどちらでもいい。 ところでこのお題はホントはこうじゃなかった? x = add(n) ; if (x == 1) と if ((x = add(n)) == 1) の比較。
418 :
デフォルトの名無しさん :2008/06/18(水) 23:42:40
>>413 友達はプロではありません
普通に大学生なので…
多分趣味でやってる程度だと思います。
どこで習ったかはわかりませんが
値を使い回したい場合に変数に入れるのは当然として、 そうでない場合はメリットとデメリットがあるので好きにすればいいと思うよ。 ○ メリット ・ 関数呼び出しが長い場合、読みやすくなる ・ デバッグ時に戻り値が何だったか分かりやすい ○ デメリット ・ その場でしか使わないような無駄な変数が広いスコープ上に現れてしまう場合もある
慣用句的なもの if ((fp = fopen(〜)) == NULL) Is系のメソッドに代表される真偽返却メソッド if (isalnum(〜)) これ以外は大抵分けて書くようにしてるね。 多少冗長に思えても、他の人が読みやすいか、また、 誤解を与えにくい書き方になっているか、それを重視してる。
誤解を与えにくいように、というのはあまりメジャーではない二項演算子を 使う時などに、冗長ではあるが、括弧をつけて明示するようなことね。 ちゃんと知ってればその括弧が無くても正しく動作する事は理解できるが、 うろ覚えの人でも勘違いを起こさない。 もしかしたら研修明けの新人がメンテするかもしれないし。
>>418 ある程度理解できたと思っている頃、自分の中で勝手にスタイルが
確立されているのはよくあること。
その時、自分のスタイルとは異なる、または理解できない書き方を見ると
「なんだこの一般的ではない書き方は!俺流に直す!」
と思ってしまうこともまた、よくあること。
どんなスタイルでも読めて、それに合わせてかけるようになって一人前かな。
命名規則なんかは特に… 英語、ローマ字、dwほにゃらら、アンダースコア区切り
しかし !strcmp だけは真似しようと言う気になれない
英語で名前付けようとして辞書引いてみて調べた結果 単語が長かったりすると何か使いにくくて困ったりする そんな俺
そういう場合は適当に略すけど、 略すとわかんねえんだろうなあって単語の時は悩む。
直感で分かりにくい(もしくは分からない)単語を使うよりは いっそローマ字にした方がいいと思う俺
なんとなく先頭3文字を使って略してるけど、structもstringもstrだから困る
word とか list とか簡単な名前をつけたい時にも悩むオレ
430 :
デフォルトの名無しさん :2008/06/19(木) 00:16:11
>>422 では自分の書きやすいように使い分けてればいいんですかね?
実際に使うようになったら周りにスタイルを合わせていけばOK?
ってかc言語って仕事で使うことあるんですか?
c言語は入門にはいいけど実線向きではないということお聞いたんですが
>>430 戦線によると思いますよ
局地戦ではCが現役です
>ってかc言語って仕事で使うことあるんですか? お前の顔が変形するまで殴るぞ(半田ごてで
433 :
デフォルトの名無しさん :2008/06/19(木) 00:18:31
>>430 XPみたいな資源が有り余ってる環境でのソフト開発ならわざわざCで作らないんじゃないかな
電気屋とか電話屋みたいな旧役所系のシステムだと今でも余裕でC使ってる場合がある
別にCに拘る必要は無い。アルゴリズムや手法など、そういった点が重要。
勘定系のCOBOLはそろそろ駆逐されはじめたと聞いた
勘違いしてそうだから言っとくけど C++なら超いろんなとこで現役
439 :
デフォルトの名無しさん :2008/06/19(木) 00:22:58
あとmain文で強制終了するときにreturn 0はあまり使わないほうがいいといわれたんですがどうなんですか?
正直どーでもいい
>>439 一般的には main の返り値は正常終了のときに 0 を返すことが多いから
442 :
デフォルトの名無しさん :2008/06/19(木) 00:25:30
なんかreturnは関数を返すのに使うからmain文では使わないほうがいいといってました。
>>439 exitを使ったときや、mainの戻り値が0以外だったときに
特別な挙動をするシステムだと、その流儀に従ったほうがいいけど
普通はexitを使わなくても、常に0を返しても問題ない
>>442 それは例の友人が言ってたのか?
悪いことは言わないからそいつの言うことは話半分に聞いとけ
>>439 どこらへんが強制なのか知らないけど、慣習的に0は正常終了
他人の目を気にするなら1でも返してお茶を濁しておけばおk
>>439 ケースにもよるし、現場の考えにもよるし、いろいろだねえ。
自分で書いてるプログラムだと使ってるなあ。
ある程度の大きさの物書いてるとmainなんて全体の流れを制御する程度だし
強制終了する場合はおおよそプログラムのエラーで停止か、機能を止める
ような感じなのでさほど問題ない。
>>430 特に指定が無く、一人で書き上げるソースであれば、インデント
スタイルも含めて一貫性が保たれていればとりあえずはOKかな。
繰り返すけど、自分のスタイルが最善とは思わないようにすること。
仕事でも使うよ。
PerlとかJavaとかC#とか、便利な面が多く、目的の機能を実装するのは
はやいけれど、実行速度は遅い。Cは逆ね。
業界でVBが空前のブームになったのは習得しやすく、出来上がるまでが
とにかくはやかったからです。
んで、習得したてのVB戦士が書き散らかしたコードをメンテする羽目に
なった現場が火を吹くわけです。
>>439 さすがにそれはちょっと記憶違い起こしてると思われる
そうじゃなきゃその友人はわかってのに語っちゃうかなり駄目なひとだぞ
449 :
デフォルトの名無しさん :2008/06/19(木) 00:31:55
>>442 はい 同じ人です。
正直その人がどこまでプログラムができるのかはわかりませんが
僕はまったくやったことがないのでどれが本当なのかわからないので
まあmainを再帰呼び出しすることまで考えてるなら もちろんabort()しなきゃだめだけどそういんじゃないだろうな
451 :
デフォルトの名無しさん :2008/06/19(木) 00:33:44
細かい言いまわしをすれば、 stdlib.hにEXIT_SUCCESSが0として定義されてる処理系では、 異常終了時に0を返すべきではないね。 んで、半田ごてが必要な世界はほっといて 大抵は0なんで、異常終了時は0返さないほうがいいかなー。 /* ゴメンね、ハード屋さん愛してる。仲良くしてね */
参考までに main() とプログラムの終了の仕方について詳しく知りたいなら <stdlib.h> の abort() と atexit() と exit() の仕様を読んでみることを勧める
>>439 exit(EXIT_FAILURE); があるじょのいこ
珍しく健全な流れで逆に吹いたw
456 :
デフォルトの名無しさん :2008/06/19(木) 00:38:55
みなさんありがとうございました。 またくると思うのでよろしくお願いします。
>439 理想的な書き方ではないけど、意味をわかって使ってるなら問題ない どうせ今の段階ではmainやプログラムの戻り値に意味なんか持たせてないし、atexitも使ってないだろう そういうことが必要になったら必然的にそう書かざるを得なくなるからそのとき覚えればいい
>>455 ここは時々そうなるよ。
ちょっと前だと、配列の扱いだっけ?
ポインターに格下げだとか・・・あれは荒れた感じだったけど
ポインタに格下げ(笑)
業界入ってすぐに行った現場ではRET_OKとRET_NGが定義されていたなあ。 当時の俺はEXIT_FAILURE EXIT_SUCCESSを知らなくて、なんも疑問に 思わずそれで組んだけど。 痛いのが治らない会社とはいわれるが、納得だわ。
… 式中に現われる「Tの配列」型のオブジェクトへの参照は(3つの例外を除いて)、 配列の最初の要素を指すポインタに意味が格下げになる。 結果としてできるポインタの型は「Tへのポインタ」となる。 (3つの例外とは、配列がsizeofのオペランドとなるとき、 アドレス演算子&のオペランドとなるとき、 char型の配列を文字列リテラルで初期値するとき、を指す。) … by C Programing FAQ Q.6.3
>>452 EXIT_SUCCESSが0でないことって有り得るの?
平林さんのANSI C言語辞典では0って言いきっているけど。
と、ここまで書いたところで、X3010:2003開いてみたら、
確かに0でないといけないとはどこにも書いていない。
知らなかった。
その時の論争は「格下げ」の内容をうまく説明できなかったことに 原因があると思うよ。
>>460 RETは戻り値全般っぽいから、EXITの定義(0が正常、0以外が異常)とは違うかもしれんよ。
>>464 ごめ、語弊あったね。
mainを含む関数すべての戻り値として使ってたんだ。
そういえばmainの戻り値を意識するのってどんなのがあるんだ? コマンド処理系で使うバッチとか?
>>467 既に出てるけどmainを再帰呼び出しするときや、実際にシステムで戻り値を使う場合
>>467 うん。シェルスクリプトとか。
コマンドラインでも foo && bar と書けばfooが成功した場合のみ
barが実行されるので、たまに便利。
expr を忘れてもらっちゃ困るな
>>449 その友達のようなヒトノコトを半可通と呼びます。
これまでの流れで、かなりいい加減な事ばかり言っているね。
printfで出力桁数を.0のように整数部分だけにした場合は小数の部分は切り上げですか?四捨五入ですか?
切り上げも四捨五入もないよ 単純に表示桁を変えてるだけだから
#include <stdio.h> int main(void) { double a=1.555,b=1.445; printf("a : %.0lf / b : %.0lf \n",a,b); printf("a : %.1lf / b : %.1lf \n",a,b); printf("a : %.2lf / b : %.2lf \n",a,b); return 0; } やってみた。なんだかなぁ。
つまり切り捨てってことか。
切り捨ててるんじゃなくて、整数部分だけ表示してる 小数点第n位まで計算しなさい、という算数の言い回しを思い出すといいよ
477 :
472 :2008/06/19(木) 02:10:46
自分の環境だと%fのままある数入れたら2999.5で%.0fにしたら3000.0になったので聞いてみたんですが……
>>477 先にそれを言え
あと自分の環境も詳しく
今VC++ 2008 EE で試してみたら 3000になった
481 :
472 :2008/06/19(木) 02:17:36
XPでコンパイラはBorland5.5です。
>>474 さんのもコンパイルして試してみたんですがやっぱりどういう風に処理されてるのか謎すぎます…
色々試してみたが %0.1fで 2999.95だと 2999.9 2999.96だと 3000.0 四捨五入って訳でもないのか?
誤差が出てるんだろ
そういえば浮動小数点の場合、この間宿題スレで見たんだと 思うけど、誤差の許容範囲云々を扱うのがあったなあ パイとかそういう方向の読み方で・・・なんだっけかな?
ヘルプには >精度指定では出力値が切り捨てられたり、浮動小数点数が丸められたりすることがあります とは書いてあった
%fは捨てて、%gを使おう。 # いや、勿論%fでないといけない場合は%fでいいが。
丸め処理の詳細は処理系依存 マニュアルを読めば書いてあるはず
そういえば、EXIT_SUCCESSとEXIT_FAILUREはstdlib.hにあるけど、 TRUEとFALSEは標準ヘッダーでは提供されてないのね。何か理由があるの?
>>489 標準関数の返り値はTRUEやFALSEじゃないからでしょう
stdbool.hにtrueもfalseもありますね。
boolean型自体が存在しないからか
493 :
デフォルトの名無しさん :2008/06/19(木) 16:18:46
#define BEGIN { #define END } こんな書き方する人って実在するんですか?
伝説です
都市伝説だと思いたいけど、実在したんだろうね。
Cが出始めのころ、PASCALから抜けられない人がやってたなw IBMでも堂々とやってた気が
その発想はなかった
IBMのメインフレーム端末のキーボードに { や } がなかった。 トライグラフを使うよりBEGIN ENDにした方がわかりやすかった。 #define BEGIN ??< #define END ??> だったかなぁ
??=include<stdio.h> main() ??< printf("hello world !??/n"); exit(0); ??> 昔の人は苦労したのだな
英小文字が使えないターミナルもあったので 全部大文字を使った場合は大小文字を区別しないといった約束事もある。 どれもCの規格にまだ含まれているから手持ちのコンパイラで コンパイルしてみるとできるはず。VC++2008でもできた。 ??=INCLUDE<STDIO.H> MAIN() ??< PRINTF("HELLO WORLD !??/N"); EXIT(0); ??>
コンパイラ屋さんも大変だな
gcc -trigraphs でトライグラフは使えたが大文字INCLUDEでつまった。 そんなのがあるなんて全然しらなかったなあ。
>>503 精度についてなにも言ってないのでdoubleでも使っとけば?w
ハードウェアが許す限りの可変長整数演算ができるライブラリどっかになかったっけ
長任意精度数値計算ライブラリ。 CではないがJavaのBigDecimal/BigIntegerはよく出来てるからお勧め。
使ったこと無いけどmathematicaはどうなの?
ソースコードないじゃん
maximaでおk
mathematica大学のライセンスでただだから使ってるけどぜんぜん使いこなせねー
基本情報処理試験のc言語の問題を実際に打って 動かしてみたいのですが、どうすればよいでしょうか?
まずエディタを起動します
服を脱ぎます
ワッフルワッフル
コンパイラを入手しましょう
ソースを読む力をつけるためにはどういうところに気をつければよい?
>>511 とじゃいが、基本情報とかの試験で穴埋めとかをとくコツ
みたいなのはなんかある?
スレちだったらスマソ。。。
まずソースを読む力の意味を定義してくれ とか言うようなことを普通に考えるようになることかなぁ
基本情報程度なら選択肢先に見ればできない人でもなんとなく流れがわかるかと ソースを読む力は反復や考えようとする頭が無いと元が低い人は付かないな 好奇心持って色んなコード見る、書くのが一番だと思う
とりあえず、基本を理解することやなぁ。 ソースの書き方も、部分部分をしっかり分けて記述できるようになると 後でどこが問題か?部分部分で検査することも出来るしね。 いわゆるモジュールってやつ。あとは、そのモジュールを幅広く 流用できる汎用性を考慮して書けると良い。
自分の書いたコードですらしばらくいじってないとわけがわからなくなるからな コメントは大事だとわかってるが書いてるときには手抜きしてしまう
UTF8 のファイルから1行ずつ読み込み、半角スペースが入っている にもかかわらず if(str[textPointer]==TEXT(' ')) でひっかかってこねー。なんで?
みるみるコード力UP
TEXT って・・・
cソースのいたることろに同じロジックを入れ込むようにするにはどうすればいいんだろ? 本来なら関数で分離するようなロジックをわざと入れたいような時です。
527 :
521 :2008/06/20(金) 07:45:25
if(str[textPointer]==' '){ も試したけどダメ。 if(str[textPointer]==_T(' ')){ も試したけどダメ。 if(str[textPointer]=='a'){ としたら a がある時はちゃんとひっかかってくる。スペースの時 だけひっかかってこない。 if の行に行く前に、何が str[textPointer] に入っているのか こんな感じ wsprintf(szTrash, TEXT("a %c b"), str[textPointer]); MessageBox(NULL, szTrash, TEXT("デバッグウィンドウ"), MB_OK); で表示させてみたら a とだけ表示された。str[textPointer] にスペース以外が入っている 場合は正常に表示される。たとえば z が入ってたら a z b と表示される。わかる人、助けてくれ。
528 :
525 :2008/06/20(金) 07:49:59
>>526 マクロで可能なんですかね?
まあやろうとしてることは有効期限つきで機能を提供したい場合に
関数などの一箇所で日付チェック処理しちゃうとバイナリレベルで
書き換えられたらアウトなので、いたるところに埋め込みたい
というのが理由なんです。
>>528 どうせ日付そのものをごまかされるからムダなんじゃw
>>529 それは別にいいんですよ。
毎回手間が伴いますので。
一箇所で処理してるとバイナリレベルでばれればおしまいなので、それさえ回避できれば。
#define HOGE(a,b) {\ int i;\ for (i=0; i<a; i++) {\ printf("hello world 1! %d\n", b);\ printf("hello world 2! %d\n", b);\ printf("hello world 3! %d\n", b);\ printf("hello world 4! %d\n", b);\ printf("hello world 5! %d\n", b);\ }} マクロはこんな風に\改行でつないでいけばやりたい放題ぞよ
>>527 wsprintf(szTrash, TEXT("a %c b"), TEXT(' '));
wsprintf(szTrash, L"a %c b", L' ');
こういうのもダメなわけ?
>>531 おーありがとうございます。
関数のように処理を入れたい場所に書いておけばインライン展開してくれる
ってことなんですかね?
534 :
521 :2008/06/20(金) 09:12:41
>>532 wsprintf(szTrash, TEXT("a %c b"), TEXT(' '));
wsprintf(szTrash, L"a %c b", L' ');
は両方ともオーケーでした。このように表示されます。
a b
とりあえず HEX を見ようと
wsprintf(szTrash, TEXT("a %x b"), str[textPointer]);
ってやってみて Hex を調べたら 0 になってた。「0ってなんじゃ?」
って思って UNICODE表で調べてみたら NULL ってことがわかりました。
なんでスペースを入れたら NULL が入るんだろ。わかる人、助けてちょーだい。
つーかUTF8のスペースとコードが違うんじゃね? C言語でスペースのままだとアスキーコードで処理され0x20になってるんじゃね? 試しにcharでスペースを与えて、sprintfあたりで16進数表示してみ?
普通に考えると、strを読み込むのに失敗してるんじゃないの
537 :
521 :2008/06/20(金) 09:31:45
>>535 その可能性も考えたが、テキストファイルにスペースがあったらその
スペースが 0x0 に変換されるから、関係ないってことがわかった。
scanf系の %s で読んでいたというオチですね、わかります
わけわからん 環境書け
540 :
521 :2008/06/20(金) 09:39:46
>>538 fp = _wfopen(fullPathAndFileName, TEXT("r"));
ってやって
while(fwscanf(fp, TEXT("%s"), str) != EOF){
で読んでるが、これって問題ありってこと?
無知な俺に教えてほしいんだけどTEXT()ってなんだ
問題大有り。 関数の仕様をちゃんと読め。
543 :
521 :2008/06/20(金) 09:48:57
>>542 仕様を読んでくる。つまらん質問をしたようでスマン。
%s指定子は空白を読むとそこで停まる
>>535 C言語と関係ないけど一応いっとくと
UTF-8はASCIIにある文字はそのまんまのコードになる
どうして初心者は一足飛びに難しいことをやろうとするんだ
>>541 環境によって、 "" と L"" を切り替える。
環境つーか、defineか
_wfopenの場合はL""だな TEXT("")使っちゃ駄目だろ
>>534 >ってやってみて Hex を調べたら 0 になってた。「0ってなんじゃ?」
>って思って UNICODE表で調べてみたら NULL ってことがわかりました。
っ「文字列とは何ですか。」
>>530 何箇所あったって同じものを置くんじゃ、機械的に検索・置換でおしまい。
554 :
デフォルトの名無しさん :2008/06/20(金) 15:59:11
なぜgif それはおいといて while(1){ /*前処理*/ if(strcmp(tanto, "end")==0) break; /*表示処理*/ }
556 :
あ :2008/06/20(金) 18:33:39
繰り返し処理についてなんですが 【問題】数値(整数値)をキー入力して、その数だけ「#」を表示する処理。 【実行例】 表示回数は?8 ######## このプログラムを作れというのですが正解はどう書けばいいのですか? アホですみません、お願いします。
>>549 for入りだからまず展開されないんじゃね?
全然関係ない話なんだけどさあ、検索するじゃん。検索。googleとかで。 それでさあ、くだらないブログが腐るほど引っ掛かるんだよね。 知ったかとか、出鱈目とか鵜呑みにしたような内容の馬鹿ブログ。 いや、早い話がお前らブログ辞めろって。 いや、それだけなのよ。まじで。お願いだから辞めて下さい。 資源の無駄、そして多くの人、社会の利便性と生産性を根こそぎかっさらってますよ。お前達
検索エンジンの使い方が分からないだけ
561 :
デフォルトの名無しさん :2008/06/20(金) 21:22:24
初心者ですが While(1) としたらは無限ループになりますか?
釣れますか?
>561 内部に脱出する部分がなければなる
マクロかもしれないぜ
C とは限らない。 BASIC かもしれない。
>>564 何が?
内部に脱出する部分がなければ無限ループになるのは当然だろ?
釣りか? C は大文字小文字を区別するんだぜ?
ヒント:内部とは何の内部だろうか
ギャグの解説をするようなまねはやめてくれ恥ずかしい
おっさん IN JAPAN!!!!!!!
ごめん誤爆
574 :
デフォルトの名無しさん :2008/06/20(金) 22:45:41
Πの近似値を求めるプログラム教えてくれ
super pi
>>574 これを計算すればいいよ。
4 * ( 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ・・・
そんな収束の遅いものをw
>>554 _tを_hyoとかretu_に書き換えればグンと読みやすくなるんだぜ
それだと頭悪そうだからrowとかcolumnにしてやれよ
学生の頃はrowとcolumnをよく取り間違えたものです。 hyoのかわりにtableで。 変数名が長くなることに対して何もためらわないように
せっかくローマ字なんだから統一しようぜ
雹とか烈とかそんなのしか思い浮かばなかった俺はどうすれば
row/column じゃなくて row/col にすると文字数揃って読みやすくなる箇所が増えるよ
>>584 そこまでは正しい判断だ。check関数をよく調べてみるんだ。
586 :
デフォルトの名無しさん :2008/06/21(土) 09:02:49
アルファベットをn文字分ずらす関数なんです。*str + nでn文字ずれるがzからaにいかないことはわかるんですが*str = 'a' + (*str - 'a' + n) % 26; のとこがよくわからないので教えて頂けませんか? void encrypt(char *str, int n) { while(*str) { *str = 'a' + (*str - 'a' + n) % 26; str++; } }
%の意味はわかってる?
>>585 解決しました
分かってみると簡単なところですね
ありがとうございました
589 :
デフォルトの名無しさん :2008/06/21(土) 10:42:17
まず、*str-'a'の部分で、文字(a〜z)を、aからの距離に変換している。 で、+nで移動。だけど、a-zは26文字しかないから、超えた分は折り返すように %26してる。あとは「aからの距離」を文字に直すのに+'a'しておしまい。
591 :
デフォルトの名無しさん :2008/06/21(土) 10:57:27
>>590 そういうことですか。ありがとうございました
0x20と32と' 'が同じなのはどういう理由なのでしょう。 使いかたは理解していますが、背景が知りたいです。
人に宿題やらさせてるだけじゃねえか?
0x20と32が同じだって理由を知らないで、使い方を理解してるかっていえるのか。
>>592 040 が仲間になりたそうにしています
catコマンドを書いているんですけど、 if (argc == 1) { do_cat(stdin); } else { for (i = 1; i < argc; i++) { /* 処理 */ } } のelse文以下の処理はコマンドラインで指定されたファイルを読んでいくのですが、 else文を用いてその中にfor文を書くのか、else文を用いないでそのままfor文を書くのか、どちらが優れていますか?
>>596 優れているかではなく、読みやすいかで判断すべき
フォルダの中のある拡張子を持つファイルを読み込んで順次処理をしていきたいのですが、フォルダの中にあるファイルを検索する関数や処理などの方法はどのようなものがあるのでしょうか?
>>598 環境がわからないと答えられない
とりあえずWindows用
FindFirstFile
FindNextFile
POSIX用 opendir readdir
mallocで動的に確保したメモリを開放しないでプログラムを終了したらどうなりますか?
環境によるかもしれないけどかなりの確率でmallocを発行したプログラムが 終了すると開放される。 まあこれにはからくりがあって、プログラム起動と同時にプログラムにいくらかの メモリを割り当てて、プログラム内部からmallocを発行すると起動時に割り当てられた エリアから確保したりしてるらしい。 なので、プログラムがfreeせずに終了してもシステムは最初に割り当てたエリアの アドレスとかは知ってるので自動で開放される・・・ でもmallocの管理もできないと大きなプログラムになってくると 実行中にメモリが確保できないとかでこける可能性もでてくるんじゃね?
ファイルの末尾に'\n'がないってどういうケースですか?
ファイルの末尾に'\n'がない場合、としか
>>603 そういうファイルもあるから、きっちり対応しよう
いやちょっと管理ミスあったときどうなるのかな〜とか気になって・・・
2chのログにもなかったきがするぜ!
Win XP Home SP3 最近Borland(コンパイラ)とC言語を始めよう!(エディタ)から Microsoft Visual C++ 2008 Express Editionに変えた 前者の場合だとボタンを押せばコンパイル・実行できたんだけど VC++でもボタン押したらコンパイルするようにできない? 今の設定はメニュー->ツール->外部ツールに追加して そのボタン押したらcmd起動+path設定されて cl Filename.cって手打ちしないといけない 作業ディレクトリはCファイルが保存してある所
画面の上の方を良く探せ
>>608 はプロジェクトを作ってないのだと思われる。
単に *.cを開いただけ。
とりあえずヘルプを読むなり、サイトを当たるなりしようや
#include <stdio.h> #include <stdlib.h> void sub(int *p){ int *i; i = (int *) malloc(sizeof(int)); *i = 100; p = i; } int main(void){ int *ip; sub(ip); printf("%d", *ip); return 0; } 100じゃなくて0が表示されるのはなんで?
>>612 void sub(int **p){
int *i;
i = (int *) malloc(sizeof(int));
*i = 100;
*p = i;
}
かな
sub( &ip ); // 呼び出すところはもちろん
あぁ、そういうことか。d
この場合大した問題は無いんだろうけど malloc使ってfreeしてないなんて
617 :
デフォルトの名無しさん :2008/06/21(土) 16:29:56
C言語でグラフィック表示とかできるの? C初めてあんま経ってないからよく分からん。
#include "stdafx.h"
using namespace System;
int main()
{
String^string1,^string2;
Console::Title="初めてのプログラム:");
Console::Write("性を入力してください:");
string1=Console::ReadLine();
Console::Write("名を入力してください:");
string2=Console::ReadLine();
Console::WriteLine("姓名は:"+string1+" "+string2);
return 0;
}
エラーなるんだけど、どこおかしいんですかね。
一応ここ参考にしてるんだけど、
ttp://homepage3.nifty.com/ishidate/vcpp08_1/vcpp08_1.htm
全然関係ない話なんだけどさあ、検索するじゃん。検索。googleとかで。 それでさあ、くだらないブログが腐るほど引っ掛かるんだよね。 知ったかとか、出鱈目とか鵜呑みにしたような内容の馬鹿ブログ。 いや、早い話がお前らブログ辞めろって。 いや、それだけなのよ。まじで。お願いだから辞めて下さい。 資源の無駄、そして多くの人、社会の利便性と生産性を根こそぎかっさらってますよ。お前達
例えばWin32 APIはCですよ。
String^string1,^string2; ナンダコレ
>>619 検索エンジン使いこなせなくて涙目なんですよね。
>>619 俺車の運転出来ないんだ、だから世の中から車をなくせって理屈かw
そんな馬鹿な上から目線の理屈を展開するなら
検索エンジンのオプション位使いこなして下さい。
[blog ブログ]のキーワードを含むヒットを除外、とかさ…
>>618 スレ違い
と言うか.NET使うならC#の方がいいんじゃないかと思う
String ^string1, ^string2;
↑
せめてここに半角スペースを入れる
>>618 C++/CLIはこのスレ的にはどうなのだろ。
C++を拡張した言語で既にCでもC++でもないものなのだが。
>>625 ここはC++すら御法度なんだからC++/CLIがOKなわけないだろう
かといってC++スレに来られても困る訳だが
今からCを勉強しようと思うんだが他の言語のほうが有用なのか?
有用かどうか考えるのであれば 複数の言語を勉強するのが有用
レスありがとう。 よかったらCとC++の目的の違いとか教えてくれないか? 専門用語だらけでよくわからなくて・・
>>633 だから何がしたいんだよ?
C言語なんてやっても車の運転はうまくならないぞ
C++ を覚えられない人が C を使う。
目的の違いなんて使う人による どちらか片方にしか出来ないなんてことも無いと思う どっちが使いやすいかも人による
C++ の例外はそう簡単には C では実装できないけどね
仮想関数もつらいな、
仮想関数は関数ポインタ持てばいいだけ
自動的にデストラクタが走るとかも C では無理
?
自動変数なんてただのシンタックスシュガーじゃん。
??
!!!
?!
>>639 継承とかさせるとな、オーバーライドの有無で仮想関数テーブル作るのが大変なんだ。更にな多重継承なんかさせるとポインタを調整させるのも大変なんだよ。
とんだジョーンズインディですね。
実装のあれこれで別にC++の言語仕様を再現しようとかじゃなくて ソフトウェアとしてC++とCのどちらか片方にしか出来ないことなんて無いって事?じゃないの
それを言い出したらFORTRANでもいいって話に
アセンブ...
トランジスタをつな...
COBO....
C++ の方が開発の最大効率は高いが 使いこなせない人にとっては C の方がマシかもしれない。 しかし、C++ も使いこなせないようでは プログラマとしてやっていけるのか疑問。
そうなると使いこなせるの定義云々
C++に触ったことないヒトは問題外だそうです><
とりあえず触ってみた ぷにぷにしてた
C++ってごちゃごちゃしてて気色悪い もっと綺麗にならないのかよ
ここって、自分の作ったソースのどこが悪いかって見てもらえるんですか?
誘導されてきたのですね、わかります。 どうぞ。
663 :
デフォルトの名無しさん :2008/06/21(土) 21:31:55
リスト構造で、どんどんデータが追加されていくというソースを作ってるんですが、上手くいきません。 どなたか教えてくださる方がいましたら、お願いします。
666 :
デフォルトの名無しさん :2008/06/21(土) 21:53:27
>>665 いえ、素晴らしいソースだと思うんですが、初心者の自分が持っていったら確実に怪しまれるんで・・。
理解できるなら自分で初心者っぽく改造すれば?
668 :
デフォルトの名無しさん :2008/06/21(土) 22:31:28
【本日VIP投票日ですた】●第3回全板人気トナメ●【反省会会場】
http://yutori.2ch.net/test/read.cgi/news4vip/1214054829/ vipを助けてくれ!!!!!!!!
負けそうだ!!!!!
シベリア超特急に負けそうなんだ!!!!!!!!!!!
俺 達 の v i p が 無 く な る ! ! ! ! ! ! ! !
ニュー速の本部を荒らして俺らに投票してくれ!!!!!!!!
P C ケ ー タ イ 友 達 家 族 を フ ル 動 員 し て
コードをとってきてくれ!!!!!!!!!!!!!
ここで勝ったら二回戦もよろしく!!!!!!!!!!!
つまんねー話してないで協力するんだ!!!!!!!!!!!!!!!!
2chが変わってしまうぞ!!!!!!!!!!!!!!
助けてくれ!!!!!!!!!!!
まだまだ俺たちはおわれねぇ!!!!!!!!!!!!!!!!!!
669 :
デフォルトの名無しさん :2008/06/21(土) 23:24:31
ヒープソートの作り方を教えてください。 ヒープへのデータ挿入と最大値の取り出しは作れたのですが、 これらを組み合わせて作ることは出来無いでしょうか? データ挿入 void insert(int x,int *ary,int *n){ int p,k,tmp; k = *n; ary[k] = x; while(k > 0){ p = (k-1)/2; if(ary[p] < ary[k]){ tmp = ary[k]; ary[k] = ary[p]; ary[p] = tmp; k = p; } else break; } *n = *n+1; }
670 :
デフォルトの名無しさん :2008/06/21(土) 23:25:34
最大値の取り出し int deletemax(int *ary,int *n){ int max,j,k,tmp; *n = *n-1; if(*n < 0) return -1; k = 0; max = ary[0]; ary[0] = ary[*n]; while((j = k*2+1) < *n){ if(j+1 < *n && ary[j] < ary[j+1]) j++; if(ary[j] <= ary[k]) break; tmp = ary[k]; ary[k] = ary[j]; ary[j] = tmp; k = j; } return max; }
>>669 できない。
ヒープソートとは、いったん全てのデータをヒープ構造として構成した後で、
ヒープの根つまり最大値を取り出して残りを再度ヒープ化することを繰り返すアルゴリズムである。
つまり、この例での insert() と deletemax() は一対一の関係ではなく、
deletemax() が呼ばれ始めるときには insert() は全て実行済みでなければならない。
ついでにこの例のコードを効率化するヒントを挙げておく。
insert() は、ary に追加される数 x を、ヒープの葉から始めて順次親と比較し入れ替えながら適正な位置に挿入する。
同様に、deletemax() では、ヒープの末尾にあった子 ary[n-1] を、ヒープの根から始めて順次子と比較し入れ替えていく。
ここで重要なのは、比較する値の片方は常に x または ary[n-1] だった値で、入れ替え作業中変化しないということだ。
たとえば、
tmp=ary[0];
ary[0]=ary[1];
ary[1]=tmp;
tmp=ary[1];
ary[1]=ary[2];
ary[2]=tmp;
と
tmp=ary[0];
ary[0]=ary[1];
ary[1]=ary[2];
ary[2]=tmp;
は同じ結果をもたらすが、後者の方が明らかに速い。
C言語を勉強してみたいのですが、 コンパイラとやらをどうやって実行するのかが分かりません。 自分のPCはWindows Vista です。 ネットで調べたところ、Visual C++というのを使うらしいのですが、 自分のPCには「プログラムのアンインストールまたは変更」というところに Microsoft Visual C++ 2005 Redistributableというのが表示されてますが どこからこれを実行すればいいのかわかりません。 どなたかアドバイスをください。
>671 この関数を使ってヒープソートが作れるかってんじゃネーノ? >672 そりゃただのランタイムだ
>>672 VC++はMSのサイトでダウソできるよ。
675 :
672 :2008/06/22(日) 02:01:44
>>673 >>674 ありがとうございます。これはコンパイラではなかったのですね…。
MSのサイトに行ってきます!
>>673 それは考えたが、二つの関数の意味をわかっているなら、できることもわかっているはずである。
作り方を教えろと言うのなら、それはこのスレの範疇ではない。仕方がないので
>>671 のように解釈した。
一応、アルゴリズムの解説と、実装のためのヒントは示したつもりである。
manのtolower(3)の説明で int tolower(int c); >もし c が unsigned char の値でないか EOF ならば、 これらの関数の動作は未定義である。 とはどういうことですか? 引数がchar型であれば自動的にint型になるのではないですか?
int型で例えば1000とか-1とか与えたときは未定義ってことだろう
char型はマイナスの値を持てる場合があるけど、それを渡してはならないということ
680 :
デフォルトの名無しさん :2008/06/22(日) 03:36:30
C言語超初心者です。。。 なぜこのような答えになるのか教えて下さい…考えてもわからないですorz #include <stdio.h> #include <conio.h> int main(void){ double z; int k; k=0; z=2.0; while(z*z<15.0){ z+=0.5; k++; } printf("%d\n%3.1f\n", k, z); getch(); return 0; } 答え 4 4.0
zの2乗が15を超えるまでループしてるから。
>>680 どうなって欲しいのか書かないと何故と訊かれても困るよ
>>680 k++;の後にprintf("k=%d z=%3.1f\n", k, z);を入れて変数の変化を確認すると、
k=1 z=2.5
k=2 z=3.0
k=3 z=3.5
k=4 z=4.0
4
4.0
となります。参考までに。
684 :
デフォルトの名無しさん :2008/06/22(日) 03:53:01
>>681 ありがとうございます。
考え方としては、kが1のときzが4.5ということでいいのでしょうか?ほんとにわからないんです…すいません。
>>682 dぷなってほしいというか…どのように表示されるのか書きなさいという問題なんです。
685 :
デフォルトの名無しさん :2008/06/22(日) 04:00:43
>>683 ありがとうございます!理解できました。
686 :
デフォルトの名無しさん :2008/06/22(日) 12:33:09
携帯から失礼します #include<stdio.h> #include<conio.h> int main(void){ int i,s; s=1; for(i=1;i<=6;i++){ printf("%2d\n",s*i) s*=-1; } getch(); return0; } なぜs*=-1;になるのでしょうか?わかるひとお願いします
s*=-1; 毎回Sの符号を変えてるだけでしょ? s = s * -1; と同じ
実行すると 1 -2 3 -4 5 -6 と出力されるはず
宿題丸投げは宿題スレへ
690 :
デフォルトの名無しさん :2008/06/22(日) 13:18:18
ありがとうございました!
質問です。 #include <stdio.h> int main(void) { int num; do{ printf("正の整数を入力して下さい :"); scanf("%d",&num); if(num<0) puts("負の整数は入力できません"); }while(num<0); printf("入力した整数を逆から読むと "); do{ printf("%d", num % 10); num /= 10; }while(num); puts(" になります。"); return 0; } 上記のコードで、scanfの時点でnumに負の実数を入力すると、 無限ループになってしまいます。 なぜ2順目以降のscanfが飛ばされ、新しく数値を代入することができないのでしょうか? intをdoubleに変えて、scanf内の%dを%lfに変えても同じ結果でした。 無限ループは 「正の整数を入力して下さい :負の整数は入力できません」 が、延々出力されます。
>>691 それで普通に動作したけどなぁ
scanf(" %d",&num); ←%dの前に半角スペース
としたらどうなる
>>692 >>693 ありがとうございます。
%dの前に半角スペース(空白、改行を読み飛ばすですね)を試してみましたが
結果は同じでした。
693さんのページを読んで試してみたところ、
scanfの項の (3)読み込み不一致 の問題が発生していたようです。
一旦文字列として読み込んでatoiでint型に変換することで回避できました。
ありがとうございました。
-(マイナス)じゃなくてー(長音)入れてたりして
>>695 違う、実数を入れたって言ってるだろ
引っかかってるのは小数点だ
特定の関数のコードサイズを知りたいんですが、 その関数だけ別ファイルにしてコンパイルした時の オブジェクトファイルのサイズがイコールだと思っていいですか?
> scanf内の%dを%lfに変えても
>>698 コード以外にリンク用の情報とかいろいろ付いてるんじゃないの?
>>698 リンカの設定でmapファイルを出力すべし
>>698 そういう方法なら普通、抱えて乗ったときと一人で乗ったときの差、という発想になるのでは
質問です。 struct list { int key; /* キー */ char name[20]; /* 名前 */ struct list *next; /* 次のデータへのポインタ */ }; struct list *add_list(int key, char *name, struct list *head) { struct list *prev, *cur; struct list *p = malloc(sizeof *p); if (p == NULL) { printf("out of memory\n"); exit(1); } p->key = key; strcpy(p->name, name); p->next = NULL; if (head == NULL || strcmp(name, head->name) < 0) { p->next = head; return p; } for (prev = cur = head; (cur = cur->next) != NULL; prev = cur) { if (strcmp(name, cur->name) < 0) { p->next = cur; break; } } prev->next = p; return head; }
704 :
デフォルトの名無しさん :2008/06/22(日) 16:13:31
>>703 の続き
上記は関数はリストに単語をアルファベット順に追加していく関数です。
以下の箇所の動作がいまいちよく分かりません。
for (prev = cur = head; (cur = cur->next) != NULL; prev = cur) {
if (strcmp(name, cur->name) < 0) {
p->next = cur;
break;
}
}
どなたかご教示ください。
よろしくお願いします。
「アルファベット順に」 という制約から、どこにでも単語を追加できるわけではない。 アルファベット順を保つために、これから追加しようとする単語を入れるべき位置を探す必要がある。 例えば、単語 「foo」 は、単語 「bar」 の前や、単語 「hoge」 の後ろに入れるわけにはいかない。 foo → bar → hoge や bar → hoge → foo といった順序ではアルファベット順でなくなってしまう。 つまり foo は、bar と hoge の間に入れなければならない。 その for ループと strcmp は、単語を入れる位置を探している。 p->next = cur; と break 後の prev->next = p; は、見つかった位置に実際に追加している。
706 :
デフォルトの名無しさん :2008/06/22(日) 16:35:16
>>704 for文が効率的である反面わかりにくいのかも
while(1){
if( cur->next !=NULL ){
if( strcmp( name,cur->next->name) <0 ){
p->next=cur->next;
cur->next=p;
break;
}else
cur=cur->next;
}else{
cur->next=p;
break;
}
}
と等価。こちらのほうが分かり易いかも
(無検証につき無保証御容赦)
確保していない領域を使用したり突っ込みどころ満点だな
>>700-702 ありがとうございます。
mapファイルについて調べつつとりあえずは差分で調べてみます。
>>704 for (prev = cur = head; (cur = cur->next) != NULL; prev = cur) {
prevがひとつ前に調べた場所、curが今調べている場所
最初(head)から最後(nextがNULLの単語)までのループになっている
A→E→G→NULL というリストにFを追加する場合、
strcmp( "F", "A" )だと正の値が返ってくるので何もしない。Eも同じ。
strcmp( "F", "G" )だと負の値が返ってくるので、
FのnextにG(cur)へのポインタをセットしてループ終了、
最後にE(prev)のnextにFをセットしてる
結果としてA→E→F→G→NULLとなる
頑張って書いた割にすごいごちゃごちゃしてて少し凹んだ orz
ちょい変形 prev = head; /* 先頭の一歩手前 */ cur = head->next; /* 先頭から始める */ while (1) { if (cur == NULL) break; /* 終端に到達(p->nextはNULLのままでいい) */ if (strcmp(name, cur->name) < 0) { /* 新項目pの直後にするべき項目に到達 */ p->next = cur; /* 実際にpからリンクする */ break; } prev = cur; /* 一歩手前を常に保存 */ cur = cur->next; /* 次へ */ } こう?基本的には、p->nextの値を決定しているわけだよね。 ループの内部ではprevを参照していない、というのもポイントか。
711 :
デフォルトの名無しさん :2008/06/22(日) 16:47:05
prevなんて、速度向上にも寄与しないし、論理的に 必ずしも必要でない変数が入っているし... 要するにそのコードは、最適化/考案/修正中のコードで、 教材として扱って良いコードじゃないんだな プログラムコードはそういうものの塊で、分かりにくい 場合に、無理に理解しようとしないというのが鉄則。 (書いている本人ですらごみ箱に捨てて忘れている場合すらある)
712 :
704 :2008/06/22(日) 16:53:39
for (prev = head; prev->next != NULL; prev = prev->next) { if (strcmp(name, prev->next->name) < 0) { p->next = prev->next; break; } } prevオンリー。これが原形だったのかね。
つーか、NULLの場合を分けなくても for (prev = head; prev->next != NULL && 0 <= strcmp(name, prev->next->name); prev = prev->next) ; p->next = prev->next; とかでいいような気が。これはこれでひどいかw
ここは何時から宿題スレになったんだ?
for文はどっかカッコイイから使いたくなるものだが、 後々の修正がキツくなる傾向が高い扱いにくい構文。 単純ループ以外、初心者は余り使わないほうがいいだろうな
for文に条件式詰め込んでまで行数を削る必要ってあるの?
必要ないし、ある条件を満たすものを探索する場合はむしろダメ
行数を減らすとカッコイイと勘違いする時期ってのがあるんだよ
社会に出ればむしろ行数を増やすように言われることもあります
そういうのは社会に出ればとは言いたくないな
for があまり複雑になるようだと、 while にしたり、for のままではあるが 条件の一部を { } の中に要れたりするな。
社会に出て行数を増やすことばかり専念して 中身がぜんぜんなっちゃいない奴が増えるのも迷惑な話だ
今はしらんけど、日立とか、行数の見積もりの誤差が±数パーセント以内でなければ ならないって規則だから、ちょっと多めに見積もってループを展開するとかでコードを 水増しして、誤差を調整してたな。
行数だけで見積もるからそんなのになるw
そんなに正確に見積もれるわけないじゃんw そこまでやったら、見積もる時間でコードが書けるわ。
行数見積もりする意味がわからん
昔の話だから今はしらんよ。 > 日立
ステップ数至上主義でステップ数で業績評価してると、 見積もりがあまりずれすぎると困るということなんだろうな。 そもそもステップ数なんぞで(ry
>>728 メインフレーム時代の名残でしょ。
昔は作業内容を報告するのに確かステップ数管理してたはず。
新規いくら、修正いくら。
で、このステップ数から必要テストケースの数が割り出される・・・だったかな@元戸塚組
ステップ数で評価って、コードを改良してコンパクトにして高速化すると評価を下げられるのね。 まるで、残業時間で評価する糞(ry
今はC言語は勉強する価値がないそうですが 本当なのでしょうか?まだ研修中でよくわかりません。 今はJavaとC#というのを研修してます
ものすごく細かかったな。 仕様書なんかもキングGの分厚いファイルに修正修正で継ぎ足された常態のがあって ○Cとか○Sとか書いてやってた・・・かな・・・?
>>734 分野による。
組み込み系はC使うし、Web系ではほとんどC使わないだろうし。
>>733 まー昔の名残だからねえ。日立らしいといえばらしいかな
>>734 分野によるでしょ
C言語は組み込みだと現役だし、windows上のアプリだとVC++かJavaかC#とか
そんなんじゃないのかな?
まだXDMシリーズって現役なんだなw
>>734 価値がないわけではない。もっと用途に応じた価値のある言語はあるというだけ。
>>734 まあ、特定の言語を学ぶ価値が無いとか言う奴は信用するな。
所謂、ニセモノだ。
特に、高級言語風で現実のCPUの動作まで学べるCをおろそかに
するのは、目先の業務しか出来ない程度の奴だよ。
CはCPUアセンブリーとのコレスポンデントが最も良い というのは20世紀に信じられていた神話なんで忘れましょう。 Intel の80386プロセッサはPASCAL等に最適化されているし Java仮想マシンのコードをそのまま動かせるプロセッサJavaChip も一応発売されていた(る?)し。
Javaチップなんてあってないようなもんだろw
C/C++はアセンブラが透けて見えてくるのが最大の利点ではある。
26歳でPGに転職した負け組み人生だけど Cをアセンブラにして遊んでたのがすごく力になっていると実感する。 自分より何倍も実務経験長い先輩でもC知らない人とかいてそういう輩はほんと糞過ぎる。 当たり前のことだけどプログラマならCは絶対に勉強するべき。
まあ教養の一種ではあるな それ以上ではないけど
基幹システムの7割がJavaで出来ているのに 今更Cなんてw
まぁ本当はアセンブラやったほうがいいが、本当にCが書ければ アセンブラのマニュアル読めば書けるからね。 Cを知らない=Cが出来なかった先輩じゃないのかな。 C挫折組み=ポインターが理解できなかった連中の理解力の無さは 一緒に仕事したくないレベルだねぇ。
>>746 いや、そのJavaが何で書いてあるかと(w
>>741 詳細を教えてください。< i836 が pascal に最適化されていた
Java書いたOSあるだろうがボケ
JavaやC#と一緒にCを勉強する価値はないってことじゃ どんな研修か知らないけど、あまりいっぺんにやると混乱するだろうし
>>749 link, unlinkという命令は何のためにあると思う?
>>752 i386 にも pascal にも link 命令なるものは見当たらないのですが。バイナリでは何?
Cはゲームに向いてる?向いてない?
サッカーや野球には向いてないような
スペックさえ許せばC以外の方が楽だと思うよ
ゲームに最も使われているのがC++
ゲームって動作速度を確保するために結構ムリヤリな効率化をする必要があるからなー
ゲームっつうのは組み込みに近いモノがあるからな 最近はPCに近づいてきたけど
10年位前の雑誌でも読んだんだろ
Intelプロセッサが、C/C++等のような高級言語処理系の存在を無視した アーキテクチャーに変更されたって話は聞いた事ないな
Intelプロセッサは.NETに最適化されてるだろ
本気?
ICCに最適化されてるんじゃね。 あれ?
俺の脳はCに最適化されている。 だから人並みの事は出来なくてもいいのだ。
VC++でウィンドウやらダイアログ作ってもソースはC++だから 今までCやってた俺には振り出しに戻った気分orz
意味不明
SSE2か何かの、丸めフラグを見ず常に0方向へ丸める命令は、おそらくCを意識している。
MFCとかの話じゃね?
統計計算のプログラミングの例を教えてください。 最大20個までの実数値をscanf()で、配列に読み、呼んだデータの、平均値、分散、最大値、最小値を計算して表示するプログラムを教えてください! 条件として、データは-999.0から999.0の範囲とし、入力終了の合図として1000.0より大きい値のデータを入力すると、その数値は入力されずに入力作業を終了する。 平均値と分散については、 データ数をn、各データをXi(i=1〜n)とすると、(ΣXi)/n (データの個数で割ったもの)が平均値 (Σ(Xi-(データの相加平均))^2)/nが分散であるとする。 よろしくお願いします!!
以下のようなプログラミングはどのようにすればよいのでしょうか? 「組み合わせ」を求める数学の公式にコンビネーションがあります。このコンビネーションのプログラミングを教えてください! 1.nとrをscanf()で読み、nCrの値を計算して表示させます。 条件として、nとrの値はマイナスでなく、またゼロでなく、さらにここではn<=10であることを確認させて、正しい数値を入力させる。もし誤った数値を入力したら「入力ミスです」と表示させる。 2.0!=1も扱えるようにすることを忘れない。
gobakusimasuta
webにしてもサーバーモジュールなんか普通にC使ってるけどなw
で、386がpascalに最適化されてるって 聞いてやるから語ってみろよ。
興味があるのなら自分で調べろ。そういう話は
PS3はしらんがPS2まではC++だった
>>769 80x87 FPU は丸めフラグにより好きな方向に丸められるのですが、そういうことなら退化していますね。
記入された文字列(横)を入力し、縦に出力するプログラムを書きました。 forを使った二重ループで、入力後にEOFが入力されたらループを抜け出し、 出力に移るのですが、1回目のbreak後に1周余計にまわってしまうのか、 2個目のループの計数値が0に戻されてしまい、正常な出力が出来ません。 項目を指定して出力させると、文字が正しく入っているのは確認できるのですが、 文字入力の最大値が0になってしまうので、全てがダメになっている状態です。 EOFで2個目のループを抜け出した後、もう1周回らないようにする対策が必要だと思うのですが、 どうやったらよいのでしょうか?ご教示願います。
#include <stdio.h> int main(void) { int num[100][100]; int i,j,temp_i,temp_j; printf("文字列を入力\n"); for(i=0; i<50; i++) { for(j=0; j<10; j++) { num[i][j]=getchar(); if(num[i][j]==EOF) { break; } } if(num[i][j]==EOF) { break; } } temp_i=i; temp_j=j-1; /*EOFを取り除く*/ for(j=0; j<=temp_j; j++) { for(i=0; i<=temp_i; i++) { printf("%c",num[i][j]); } printf("\n"); } return 0; }
文字列どうやって入力してる? まさかとは思うけど一行入れるごとにenter押したりしてないだろうね?
改行なしで入力したとしてもjが0とかで終了したらどうなるか、少し考えたらわかりそうなもんだが。
>>781 ■■■□□□□□□□ (■、●=(0,0)〜(temp_i,temp_j)に含まれる部分)
■■■□□□□□□□
■■●[EOF]
■□□□□□□□□□
■□□□□□□□□□
●[EOF]
□□□□□□□□□□
□□□□□□□□□□
○[EOF]
たぶん、そもそもやりたいことと全く無関係なことをしている。
文字単位で物事を考えたいというのはわからないでもないけど。。
改行やタブなど、マス目に納まらない存在を無視しているのは確実でしょう。
もう少し力を蓄えてみては。
>>779 そういう命令があるってだけで、丸めフラグを有効にする命令も両方用意されてるんじゃないの
>>550 どうもありがとうございました!遅れてスミマセン
その方法でやってみたのですが、
http://www.geocities.jp/kenji_y0328/crenshu/renshu/r034.html この様にしたいんですけど
while(1){
puts("営業所を入力");
scanf("%s", eigyou);
if(strcmp(eigyou,"end") == 0){
break;
}
puts("金額を入力");
scanf("%d", &kingaku);
kensu++;
strcpy(eigyou_t[kensu],eigyou);
kingaku_t[kensu] = kingaku;
}
としたら、whileの中のkensuがうまく足されないのか、出力結果が最終的に入力したものだけが全て出て、
おかしなことになります。。。上記の方法では、kensu++は0→1、次の入力でまた0→1となってしまうのでしょうか?
質問の仕方が下手でスミマセン・・・よろしくお願いします・・・
>786 その入力内容と出力結果を貼れ あと配列の添字は0スタートだってことを忘れるな
営業所名の一時保存用のテーブルは1次元配列でいいのかな?
790 :
デフォルトの名無しさん :2008/06/23(月) 21:39:10
>>789 strcpy(eigyou_t[kensu],eigyou);
で、kensuだからダメ
まあ配列以上の文字数入力したとかもありそうだし
792 :
790 :2008/06/23(月) 21:48:09
793 :
790 :2008/06/23(月) 21:57:20
とりあえずkensuのインクリメントする位置変えてください・・・ puts("金額を入力"); scanf("%d", &kingaku); strcpy(eigyou_t[kensu],eigyou); kingaku_t[kensu] = kingaku; kensu++;
配列の名前とポインタの違いってなにかありますか? あとポインタにインクリメントしたらどうなっているのでしょうか?
アホス
>>794 「ポインタを」じゃなくて「ポインタに」でいいんだな?
ならポインタが指し示す内容に、1足される
あのさ、直ぐ答えを求めたくなるだろうけどデバックする力もいるじょ。
>>794 配列の名前とはメモリ上の連続した領域につけられた名前のこと
ポインタとはあるオブジェクトを指し示すことができるオブジェクトのことで
互いに全然違うもの
ただし、配列へのアクセスが実際にはポインタ(の値)によって行われるため
両者が似たものに見えることが多い
配列の名前がポインタに成り下がる件については
>>461 を参照
配列の名前がポインタとは違うことはわかりました。 確かにポインタは名前ではありませんね。 値であり、名前と異なり、プログラム中でユニークな保存性を持ちます。 ポインタを変化させて無名な変数にもアクセスすることが出来る わけですね。 それでは、配列とポインタの相違は何でしょうか?
800 :
786 :2008/06/24(火) 06:09:42
バイトおわって帰ってきますた・・・ 今からはらせていただきます #include <stdio.h> #include <string.h> int main(void){ int i, j, kingaku, kingaku_t[10], kensu; int jun[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; char eigyou[20], eigyou_t[10][20]; kensu = 0; while(1){ puts("営業所を入力"); scanf("%s", eigyou); if(strcmp(eigyou,"end") == 0){ break; } puts("金額を入力"); scanf("%d", &kingaku); kensu++; strcpy(eigyou_t[kensu],eigyou); kingaku_t[kensu] = kingaku; }
801 :
786 :2008/06/24(火) 06:11:33
for(i = 1; j <= kensu; i++){ for(j = 1; j <= kensu; j++){ if(kingaku_t[j] < kingaku_t[i]){ jun[j]++; } } } printf("________________________________________\n");/*半角40*/ printf(" 営業所 売上金額 順位 \n"); printf("========================================\n"); for(i = 1;i <= kensu; i++ ){ printf(" %6s %8d %8d\n", eigyou_t[kensu], kingaku_t[kensu], jun[kensu]); } printf("=========================================\n"); return 0; } 以上です・・・。出力結果は、たとえば3件入力したら3件とも同じ値になってしまうとです・・・ 順位も1から変動しないのです。kensu++が反応してくれないみたいなんですが、どうしでかがわからんのです・・・ウッウッ
802 :
786 :2008/06/24(火) 06:12:42
ああ、すみません半角40てのは気にしないでください・・・字数を数えてたのです
>eigyou_t[kensu], kingaku_t[kensu], jun[kensu] じゃなくて eigyou_t[i], kingaku_t[i], jun[i] だろ
あと >for(i = 1; j <= kensu; i++){ じゃなくて for(i = 1; i <= kensu; i++){ な。
結局最初にあげたところは関係なしか。 どこが間違ってるのかわからないのに、ソース全部あげないでここが間違ってると思うとか 寝言を言う初心者っていなくならないだろうな。
806 :
786 :2008/06/24(火) 10:11:28
ああああああああああああああああああああああああ そこですか・・・・・・すみませんでした・・・・・・問題なくコンパイルできたんで、全然頭になかった・・・ 思い込んでましたすみません・・・ご迷惑おかけしましたありがとうございました・・・
初心者のくせに状況説明にフィルターをかけるな、というのが人情というものです
のび太のくせに、生意気だー ですね、わかります。
>>799 配列は配列だしポインタはポインタだし。
配列しかもち得ない情報(ex.要素数)をポインタから知る事はできない。
>>799 配列とはメモリ上に名前つきで確保された連続した領域のこと
ポインタとはあるオブジェクトを指し示すことができるオブジェクトのことで
互いに全然違うもの
ただし、配列へのアクセスが実際にはポインタ(の値)によって行われるため
両者が似たものに見えることが多い
配列の名前がポインタに成り下がる件については
>>461 を参照
int a[100]; printf("%zd =?= %zd =?= %zd =?= %zd", sizeof(a), sizeof(&*a), sizeof(&a[0]), sizeof(a+0));
数値から時刻に変換して時刻での計算をするにはどうしたらいいんでしょうか。 例:数値 0924 →09:24 09:24-08:24 = 01:00
if(924/100 == 9) puts("!");
オーバーフローとアンダーフローを監視するにはどうすればいいの?
【問題】
紙を1回折り曲げ、角度が90度になるように開いたときにできるカーブを第一次ドラゴンカーブという。
更に紙を1回折り曲げ、角度が90度になるように開いたときにできるカーブを第二次ドラゴンカーブという。
ドラゴンカーブはこんなカーブ
ttp://image.blog.livedoor.jp/shi_yu_mi33/imgs/3/5/35dbf174.jpg ドラゴンカーブはL(左)とR(右)で表現することができる。
数字は折り曲げた回数
1=L (直線→左に曲がる→直線)
2=LLR (直線→左→直線→左→直線→右→直線)
3=LLRLLRR (同様)
4=LLRLLRRLLLRRLRR
・
・
n=
これを9回まで出力するようなプログラムを再帰呼び出し等をうまく活用して作成せよ。
【考え方】
・最初はL。
・n番目を求めるとき、n-1を呼び出してこれにLを加える。更にまたn-1を呼び出してこれのLをRに、RをLに変換して逆順に並べてつなげる。
自信ある人はやってみてね。回答は数日後に
int a[100]; int size; size = sizeof(a) / sizeof(a[0]); で配列の個数が求められるのはわかるけど、sizeof(a[0])の0というのが どうも気持ちが悪いのですが。どうして?
どうしても何も要素をsyzeofに渡すためとしか。 嫌ならsizeof(int)でもどうぞ。
sizeof a / sizeof *a
sizeof(型) と sizeof 変数 を使い分ける人はどのくらいいるのだろ。 何も考えず( )をつけるのが普通だと思うけど。
>>817 名前なしの配列ってどういうのですか?
>>821 それいいですね、すっきりしました。
sizeof(a) / sizeof(int)だと配列の全体÷intの幅なので気持ち悪いですよね。
sizeof(a) / sizeof(*a)だと全体÷部分=個数っていう理屈に合っていていい
感じです。
すっごく、どうでもいいこだわりですけどね。
配列要素の個数をsizeofで求めることって、実際にあるのかなあ? 個数を定数なり変数なりで管理して、それを使えばいいと思うんだが。
追加したり減らしたりするような配列は、sizeofで求めるとわざわざ定数を使わなくて非常に楽
>>824 固定値のみの配列に対して処理するときによく使う。デバイスドライバ
でよく見るな。
#defineで配列のサイズを決めていても、なぜかsizeof使ってサイズを求めなおすヤツもいるしな。 コードの実行自体にはなんの関係もないが。
>>828 エラーメッセージは?
コンパイル時でもプログラムの実行時でもそうだが、
なにかトラブルがあったらトラブルに関する情報を収集しておくこと。
コンパイル時はエラーメッセージ。
これは基本中の基本。
>>828 まさかmainが無いだけじゃないだろうな?
>>829 \fft.c(8) : error C2054: 'inline' の後に '(' が必要です。
\fft.c(8) : error C2085: 'swap' : 仮パラメータ リスト内にありません。
\fft.c(14) : error C2082: 仮パラメータ 'fft_table' が再定義されました。
\fft.c(14) : error C2143: 構文エラー : ';' が '{' の前にありません。
\fft.c(104) : warning C4013: 関数 'swap' は定義されていません。int 型の値を返す外部関数と見なします。
\fft.c(110) : error C2054: 'inline' の後に '(' が必要です。
\fft.c(111) : error C2082: 仮パラメータ 'swap' が再定義されました。
\fft.c(111) : error C2143: 構文エラー : ';' が '{' の前にありません。
こんなかんじです
>>831 inline void swap(float *a, float *b)
を
void swap(float *a, float *b)
にしたら、コンパイルが通ったりして(2箇所)
・C99対応コンパイラを使う ・inlineをソースから削る ・拡張子をcppにしてコンパイルする 好きなのを選べ
>>832 >>833 できました!
VSはC99対応してないんですねー
動作には影響しないんですか?
>>834 >>834 inline展開をやめて関数コールにしたわけだから、関数コールのオーバーヘッドにより
処理時間が長くなる。どのくらい長くなるかは、FFTの分解能(ループの回数)による。
C++はinlineをサポートしているので、ファイル拡張子をcからcppに変更して
C++でコンパイルすればOKかな?(
>>833 の指摘3番目)
Cのままにしたいのなら#defineマクロかな?
#define swap(a,b) { float temp = a; a = b; b = temp; }
>>816 n=5以降も参考に乗っけてもらえませんか?
結果があっているかの確認のため
>>834 あ、そうそう
VCには_inlineがあったはず
inlineを_inlineに変えてみたら
>>835 inlineつけなくても最適化で展開されるんじゃね?
>>836 4つめまでであってれば、後は大丈夫じゃね?
処理系ってよく耳にしますけど、コンパイラのことですか? カーネルや標準ライブラリ関数やSVCも含みますか?
コンパイルから、その環境下における事、OSでの実行まで過程全部
>>816 void dra(int n)
{
int i, j;
char *p = calloc(1<<n, 1);
for(i=0; i<n; i++) {
int l = 1 << i;
p[l-1] = 'L';
for(j=0; j<l-1; j++) p[2*l-2-j] = 'L' + 'R' - p[j];
}
puts(p);
free(p);
}
int l = (1 << i) - 1; p[l] = 'L'; for(j=0; j<l; j++) p[2*l-j] = 'L' + 'R' - p[j]; の方がいいな。
プログラム毎に起動時にmallocで確保可能なヒープのサイズを制御する方法ってあるのかな?
たとえばUNIX系ならulimitとかの話か?
846 :
844 :2008/06/25(水) 07:14:18
>たとえばUNIX系ならulimitとかの話か? へーこういう方法で可能なんですね。 ありがとうございます。
#include <stdio.h> int main(void) { char ch; float f; double d; ch = 'X'; f = 100.123; d = 123.009; printf("chは %c、", ch); printf("fは %f、", f); printf("dは %f", d); return 0; } ハーバード・シルト著、トップスタジオ訳、柏原正三監修 『独習C 第4版』 翔泳社より これをコンパイルすると、数値が小数第6位まで表示されてしまうのはなぜでしょうか。 なお、使っているコンパイラは 『Borland C++ Compiler5.5』 です。
>>848 デフォルトでは小数点以下6桁まで表示することになっているから
3桁まで表示したい場合には書式指定すればよい
%.3f
>>848 小数点の後の桁数は、精度で指定された値となる。
精度が指定されていない場合には 6 として扱われる。
精度として明示的に 0 が指定されたときには、小数点以下は表示されない。
Visual studioでプログラミングしています。 ソースファイルにmain.cとfunc.cという2つのファイルがあります。 main.cの中でfunc.cの中で定義している関数を使おうとすると、定義されていません とエラーになってしまいます。 解決法を教えてください
プロトタイプ宣言を書くんだ。 main.c に直接書いてもいいけど、通常はfunc.h に書いておいてmain.cで #includeする。
>>852 main.c の中から必要な関数の宣言を見ることができるようにしなければならない。
具体的には、ヘッダファイル func.h を作成して関数宣言(関数プロトタイプ)をその中に記述し、
main.c の中で #include "func.h" として取り込む。
なお、間違っても #include "func.c" としてはいけない。本来は隠しておくべき func.c 内部の
ローカルな要素が main.c から丸見えになって、問題を起こす可能性が高くなる。
外部に公開したい要素だけをヘッダファイルに入れ、それを必要なソースファイルが #include すること。
また、func.c 自身も #include "func.h" しておく。
こうすることで、外部向けの宣言が内部の定義と食い違っていたときにコンパイラが警告を出してくれる。
>>853 >>854 どうも。
#include func.cにしたら多重定義とかでおこられましたww
856 :
848 :2008/06/25(水) 15:34:39
>>849-851 ありがとうございます。
コンパイラの異常でないことが分かって安心しました。
VC++でビルドしたexeをテキストで開いたら保存フォルダpathが書いてあった これどうにかならない? あと実際には存在しないpath(root\ d d \ v c t o o l s \ c r t _ b l d \ s e l f _ x 8 6 \ c r t \ s r c \ c r t e x e . c)も書いてあった 何これ?
どうにかなるよ。 ランタイムライブラリに入ってたんだろう。
#include<stdio.h> #include<string.h> int main(void) { int i; char str[101]="1234567890",str2[101]; for(i=1;i<=10;i++){ memset(str2,0,strlen(str2)); memmove(str2,str,i); printf("str2=%s\n",str2); } return 0; } i=5のときだけゴミが入るのは何ででしょうか?
たまたま。 初期化してないstr2で strlen(str2) は無いだろう。 sizeof str2 でどうか。
上手くいきました。ありがとうございます。
memsetの第二引数はintなのに、整数を渡すとおかしな値が入るのは何故ですか? 例えば1を渡すと16843009が入っていました。 0と-1はそのまま入っていたのですが。
文字を受け取る引数の型をintにするのは標準ライブラリのお約束のようなもの、 例えそのmemsetのようにEOFが関係しないものであっても。
864 :
862 :2008/06/25(水) 19:53:23
>>863 返答ありがとうございます。
そういう決まりごとなんですか。
ということはintで受け取ったものをcharに変換しているということですよね?
なのに第一引数がvoid型へのポインタなのはなんか変な感じがしますね。
>>862 >>864 0x01010101 == 16853009
>>863 Cではchar型は関数の引数に渡せない。(integral promotion)
int単位でしかmemsetできなかったら嫌すぎる
誤った記述でもコンパイルできた場合、そのプログラムを実行した時に暴走してクラッシュする可能性とかありますか?
異常終了という現象を知りながら、可能性がありますかってどういう
WM_TIMER内にMessageBoxしたらメッセージボックスが出続けるとかね
>>864 昔は char * な実装もありました。
memset() の機能が 1 byte 単位で値を設定するものですから、ポインタの指す先の正体をとやかくいう必要はないわけで。
>>867 「誤った記述」「暴走」「クラッシュ」の定義によって答えも変わると思います。
>>840 ん、たしかに。
文脈依存でしょうね。
鋭い指摘ですね。
>>871 char*だったのは昔void*がなかったという理由のほうが大きい。
>>870 void printTest(double value)
{
printf("%f %g\n", value);
}
こういう関数でも作って、
printTest(0);
printTest(1);
printTest(1e100);
printTest(1e-10);
とでも呼んでみて、気に入った方を使えばいいと思うよ。
実験的には、引き数をdouble valueではなくfloat valueにしたらもっと違いが判るかもしれない。
>>875 実行すると以下のようになりました。
%gだと0が0と表示されなくなるってことですか?
0.000000 6.64584e-316
1.000000 6.64584e-316
10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104.000000 1.19819e-127
0.000000 -6.27769e+124
877 :
875 :2008/06/25(水) 22:05:06
あーごめん、printf("%f %g\n@, value, value)だね。
878 :
875 :2008/06/25(水) 22:05:49
ダブルコーテーションがアットに化けた…… 何度も失敬。
>>875 ん、確かにいいかんじですねぇ。
#include <stdio.h>
#include <stdlib.h>
void printTest(float value) { printf("%.12e %.12f %.12g\n", value, value, value); }
int main()
{
printTest(0);
printTest(1);
printTest(1.0 / 3);
printTest(1e10);
putchar('\n');
printTest(1e-10);
printTest(1e-9);
printTest(1e-8);
printTest(1e-7);
printTest(1e-6);
printTest(1e-5);
printTest(1e-4);
printTest(1e-3);
printTest(1e-2);
printTest(1e-1);
printTest(1e-0);
return 0;
}
/* end */
>>876 好みの問題、ということでいいのではないでしょうか、私は好きになりましたが。
>>836 n回目まの結果を載せたらN+1回目も欲しいな?
なんて帰納法?
オーバーフローとアンダーフローを検出する方法を教えてください
>>882 浮動小数点演算のオーバーフローとアンダーフローのことですか?
>>882 私も知りたいです。最近は matherr() が使えないようで、困っています。
885 :
デフォルトの名無しさん :2008/06/25(水) 23:45:34
固定長テキスト形式のファイルを構造体に読み込むにはどうしたらよいのでしょうか?
fread
887 :
デフォルトの名無しさん :2008/06/26(木) 00:27:14
お願いします。使用コンパイラはVisual C++ 2008 です。 Cで三角関数を計算させることはできるのですが、C++で同じことをしようとすると、 error C2668: 'sin' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(577): 'long double sin(long double)' の可能性があります。 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(529): または 'float sin(float)' 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(124): または 'double sin(double)' 1> 引数リスト '(int)' を一致させようとしているとき と出てしまいコンパイルエラーが起きてしまいます。 オーバーロードについても調べてみたのですが、曖昧なのが原因なので、 明示的にキャストすることでこのような問題を避けることができる といことがわかったのですが それ以降がさっぱりな状況です。 Cから学んでいるため、正直なところC++が根本から分かってないという感じもしますが・・・ よろしくお願いします。
>>887 スレ違い。まぁ、sin(0)ではなくsin(0.)にしろってこった。
>>885 固定長テキストをレコードで切り分けて文字列として格納したいなら
レコード単位で読み取って整形する
そのまま構造体に放り込みたいだけなら単にfreadを使えば済む
ただし改行がある場合は注意
>>887 引数に与えた値の型を特定できないという意味
詳しくはC++スレで聞け
てらツンデレ
891 :
887 :2008/06/26(木) 00:38:13
>>888 >>889 回答ありがとうございます。できました。
仰る通りスレ違いでした・・・申し訳ないですorz
>>892 コメントで説明があるよ
■ip[0...*]
length of ip >= 2+sqrt(n/4)
strictly,
length of ip >= 2+(1<<(int)(log(n/4+0.5)/log(2))/2).
■w[0...n*5/8-1]
>>893 2+sqrt(n/4)より大きいって書いてあるのがひっかかって
>>892 追加
ip[2+sqrt(n/4)]、w[n*5/8]でいいんじゃないかな
心配だったら倍にしておくw
>>895 了解です
使い方なんですが、
実信号がx[n]にはいってたら、
rdft(n, -1, x, ip, w)を実行したら
x[n]の配列にFFTした値が入ってるってことですか?
添え字が偶数に実部で、奇数のところに虚部がって
>>894 配列のサイズが2+sqrt(n/4)以上ならOKということ
2+sqrt(n/4)を超える部分は単に使われないということ
>>896 x[n]に実信号を格納しておいて、rdft(n, 1, x, ip, w)でDFT実行。
結果はx[n]に上書きされて、添え字が偶数に実部で、奇数のところに虚部が格納される。
rdft(n, -1, x, ip, w)で逆DFT実行。x[n]に実信号が格納される。
です。
普段何気なく使っているgets関数などの仕組みを知りたいのですが、初心者だとそこまで知る必要はないのでしょうか?
釣り?
>>900 知りたくなったところから調べればよい。
>>900 普段だろうと何気なくだろうと、今後はやめとけ、な?
バッファオーバー蘭姉ちゃんの問題が指摘されているから。
>>900 は関数の仕組みを知りたいといっているのに、何に反応しているんだろうか?
返答ありがとうございます。ググッてみたらgetsが問題ありな関数だとわんさかでてきました 他にも危険な関数とかありますか?
>>906 strcpy(*str1,*str2);
str2がstr2より長い場合、これまたバーローになるw
うわっ、なんかラリってるw str2がstr1より長いとき
サイズを指定しないで文字列を操作する関数には危険がある可能性が高い
常識的な範囲の中で正常動作すればいいんだよ。
>>910 > 常識的な範囲
何が常識かも言わずにそれは無い。どうしたら起こるか?
で話を理解してくれ。結局、そういうコードはあふれ出てしまう
欠陥を持ち合わせているため、変数を適当に変えればいつでも
不正な動作に出来る欠陥品ってことさ。
ほとんどの関数は安全な仕様にした関数あるんだから そっち使えばいいのにわざわざ危険な関数使う意味は無いな
>>911 予期しないでかいデータを入力したらぶっ飛ぶようなプログラムは五万とある。
でも、それは必ずしも不正なプログラムではない。
だからと言って不正なものをそのままにしていい理由にはなんねーよw
まぁ、何事も完璧はなく、ユーザが問題の起こらない範囲内で使うというのは分かるが ユーザが必ずしもその仕様を知っているとは限らない。プログラマ側が適切に 処置を施す必要があるわけだから、何を 常識 かなんて、自分の都合で 言われても、通用しないんだなぁ、これが。
>>913 ちょっと頂けない意見だな。君は脆弱性を残し、穴を開けたままにしておくのか?
プログラマとしてではなく、他へ行っても通用しない意見だぞ。言動を慎め。
ってか、宿題スレの一言居士か、君は?
>>913 何を基準に 予期していない としているんだね?
自分の知識や経験で考えられるものじゃ駄目だぞ。
そのもの自身が受けるもの全て、あるいは限度で考えてみるべきだし
例え巨大なデータでも、処理に時間は掛かるが当然それに応じた
対策はしてあるものもあるでしょ。昔は穴だらけだったが、それも
ユーザからの報告で、徐々に解消されてきたんだから。
少なくとも、視野の狭い自分が考えられる範囲内で物を言っても
結局穴があれば突かれて当然だろ?
にしても、まだ君は gets を擁護するのかね?あのスレでも
最後の方で叩かれたのに?向いてないぜ、あんた?
gets()は全く擁護するに値しないが、限定的にはstrcpy()は使える。
strlcpyを毛嫌いする人たちもいるね。
きちんとサイズが管理できてれば問題ないしな。
921 :
896 :2008/06/26(木) 10:06:54
922 :
89 :2008/06/26(木) 11:41:48
浮動小数点数は実数そのものではなく、あくまで実数のシミュレーションに過ぎない 誤差は当然のように出てくるし、何度も加減乗除を繰り返す高度な数値計算では とうぜんその誤差は積み重なってでかいものになってくる
924 :
89 :2008/06/26(木) 12:57:18
誤差のレベルじゃないぐらちがくなるんです・・・
ならどっちかが間違ってるんだろう
>>912 うーん。
危険なものが事件を起こさないことが保証されている場面においては
安全策のコストがない分速いんだよね
事故を起こす可能性がある場面においては安全なものを使用すればいい
>>913 は対策されてないものもあるといっていて
>>917 は対策してあるものもあるといっている
なんら対立する理由がないと思うんだが、なんで喧嘩腰?おちつけってw
動的に確保した二次元配列の解放部分を自作関数化するとエラーが出るのですが、 main関数内にそのまま解放部分を書くとエラーが出ません。 何故エラーが出るのかが分かりません。 /* 解放部分自作関数化 */ void DeleteHeap(char ***ptr) { for(int i=0; i < 2; i++) { free(ptr[i]); ptr[i] = NULL; } free(*ptr); *ptr = NULL; } int main() { char **ptr; ptr = (char **)malloc(sizeof(char *) * 2); for(int i=0; i<5; i++) { ptr[i] = (char *)malloc(sizeof(char) * 5); } strcpy(ptr[0],"ABC"); strcpy(ptr[1],"EFG"); /* 解放部分 */ for(int i=0; i < 2; i++) { free(ptr[i]); ptr[i] = NULL; } free(*ptr); *ptr = NULL; return 0; }
エラーメッセージは? あとvoid型なんだからreturnは消そう
グローバル関数でptr宣言して自作関数でfreeしてみ
for ループの i は5じゃなくて2だろ。 そして、 free(ptr); ptr = NULL; DeleteHeapの引数も*2個でいいのでは
int main() : : : :return 0; }
933 :
931 :2008/06/26(木) 17:16:49
ってDeleteHeapの呼び出し無いからmainしかみて無かったわ DeleteHeapの中の free(ptr[i]); ptr[i] = NULL; は free((*ptr)[i]); (*ptr)[i] = NULL; これでどう
解放部分をDeleteHeap(&ptr); としてみたけど特にエラーは出なかったよ。 もとのfree処理を残したままだと2重解放でダメだけど、どうかな。
>>928 日本語で書いてみるのが早道かも。
main()関数仕様
1.char *型要素の大きさ2の配列を確保しそのポインタを
ptrにセット。
2.1.で確保したchar*配列の0番目から4番目の要素に対し
char型の大きさ5の配列を確保しそのポインタをptr[i]
(i=0..4)にセット(i=2,3,4はアクセス不能領域を指しているが
無視する)
3.ptr[0],ptr[1]に"ABC","EFG"を設定
4.ptr[i](i=0,1)を解放
5.ptr自体が指している大きさ2のchar*配列を解放
(この時メモリリーク( ptr[2] ptr[3] ptr[4])が発生している)
2.の操作に問題があると思われ。他の箇所には問題がないような
感じ
>>930 グローバル変数にしたところ問題は解決しました。
解決出来たのですが、解決出来た理由が分かりません。
>>931 forループ内iは2でした。すみません。
main内の解放処理を
free(ptr);
ptr = NULL;にしてみました。
>>エラー内容
プロジェクトX.exeの0x00413733でハンドルされていない例外が発生しました。
0xC0000005:場所0x00000000を読み込み中にアクセス違反が発生しました。
というダイアログが出ました。
>>933 解決出来ました。
解決出来たのですが、解決出来た理由が分かりません。
>>934 私の環境はVS2005,WindowsXPですが、
DeleteHeap関数呼び出しの際はmain関数内の解放処理は省いています。
>>936 優先順位表を確認だ。
*ptr[1] と (*ptr)[1] は違うぞ(0はたまたま同じだが)
938 :
934 :2008/06/26(木) 19:09:44
>>936 エラーが出るコードを載せてもらえませんか?
こちらはVS2003です。
939 :
デフォルトの名無しさん :2008/06/26(木) 19:15:45
もう何十年も"Hello World"の次の段階に進めません。 次は何をすべきですか?
>>939 次はputs("good-by world!")を覚えましょう
943 :
930 :2008/06/26(木) 19:37:24
>>936 void fx(void);
int main()
{
FILE *fw=fopen("samp.txt","w");
fx();
return 0;
}
void fx(void)
{
fclose(fw);
}
これと似たようなもん
香ばしい
>>941 void input(goods *mono);//価格の入力
void input(goods*){
この辺、変かな。
あと、グロバールとローカルの変数名一緒はやめたが良いよ。
>>928 ポインタを通して操作している実体がなんであるかを確認しないで処理をしているからである。
void DeleteHeap(char ***ptr) {
for(int i=0; i < 2; i++) {
free(ptr[i]);
ptr[i] = NULL;
}
free(*ptr);
*ptr = NULL;
}
ここで *ptr は、「 ptr の指している char ** 型の変数」であり、malloc() された領域を指している。
だから free(*ptr) は正しい。
しかし、ptr[i] は、「 ptr の指している char ** 型の変数から数えて i 番目の char ** 型の変数」である。
そして、たぶんその変数は実際には存在しない。だから free(ptr[i]) したり ptr[i]=NULL としたら、問題がおきる。
本当にやりたいことは、「 ptr の指している char ** 型の変数が指している char * 型の変数から数えて i 番目の char * 型の変数」が
指している領域を開放することである。そこで正しいコードは free((*ptr)[i]) となる。
>>941 > コンパイラは何のエラーメッセージも出さないんですが
修正は947がやってくれてるけど、元のはgcc4.2.3で
c:38: error: parameter name omitted
って出る。 使ってるコンパイラが何か気になる。
>>945 >>947 ありがとうございました
スペルミスの訂正だけで一応動くことは動きましたが
他にも色々改善すべきところがあったんですね
ってか&と%間違ってたとか全然ダメダメですね
>>948 borland c++ 5.5.1です
gccってやつがかなりメジャーっぽいのでそっちにしとけばよかったかと思うこともあったりなかったりです
関数のプロトタイプや定義についての質問です。 [記憶クラス指定子] [戻り値型] [関数名] [引数] のような書き方、例えば static int foo(void); この戻り値型の次を一行開けている場合がありますが、 何か意味があるのですか?
関数定義が検索しやすくなるんじゃないでしょうか
関数の定義を探すときに「行頭+関数名」で探せる。 スタイルの問題はあまり意味を考えないほうが良いよ。だいたいくだら ないから。
>>950 おそらく、関数名を見つけやすいというメリットからだろう。
そこんとこは、コーディングスタイル(規約)にかかわるところ。
俺がかつて見たのでは、関数の引数を行分けして、各行に引数のコメントを書くというのがあった。
int foo(
int n, /* ・・・ */
char* s /* ・・・ */
);
そうも書けるのがC言語。
ブロックコメントが実装されててそうかけない言語があったらびっくりですお ラインコメントでもいいけどね
>>953 K&R時代の名残り(つーか、遺物)もよく使うな。
char *new_p; char *old_p; という変数があったとして、 new_p = old_p = malloc(sizeof(char)); と old_p = malloc(sizeof(char)); new_p = old_p; って同じことですよね?
>>816 亀レスだが、n番目(n=1,2,3,...)はLRどちらかを計算。
#include <stdio.h>
#include <math.h>
char dra(int n){
while(n%2==0){n/=2;}
return (n%4==3)?'R':'L';
}
int main(void){
int i,order;
printf("位数 = ");
scanf("%d", &order);
for(i=1; i<pow(2,order); i++){
putchar(dra(i));
}
return 0;
}
>>816 便乗
言われたように作ったつもりではある
付け加えるn-1の反転+逆って結局真ん中のLがRになるだけと認識
#include <stdio.h>
#define TRUE 1
#define FALSE 0
/*n:試行回数 is_rv:TRUE(正順) FALSE(反転+逆順指定)*/
void DragonCurve(int n,int is_rv){
if(1 == n){
printf("%s",(TRUE == is_rv)?"L":"R");
return;
}
DragonCurve(n-1,TRUE);
printf("%s",(TRUE == is_rv)?"L":"R");
DragonCurve(n-1,FALSE);
return;
}
int main(void){
int n;
do{
printf("整数を入力(0で終了):");
scanf("%d",&n);
DragonCurve(n,TRUE);
printf("\n");
}while(0 != n);
}
>>816 じゃ、俺も便乗。
842をちょっと修正して、816の指定に合わせただけだけど。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i, j, n;
char *p;
scanf("%d", &n);
p = calloc(1 << n, 1);
for(i=0; i<n; i++) {
int l = (1 << i) - 1;
p[l] = 'L';
for(j=1; j<=l; j++) p[l+j] = 'L' + 'R' - p[l-j];
printf("%d = %s\n", i+1, p);
}
free(p);
return 0;
}
>957 一般的にはそうです
>>910 >>905 >>913 < こいつ鬱陶しいな。ろくに答えもせず
既に一般的に知られている問題点に対して、問題の起こらない
使い方をすりゃ良いとか、理解力の無い奴が口出しすると
泥沼に嵌る意味がよーく分かるわ。まだこいつ人生経験も浅い
青二才だろ。言動が自分勝手すぎ。この世の中で
自分の頭の中、自分の経験、知識、考察力なんてちっぽけなもんだぞ。
しかし、これは誰が何を言おうと、実際に起こるわかりきったトラブルだから
それが理解できないなら、プログラマーなんてやめとけ、適性がなく
自分が犯したミスもPCのせいにするんだろ?
#include <stdio.h> int main(void) { char str[2][4]; printf("Input \"abcd\" > "); gets(str[0]); printf("Input \"efgh\" > "); gets(str[1]); printf("%p str[0] : %s\n",str[0],str[0]); printf("%p str[1] : %s\n",str[1],str[1]); return 0; }
>>962 プログラムには誤動作に対する許容度というものがある。
>>962 PC再起動すれば直る問題もあるだろ
あんなんもダメなんか、短気だなおまえ
そいつに触るな
>>962 関数には定義域というものがあってだな、定義域とその範囲内での動作が完全に定義されてればいいんだよ。
>>962 おもしろいなあwためしにgetsが「なぜ」だめなのか説明してみて?
ぐぐれとか一般的にだめだといわれているからとかは望んでないからね。
962の人気に嫉妬
971 :
ねこ :2008/06/27(金) 18:22:33
こんにちは。私は、大学1年生です。学校の課題で数あてゲームをつくり、レポートを提出しなければなりなせん。 プログラムはコピーさせてもらいました。なので、わからないことが多いです。 選ばれる数字は3桁で100から999です。なぜ、プログラムにはrand()%900+100;とかくのでしょうか。 教えてもらえますか?? これがプログラムです。 #include <stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int secret_number; int guess_number; int n, all; all = 0; while(1){ srand(time(NULL)); secret_number=rand()%900+100; n = 0; while(1){ printf("☆好きな数字を入力してね☆:"); scanf("%d",&guess_number); if(guess_number !=secret_number){ printf("ぶー\n"); n++;
どんな整数でも900で割った余りは0〜899の間になるでしょ? その余りに100足せば100〜999と言うお望みの数になる
rand() は 0から RAND_MAX (32767) までが返る これを 900で割った余りを求めれば、答えは 0から899までになるだろう。 それに100足すと、100から999までになるでしょ。
struct hoge { char *p; int n; }; で、 main() { struct hoge *a; a = (struct hoge *)malloc(sizeof(struct hoge)); memset(a, 0, sizeof(struct hoge)); ... if (! a->p) {} } というようにメンバにポインタがある場合、構造体はmemsetで初期化してはいけないのでしょうか? a->pはNULLで初期化されていないのでしょうか?
>>974 俺は構造体にポインタがあってもまとめて0で初期化している
個別のポインタはNULLで初期化する
使ってるコンパイラは0とNULLが同じようだから気にしてないが
>>974 NULL になるかもしれないし、ならないかもしれない
コンパイラによって異なる
コンパイラの違いに振り回されたくなければ a->p = NULL; などと書くべき
特定のコンパイラしか使わないと決めていて今後他のものに移植したりしないつもりなら別に構わないかも
C規格はポインタや不動少数点数の内部表現について規定してないので、 memsetでゼロを埋めたときにゼロになることを期待していいのは整数型だけ それ以外のものは全てa->p=NULLとかa->f=0.0のように初期化するのが作法 そういうメンバが多くていちいち初期化して回るのがだるいという場合は、 初期化用のマクロを書くか、あるいはたとえばstruct hoge hoge_d={NULL,0};みたいな グローバルな初期状態の構造体を作っておいて、*a=hoge_d;みたいにする
#define HOGE_INIT(hoge) (hoge.a=NULL, hoge.n=0)
switch文のcase要素が60個あるのですがこれは ifに書き直したほうがいいですか?
switch(state){ case 1:{ func1(); break; } } このcaseがあと59個と別のfuncが59種類それぞれ 呼ばれます
switchのままで良いと思うよ あと case文に中括弧は要らない
>>983 struct {
int (*func)(void);
} fs[] = {
NULL, /* 0 */
func1, /* 1 */
...
func60, /* 60 */
};
...
(*fs[state].func)();
...
関数のポインタでぐぐれ
>>983 void (*func[61](void) =
{
func0,
func1,
func2,
};
func[state]( );
case 1:func1();break; case 2:func2();break; みたいに横並びにすればswitchでもそんなに悪くない 値と関数名が対応してなさそうならむしろいい気もする
switch のままの方がいい気がする
switchで60個caseがあると最悪の場合60回評価が行われるのでしょうか?
関数呼ぶだけのswitchなら関数配列でいいんじゃない
イーアルカンスー
>>992 数値が連続していて、負数とか配列サイズ以上の数値になる可能性がないならそれでもいいと思うよ
if 文でチェックしまくるよりは default 使ったほうがスッキリ(完全な主観です^^;)するから
どっちもオーダー1ですよね?
関数ポインタの配列にすれば色々メリットもあると思うけど、 関数呼出しが必要ない場合とか、、まあ考えてなさそうだからいいよねw
998 :
デフォルトの名無しさん :2008/06/27(金) 21:32:22
999
1000 :
デフォルトの名無しさん :2008/06/27(金) 21:34:07
1000なら優秀なプログラマになれる
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。