プログラミング演習IB

プログラミング演習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されるファイルが変わる。ないとエラーになる。
変数宣言の仕方
①変数の宣言のしかた
char c; cという変数を整数で宣言する。 -127~127
int i;
iという変数を整数で宣言する。 -32768~32767
double a; aという変数を実数として宣言する。 1E308~1E-307
②配列 複数のデータをひとつの変数に格納できます。
int data[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型で宣言する*/
double x;
/* 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
NO
if(A>0)
{
YES
printf(“Aは正です\n”);
printf(“Aの正です\n”);
};
条件分岐 if
例)変数Aの中身が正であったら、Aは正ですと出力し、そうでなかったら
Aは正ではありませんと出力する。
A>0
NO
YES
printf(“Aは正です\n”);
printf(“Aは正では
ありません\n”);
if(A>0)
{
printf(“Aは正です\n”);
}
else
{
printf(“Aは正ではありません\n”);
}
プログラム文例2 条件分岐
#include <stdio.h>
main()
{
scanf(“%d”,& i);
例題 変数iが1か2かそれ以外かを判断して
出力する。
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<=B
A>=B
A==B
A!=B
AはBより小さい
AはBより大きい
AはBよりちいさいか、等しい
Aは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>
例題 変数iが1か2かそれ以外かを判断して
main()
出力する。
{
scanf(“%d”, i);
switch(&i)
{
case 1: printf(“1です。\n”);
break;
case 2: printf(“2です。\n”);
break;
default: printf(“1,2以外です。\n”);
break;
};
}
繰り返し文 for
for( 式1; 条件式; 式2)
{
文;
};
例 文の内容を10回繰り返す
for(i=0;i<10;i++)
{
文;
};
式1を実行
文
条件式
NO
YES
式2
繰り返し文 while
while(条件式)
{
文;
}
例 1から10まで足し合わせる。
int i=1,total=0;
while(i<10)
{
total=total+i;
i=i+1;
};
条件式
YES
文
NO
文例3
10個の整数配列にキーボードからデータを読み込む。
#include <stdio.h>
main()
{
int data[10];
int i;
条件式が1になっているので無限ループ
while(1)
{
scanf(“%d”, &data[i]);
i=i+1;
Break文をみつけてwhile文から抜け出す
if(i==10)break;
};
}
文例4 10個のデータの合計を求める
#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“);
GOOD EVENING■
printf(“最高は%dです。”,saiko);
最高は100です。■
printf(“最高は%dで、最低は%dです\n”,saiko,saitei);
最高は100で、最低は0です。
■
よく使う関数 scanf
キーボードから数値や文字列を読んで変数を格納する。
scanf(“
“, &A,& B,..);
書式設定文字列
読み込む変数の数と型を指定
%d 整数
%lf 実数
%s 文字列
変数
変数に&をつける
数学関数
使うときには#include<stdio.h>をつける
関数名
機能
sin(x)
xのsin。単位はラジアン。
cos(x)
xのcos。単位はラジアン。
atan2(y,x)
y/xのarctan。単位はラジアン。
exp(x)
指数関数exp
log(x)
xの自然対数(基数はe)。(x>0)
log10(x)
xの普通対数(基数は10)。(x>0)
pow(x,y)
xy
sqrt(x)
xの平方根。(x>=0)
fabs(x)
xの絶対値。
文字列の取り扱い


文字列とは“ ”で囲んで標記 “Hello”
文字列はchar型の配列に格納する。
char s[10]={“Hello”};
0 1
s

2
3
4
5
6 7 8 9
Hel l o0
文字列を処理するときは専用関数で。
strcpy、strcmpなど
文例5
#include <stdio.h>
main()
{
char S[25];
プログラミング演習1
あなたの入力した文字列は
「プログラミング演習1」です。
■
scanf("%s", S);
printf(“あなたが入力した
文字列は、\n「%s」です。\n", S);
}
関数の作り方
① 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の講義範囲である。実は
これまでの知識があれば大概の計算はでき
る。どんどん実験や演習で計算に活用して
いこう。

ちなみにプロⅡ、Ⅲでは、次のことを習う。
ポインタ
大規模なメモリやデータが
構造体
扱えるようになる。
ファイルの入出力
バグ取り
よくあるミスの例
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];
0 1
2
3
4
5
6 7 8 9
data
ここで 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
20
20
20
60
60
60
60
20
40
ソートにだっていろいろやり方がある。

Hirose法
最高点をみつけて最低点ゼロに置き換えていく。
30
30
30
0
40
40
0
0
20
20
20
20
60
0
0
0
最高点60
最高点40
最高点30
最高点20
最後に
これからもわからないことがありましたら、遠慮
なく廣瀬に質問してください。わかる範囲でお答
えします。
廣瀬の連絡先
[email protected]
廣瀬のHP
http://fhirose.yz.yamagata-u.ac.jp