370 likes | 514 Views
プログラミング演習 IB. これまでのおさらいと補足事項. C 言語プログラムの実行の仕方. テキストエディタでプログラムを作成し、拡張子に .c をつけたファイルをセーブする。 Unix では cc 名前 .c( リターン) で、実行ファイル a.out が形成される。それをコマンド画面で a.out (リターン)で実行される。. 重要知識 コンパイラー テキストのプログラムを翻訳して機械語のコードを発生させる コマンドのこと リンカー コンパイラで生成した機械語ファイルを連結して実行ファイルを作る
E N D
プログラミング演習IB これまでのおさらいと補足事項
C言語プログラムの実行の仕方 • テキストエディタでプログラムを作成し、拡張子に.cをつけたファイルをセーブする。 • Unixでは cc 名前.c(リターン) で、実行ファイルa.outが形成される。それをコマンド画面でa.out(リターン)で実行される。 重要知識 コンパイラー テキストのプログラムを翻訳して機械語のコードを発生させる コマンドのこと リンカー コンパイラで生成した機械語ファイルを連結して実行ファイルを作る プログラムのこと テキストエディター テキストファイルを作成するプログラム。
C言語のスタイル • #で始まるのはコンパイルするための指示語である。 #include <stdio.h > 関数の定義ファイルを読み込む #define A B プログラム中にAという文字列が出てきたらBと読み替える。 • 必ずmain()関数が存在する。 • { }は対になっており、{ }の中に実行内容を書く。 • コメント文は /* */で区切る。
#include って何 • 標準関数を関数を使うときに、ファイルの頭でこの文をいれて定義ファイルを読み込む。 <stdio.h> 標準入出力の関数を使うとき printf, scanf, getch, fopenなど <math.h> 数学関数を使うとき sin cos log expなど <string.h> 文字列処理。 strcpy 使いたい関数によってincludeされるファイルが変わる。ないとエラーになる。
変数宣言の仕方 ①変数の宣言のしかた charc;cという変数を整数で宣言する。 -127~127 inti;iという変数を整数で宣言する。 -32768~32767 double a; aという変数を実数として宣言する。 1E308~1E-307 ②配列 複数のデータをひとつの変数に格納できます。 intdata[10]; 整数10個の変数をdataという名前で宣言する。 data[0], data[1], data[2], ・・・・,data[9] までの変数がつかえるようになります。
プログラム文例1 11/7例題 #include <stdio.h> main() { int a, b, c; /* a,b, c をint型で宣言する*/ doublex;/* xをdouble型で宣言する*/ a=3; b=2; /*足し算の実行*/ c=a+b; printf(“tashizan %d\n”,c); /*足し算した値を出力*/ /剰余の実行*/ c=a%b; pirntf(“jouyo %d\n”,c); /*剰余の出力*/ /*わり算の実行*/ x=(double)a/(double)b; printf(“warizan2 %lf\n”,x); /*doubleに型を変換してわり算する*/ }
条件分岐 if 例)変数Aの中身が正であったら、Aは正ですと出力する。 A>0 if(A>0) { printf(“Aは正です\n”); }; NO YES printf(“Aの正です\n”);
条件分岐 if 例)変数Aの中身が正であったら、Aは正ですと出力し、そうでなかったら Aは正ではありませんと出力する。 if(A>0) { printf(“Aは正です\n”); } else { printf(“Aは正ではありません\n”); } A>0 NO YES printf(“Aは正では ありません\n”); printf(“Aは正です\n”);
プログラム文例2 条件分岐 例題 変数iが1か2かそれ以外かを判断して 出力する。 #include <stdio.h> main() { scanf(“%d”,& i); if(i==1) printf(“1です\n”); if(i==2) printf(“2です。\n”); if((i!=1)&&(i!=2)) { printf(“1,2以外です。\n”); }; }
プログラム文例2 条件文の書き方 if文の()内は次のような条件文となる。書式は次のとおり。 A<B AはBより小さい A>BAはBより大きい A<=BAはBよりちいさいか、等しい A>=B AはBより大きいか、等しい A==BAとBは等しい A!=B AとBは等しくない (A>B)&&(C>D) A>BでかつC>D かつ (A>B)||(C>D) A>BまたはC>D または 間違えやすい
条件文 switch文 こんなのもある。でも知らなくても 十分プログラムはかけるよ。 #include <stdio.h> main() { scanf(“%d”, i); switch(&i) { case 1: printf(“1です。\n”); break; case 2: printf(“2です。\n”); break; default: printf(“1,2以外です。\n”); break; }; } 例題 変数iが1か2かそれ以外かを判断して 出力する。
繰り返し文 for 式1を実行 for( 式1; 条件式; 式2) { 文; }; 文 YES 式2 条件式 例 文の内容を10回繰り返す for(i=0;i<10;i++) { 文; }; NO
繰り返し文 while NO 条件式 while(条件式) { 文; } YES 文 例 1から10まで足し合わせる。 int i=1,total=0; while(i<10) { total=total+i; i=i+1; };
文例3 10個の整数配列にキーボードからデータを読み込む。 #include <stdio.h> main() { int data[10]; int i; while(1) { scanf(“%d”, &data[i]); i=i+1; if(i==10)break; }; } 条件式が1になっているので無限ループ Break文をみつけてwhile文から抜け出す
文例410個のデータの合計を求める #include <stdio.h> main() { int i=0; int total=0; int data[10]={15,25,10,5,3,80,54,100,5,10}; while(1) { total=total+data[i]; i++; if(i==10)break; } printf(“合計は%d\n”,total); }
よく使う標準関数 printf 画面に出力をする万能関数である。 printf(“ “, A, B,..); 書式設定文字列 変数 出力したい文字列 変数の出力位置、形式を指定 %d 整数 %lf 実数 %s 文字列 \n 改行
よく使う標準関数 printf 出力例 printf(“GOOD EVENING“); printf(“最高は%dです。”,saiko); printf(“最高は%dで、最低は%dです\n”,saiko,saitei); GOOD EVENING■ 最高は100です。■ 最高は100で、最低は0です。 ■
よく使う関数 scanf キーボードから数値や文字列を読んで変数を格納する。 scanf(“ “, &A,& B,..); 書式設定文字列 変数 読み込む変数の数と型を指定 変数に&をつける %d 整数 %lf 実数 %s 文字列
数学関数 使うときには#include<stdio.h>をつける
文字列の取り扱い • 文字列とは“ ”で囲んで標記 “Hello” • 文字列はchar型の配列に格納する。 char s[10]={“Hello”}; s H e l l o 0 • 文字列を処理するときは専用関数で。 strcpy、strcmpなど 0 1 2 3 4 5 6 7 8 9
文例5 #include <stdio.h> main() { char S[25]; scanf("%s", S); printf(“あなたが入力した 文字列は、\n「%s」です。\n", S); } プログラミング演習1 あなたの入力した文字列は 「プログラミング演習1」です。 ■
関数の作り方 ① main文の前に関数を宣言する。 型名 関数名(型名 引数変数, …) {…. return(返す値) }; 例)double tashizan(double x, double y) { double kekka; kekka=x+y; return(kekka); } ② 宣言した変数は{ }内だけで有効。 ③ 関数は計算だけではない。関数の中にいろいろな処理を書き込んでもよい。手続き関数。
文例6 #include <stdio.h> int tashizan(int i1, int i2) { return i1+i2; } main() { printf("%d\n", tashizan(10,20)); }
ここまでがプロ演Iの講義範囲である。実はこれまでの知識があれば大概の計算はできる。どんどん実験や演習で計算に活用していこう。ここまでがプロ演Iの講義範囲である。実はこれまでの知識があれば大概の計算はできる。どんどん実験や演習で計算に活用していこう。 • ちなみにプロⅡ、Ⅲでは、次のことを習う。 ポインタ 構造体 ファイルの入出力 大規模なメモリやデータが 扱えるようになる。
バグ取り よくあるミスの例 1 ; セミコロンを忘れる。 2 if(){ }; の文の中で)と{の間に;を入れ忘れる 3 cast忘れ。代入文で両辺が型が違っていないか。 4 スペルミス whale × → while ○ 5 { と }の不一致 6 条件文でif文の( )の中 等号は==
ミスを探してみよう #include <stdio.h>; mein(); { int ninzu=10; /*人数10人*/ int data[10]={54, 60, 75,,21,81, 90, 13, 64, 50,45}; int heikin; int i; /*繰り返し用*/ heikin=0; /*平均値を0に初期化しておく*/ /*合計を求める*/ fer(i=0;i<10;i++){ heikin=heikin+data[i]; heikin=(double)heikin/(double)ninzu; printf(“heikin ha %s \n”, heikin); }
/* */ 効果的なエラーの見つけ方 • エラーと思われる個所に/* */でコメント化してしまい、エラーの場所を無効化してしまう。 #include <stdio.h>; mein(); { int ninzu=10; /*人数10人*/ int data[10]={54, 60, 75,,21,81, 90, 13, 64, 50,45}; int heikin; int i; /*繰り返し用*/ heikin=0; /*平均値を0に初期化しておく*/ /*合計を求める*/ fer(i=0;i<10;i++){ heikin=heikin+data[i]; heikin=(double)heikin/(double)ninzu; printf(“heikin ha %s \n”, heikin); }
int data [10]; data 0 1 2 3 4 5 6 7 8 9 効果的なエラーの見つけ方 • セグメント例外というエラー これは配列の範囲外を使うと起こる ここで data[11]なんて使うとセグメント例外がおきる。
どうしたら上達できるのか • ひたすら演習をやるしかない。 教科書の例題⇒自分で考える⇒実行 ⇒模範解答⇒次の演習へ • 某社のプログラマー採用では、 これまで何行ぐらいプログラムを書いたかと 問われる。要はプログラミングの程度は量を どれくらいこなしたかで決まるのだ。
どうしたら上達するか2 • とあるプログラマー養成コースの例 実は集中してやる。 集中8時間×3日とか。教科書の例題を打ち込んで頭でプログラムの流れを読んで実行してみる。 3日あればこれでアルバイトができるレベルまで到達する。
実習のためにフリーソフトを活用 おもしろいよ FREEのCコンパイラがついてくる
インターネットサイトを活用して勉強する おすすめ http://www.asahi-net.or.jp/~yf8k-kbys/ http://www.nmn.jp/~hidai/c/ http://homepage1.nifty.com/toshio-k/prog/c/
実はプログラミングって楽しくない? • 自分で作ったとおりコンピュータが動いてくれるって感動しないか。 • やる気になれば人工知能だってロボットだって作れる。人間と対話する犬だって、たまごっちだってできる。ゲームを作って金儲けができる。 • いろいろな物理現象を自宅にいながらシミュレーションできる。興味があれば数値解析の授業を聴講してください。
シミュレーションの世界 MOSFET Visual-C++で実行したもの
前回演習 ソートプログラム • バブルソート 30 40 40 40 30 30 30 40 60 20 20 20 60 60 60 20
ソートにだっていろいろやり方がある。 最高点をみつけて最低点ゼロに置き換えていく。 • Hirose法 30 30 0 30 0 40 0 40 20 20 20 20 60 0 0 0 最高点30 最高点20 最高点60 最高点40
最後に これからもわからないことがありましたら、遠慮なく廣瀬に質問してください。わかる範囲でお答えします。 廣瀬の連絡先 fhirose@yz.yamagata-u.ac.jp 廣瀬のHP http://fhirose.yz.yamagata-u.ac.jp