モバイルプログラミング第2回

Download Report

Transcript モバイルプログラミング第2回

モバイルプログラミング第2回
C言語の基礎 (1)
C言語とは?
歴史


ケン・トンプソン(ベル研)が1970年に、Unix開
発言語として、B言語を開発
翌年デニス・リッチーが改良しC言語誕生
手続き型高級言語
マシン依存の実行ファイル

Javaとはことなる
Cプログラミングの基礎知識
コンパイルをしてみよう
データ型
関数 (引数、返り値)
条件文、繰り返し処理(if, for, while文)
配列
構造体
Cプログラムのコンパイル方法
1. mobile2.zip の hello_world.c を使いま
す
2. c:¥cygwin¥home¥ユーザ名 の下に
コピー
3. $ gcc hello_world.c
4. ./a.out
C言語の書式
#include <stdio.h> ←標準入出力ライブラリ
int main(void){
printf("Hello world!!\n");
return 0;
}
main関数は実行時に一番初めに呼ばれる特別な
関数
整数(int)型の値を返す
データ型
おさらい
符号付整数型
 short型(16bit): -32768から32767
 int型(32bit*): -2147483648から 􀃆
2147483647
浮動小数点型
 float型(一般的に32bit): 単精度
 double型(一般的に64bit): 倍精度
文字列
 char型(8bit):
関数の書式
書式
返り値 関数名(引数の型 引数の名前,・・・);
例
int plus(int, int);
int plus(int a, int b){
return a+b;
}
返り値や引数がない場合は
void となる
int four(void){return 4;}
実際に関数を作ってみる
func.c のプログラムに以下を追加する



引き算を行う minus 関数
掛け算を行う multiply関数
割り算を行う divide関数
補足
printf 関数は" "で囲まれた文字を出力する
printf("plus: %d + %d is %d\n",a, b, answer);
%d は引用符後の変数を表示します
\n は改行を表します
条件文 (if else文)
書式
if (条件式) {
条件式が正しい場合(真)の実行内容
} else {
条件式が違う場合(偽)の実行内容
}
else 文はなくても可です
条件文 (if else 文)
if.c を実行する
scanf(“%d”, &c); ←入力された数字を変数Cに代入
if(c < 5){
printf("number is < 5\n");
}else if(c == 5){
printf("number is 5\n");
}else{
printf("number is > 5\n");
}
条件式 (if else 文)
if.c を改変して、入力した値が奇数か偶数
かを判定する
剰余演算子(%) を用いると簡単にできま
す

ex) 5%3 = 2 (5 / 3 = 1・・・2)
7%3 = 1 (7 / 3 = 2・・・1)
繰り返し (for 文)
書式
for(初期値;条件式; 再初期化値){
実行内容;
}
繰り返し (for文)
for.c を実行する (1から10までの和、積が表示
される)
int sum = 0, mul = 1;
for (i=1; i<=10; i++) {
sum = sum + i;
mul = mul * i;
}
1が i の初期化値
i が 10以下になるまで{}をループ
ループのたびに i が 1ずつ増える
繰り返し (for文)
for.c を変更して100を割り切れる全整数を
表示する
100, 50, 25, 20, 10, 5, 4, 2, 1
剰余式を利用
繰り返し (while文)
書式
while(条件式){
実行内容;
}
条件式が真である場合、繰り返し実行
条件式が始めから偽である場合は1度も
実行されない
繰り返し (while文)
while.c を実行する (1から10までの和、積が
表示される)
i = 1;
while (i<=10){
sum = sum + i;
mul = mul * i;
i = i + 1;
}
繰り返し (while文)
while.c を変更して以下のように表示する
0
01
012
0123
01234
012345
0123456
01234567
012345678
0123456789
while 文をネスト
…
大量のデータを扱う(配列) a[0] 1
同じデータ型を複数並べたもの
データ型 配列名 [配列の大きさ];
ex) int array[10]
- 10だと4*10=40バイト
- array[0] ~ array[9]
a[1] 2
a[2] 3
配列
初期化方法



int cnt[4] = {6,10,31,76};
float x,y[] = { 2.1,1.8,4.5 };
char a[3]; a = { x, y, z };
実際にarray.cを実行する
int
int
cnt[2] = {6,10};
y[] = {1,2};
x = 3;
x = x + y[0];
x = cnt[0] + y[1];
y[1] = y[1] + cnt[1];
配列
新しいファイルarray2.cを作成し、以下のことを
実行するプログラムを作成しなさい。
以下のようなデータを持つ配列を用意し、
int data1[6] = { 10, 29, 53, 19, 3, 76 };
int data2[6];
data2 の配列へdata1の順番が逆になるよう、
data2 の配列へデータを格納しなさい。
ex) data2の1番目が76、
data2 の2番目が3、・・・
いろいろなデータを扱う(構造
体)
複数のデータ型を組み合わせて、新しく作
るデータ型
struct grade{
struct タグ名 {
データ型 メンバ名;
int id;
char name[20]; };
double avg;
};
構造体
struct.c を実行してみる
構造体の宣言
struct タグ名 変数名の並び;
struct grade student1;
struct grade student2[20];
構造体 cont.
構造体の初期化

構造体変数の初期化
{ } の間に、メンバ名をカンマで区切る
struct grade student1 = {4, "TANAKA", 80.5};

構造体変数の初期化
{ } の間に、メンバ名をカンマで区切る
struct grade student2[20] = {{1, "SUZUKI", 68.1 },
{2, "SAITO", 59.2 },
{3, "NAKATA", 48.4 }, };
構造体 cont.
構造体の参照
構造体変数名. メンバ名
printf("%d %s %5.1f\n\n",
student1.id, student1.name,student1.avg);
printf("%d %s %5.1f\n",
student2[i].id, student2[i].name, student2[i].avg);
student1.id = 5;
sutdent1.name = “HOGE”;
のように使用できる
構造体演習問題
新たにstruct2.c というファイルを作成し、以下の
処理を行なってください。
以下の表を構造体で表し、平均点を求めてく
ださい
番号 国語 数学 化学 英語 平均点
1111 69 50 70 96
71.25
2222 98 39 60 60
64.25
3333 89 78 88 90
86.25
4444 40 50 98 60
62.00
5555 63 60 89 95
76.75
構造体データ
{{ 1111, 69, 50, 70, 96, 0.0 },
{ 2222, 98, 39, 60, 60, 0.0 },
{ 3333, 89, 78, 88, 90, 0.0 },
{ 4444, 40, 50, 98, 60, 0.0 },
{ 5555, 63, 60, 89, 95, 0.0 },};
演習課題
提出方法:授業のWebよりアップロード
提出物



プログラムのソース
出力結果
感想など(あれば)
提出期限:4月26日 23:59まで
演習問題1
ユークリッド互除法を用い、m、n の最大公約数
を求めよ。 euclid.c に追加。
2)24 18
3)12 9 2×3 = 6
4 3
ヒント:整数m, n があったとき、その最大公約数は
m-n, n の最大公約数。
m-n, n も同様なことを繰り返し、最終的にm=nと
なったときのmが最大公約数になる
演習問題2
prime.c を改良し、入力された数字が素数かどう
かを判断するプログラムを作成しなさい

素数は1と自分自身以外約数を持たない
ヒント:nが素数かどうかは、n以下の整数で割り
切れるかどうかを繰り返せばいい。
nを√n以上で割っても割り切れないので、開始
は√n からでよい。
演習問題2
ルート計算は sqrt(int); でできます。
ex) limit = sqrt(n);
 sqrt関数を使用した場合、
gcc –lm prime.c
とコンパイルしてください。

for文は、break で抜けられます。

ex) for(…){
if( n%i == 0){
break;
}
}
演習問題3
combi.cのファイルを新たに作成し、組み合わせ
を求める関数を作成せよ。
C0,1C0,1C1,2C0,2C1......5C5
0
0
1
2
3
4
5
C
C
C
C
C
C
0
0
0
0
0
0
=
=
=
=
=
=
1
1
1
1
1
1
1
2
3
4
5
C
C
C
C
C
1
1
1
1
1
=
=
=
=
=
1
2
3
4
5
2
3
4
5
C
C
C
C
2
2
2
2
=
=
=
=
1
3 3C3=1
6 4C3=4 4C4=1
10 5 C 3 = 10 5 C 4 = 5 5 C 5 = 1
演習問題3
ヒント:組み合わせの公式
n!
nCr 
r!(n  r)!