みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

C言語 おもしろコンテンツ

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

C言語 おもしろコンテンツ

投稿記事 by みけCAT » 9年前

C言語関連の用語を適当にググっていたら見つけました。
あかかげまるのC言語入門
かなり面白い(funny的な意味で)内容だったので、紹介します。

※誤字脱字はありすぎるので、基本的にスルーします

あかかげまるのC言語入門
まずはトップページから、いきなりおかしなことが書かれています。
Cを書いてみるのに必要なもの
1. コンパイラ
2. メモ帳
3. 根気
いやどう考えてもメモ帳いらないでしょ。メモ帳縛りとか全力でお断りします。
まず1のコンパイラとは、プログラムをまずメモ帳などに記載して、任意のファイル名.cとして保存し、パソコンが読める様に機械語に変換及びファイル名.exeファイルを生成する作業になります。
デタラメすぎ。「コンパイル」の説明だとしても、明らかにソースファイルの保存はコンパイルではありません

C言語 出力(printf)の復習
メモ帳に上のソースを書いて見てください。出来れば、コピー&ペーストではなく気ボードから手入力すると、最初の#include とか  とかを徹底して覚えたほうが早く飲み込めると思います。
ここ自体はおかしくないですが、「手入力」これは伏線です。後で回収します。
最後に printf で出力したい部分は 必ず("出力させたい文字等"\n);
※ カッコ ダブルクウォート 【出力させたい文字等】 ダブルクウォート \n 閉じカッコ セミコロン
と覚えておくと良いようです。
良くないです。(少なくとも今の常識では)完全に間違っています。コンパイルエラーになります。
このページの上のコードとも矛盾しています。
…こう覚えておくと、書くときは正しく書ける特殊な脳の持ち主なのかな?※効果には個人差があります

C言語 変数値の代入プログラムで簡単な計算

CODE:

#include 
main()
{
     int a;

     a=10;

     printf("%d\n",a);
}
早速先ほどの伏線回収です。なんとサンプルコードに全角スペースが含まれています。
おそらく、コピペで手を抜こうとした人をこらしめるためでしょう。
(今のところ)メモ帳を使うと全角スペースは表示されない(フォントによる?)ので、
サクラエディタなどを使った場合と比べて発見が遅れるでしょう。
下の例 で 【 int a; 】と宣言しています。コンパイラにこれから【 a 】と言う整数を格納する場所を使いますと書いてあげないと言う決まりです。
いや、ちゃんと書いてあげないとダメでしょ。
おそらく誤字でしょうが、逆の意味になっています。プログラムを書くときも気を付けないといけないですね。

C言語 数値を入力してみる(scanf)
【 scanf 】関数を使い変数に代入する場合は必ず &をつけないといけない決まりです。(&の後ろは宣言した変数文字例を指定ます。)
必ず&をつけないといけない決まり…なんか怪しいなあ…

CODE:

#include 

int main(void) {
  int a;
  int *p = &a;
  scanf("%d", p);
  printf("%d\n", a);
  return 0;
}
でも、これは「変数に代入」とは言えないのか…?
と思っていたら
【 scanf 】関数を使用する場合は、変数の前に必ず【 & 】が必要です。akakagemaru汚染の部分ですね。
自分で汚染だと認めてしまいました。
C言語をちゃんとわかっている皆さんは、このような汚染に影響されてはいけませんよ。
最後の出力ソースで、%fの後ろにドットが必要となります。下図参照。実行の際ドットが無い場合にエラーとなります。
そんなルールは聞いたことがありません。
試しにIdeone.comで実行してみましたが、ドットがあっても無くてもreturn 0;をしないとRuntime Errorとなり、
return 0;をするとSuccessになり、出力も正常でした。
ちなみに、この上のプログラムの二重引用符の位置が間違っています。
きっと先ほどの間違った覚え方により、間違ったコードを書いてしまったのでしょう。
さらに、スクリーンショットのコードは円周率が間違っており、実行結果も「ちゃんと」間違っています。
出力数値の後ろにドットが出力されてしまいますが、これは決まりなにで気にしなくていいようです。
いや、気にしろよ。「決まり」と主張するのなら、何か出典があるのでしょうか?
そうでなければ、「ドットじゃなくて半角スペースなら?何も文字列が続かないなら?」などの実験はしなかったのでしょうか?

C言語 gets関数を使用した安全な数値入力
最初に気がついた爆弾コンテンツ。
gets関数を使用している時点で
安全なわけがない。

さらに
配列【 bb[80] 】(任意の字牌列数でOKです)を作成し、【 gets(bb) 】にて文字列として、数値文字を取得。
「字牌列数」というのは意味がわかりませんが、文脈から考えて要素数のことと考えるのが自然でしょう。
「任意の要素数でOK」ということは、当然1でもいいのですよね?
…はい、バッファオーバーラン不可避です。

安全に数値の入力を受け取るなら、やはりgetcharで1文字ずつ読み込み、
オーバーフローのチェックなどをしながら、
構文解析(数値1個だけならそれほどではないですが)をするのがいい気がします。

C言語 文字型変数宣言charと配列
出力の際通常【 printf 】関数を使いますが【 getchar 】関数を仕様した場合は必ず【 putchar 】を使うと言う決まりがあります。
!?!?!?
そんな決まりは聞いたことがありません。
筆者の俺ルールですよね?ね?ね?ね?ね?ね?ね?ね?ね?ね?ね?ね?

CODE:

int puts(char*);int main(void){for(;;)puts("ね?");return 0;}
C言語 if条件に当てはまるなら実行する条件文
また条件を開始する 【 { 】カーリーブラケット、条件の終わりをを示す【 } 】カーリーブラケット閉じるが必ず必要になります。
C言語の仕様としては違う気がしますが、コーディング規約としては妥当でしょう。
他の場所と比べておかしくはありません。

C言語 else if 多方向分岐させる
【 rand 】0~32768乱数を発生させる数学関数を使い、6の剰余(割った余り)を求めさせます。
randが返す値の範囲は環境依存です。
試しにIdeone.comで

CODE:

#include 
#include 

int main(void) {
	srand(1);
	printf("%d\n",rand());
	return 0;
}
というコードを実行したところ、1804289383が出力されました。

CODE:

     else if(a >= 7){
      printf("1~6です\n");
     }
なぜ少なすぎる方はチェックしなかったのか…?

C言語 switch多方向分岐(二ページ目)
ss[0]にY又はNいじゃ居の文字列又はss[1]~ss[78]なにか入力された場合はその他を実行します。
どこにも「ss[1]~ss[78]になにか入力された場合はその他を実行」という判定は入っていないようです。
実行結果ではこのテストケースを全力で避け、ごまかしているようですね。
テストはきちんとしましょう。

C言語 配列と文字配列の初期化
変数の初期化の場合は 例【 int a = "123"; 】変数に直接代入する形なのでわかりやすいですが
全力で数値型変数にポインタを代入していくスタイル。
C言語なら(コンパイルオプションにもよるが)警告ですみますが、C++ならエラーです。
例2 【 char g[] = {'A', 'B', 'C', 'D'}; 】
以下のように確保&初期化されます。
[table=border:1px solid #cccccc;width:80%;][tr=background-color:#ffff00;color:#000000;text-align:center;][td=border:1px solid #cccccc;]g[0][/td][td=border:1px solid #cccccc;]g[1][/td][td=border:1px solid #cccccc;]g[2][/td][td=border:1px solid #cccccc;]g[3][/td][td=border:1px solid #cccccc;]g[4][/td][/tr]
[tr=background-color:#00ffff;color:#000000;text-align:center;][td=border:1px solid #cccccc;]A[/td][td=border:1px solid #cccccc;]B[/td][td=border:1px solid #cccccc;]C[/td][td=border:1px solid #cccccc;]D[/td][td=border:1px solid #cccccc;]0[/td][/tr][/table]
されません。Ideone.comで

CODE:

#include 

int main(void) {
  char g[] = {'A', 'B', 'C', 'D'};
  printf("%u\n",(unsigned int)sizeof(g));
  return 0;
}
を実行したときの出力は「4」でした。

C言語 二次元配列
二次元配列のサンプル(整数型(int)、実数型(double)、文字列型(char)のサンプルをそれぞれ用意しております。)

CODE:

int mydt[2][2];

double mydt[2][2];

char [2][2];
いや、char型の場合もちゃんと変数名を書かないといけないはずです。
三次元配列でも同様です。

C言語 forを使った繰り返し条件(ループ)
【 for 】分も前回勉強した【 if 】分と同様、条件の後ろには【 ; 】セミコロンをつける必要はありません。
間違いです。for文の「条件」の後ろにはセミコロンを付けないといけません。
下のサンプルではちゃんとセミコロンが付いています。

C言語 continueループをスキップさせる
多重ループ と 【 contiune 】文サンプルです。

CODE:

#include 

   int main(void)
{
   int i;

   printf("終了文 break のテスト\n");
   for(i=1; iにて【 #define RAND_MAX 0x7fff 】と定義されており、これを十進数で表現すると【 32767 】になり、0~32767までの乱数を発生させることになります。[/quote]
そもそも環境依存なのですが、さっきは0~32768と言ったのに矛盾しています。

[hr]
結論:とりあえずあからさまな誤字脱字くらいはチェックしようよ…。

アバター
海Sea
記事: 102
登録日時: 13年前

Re: C言語 おもしろコンテンツ

投稿記事 by 海Sea » 9年前

すさまじいツッコミの嵐(笑)

アバター
nullptr
記事: 239
登録日時: 12年前

Re: C言語 おもしろコンテンツ

投稿記事 by nullptr » 9年前

バカが知識を披露するとこうなる(自戒)

アバター
夢幻ノ月夜
記事: 143
登録日時: 9年前

Re: C言語 おもしろコンテンツ

投稿記事 by 夢幻ノ月夜 » 9年前

これはさすがに突っ込みどころが多すぎて突っ込む気になれない