PowerPoint プレゼンテーション

2011年12月6日
湘南工科大学
情報理論2
第9回
小林 学
〒251-8511 神奈川県藤沢市辻堂西海岸1-1-25
Tel.
0466-30-0232(直通)
Fax.
0466-34-5932
[email protected]
先頭からの一致文字数
Page 2
char str1[5]="abba", str2[5]="abaa";
i
str1[i] str2[i]
0
初期値:
繰り返し:
(for文)
count
0
1
2
3
‘a’
‘b’
‘b’
‘a’
1
‘b’
2
‘a’ break(繰り返しを抜ける)
if(str1[i]!=str2[i]) break;
[前回の課題1]先頭からの一致文字を数えるプログラム
を作成しなさい
実行結果
[前回の課題1解答]先頭からの一致文字
#include<stdio.h>
void main(void){
char str1[5]="abba", str2[5]="abab";
int i, count = 0;
}
for(i=0;i<4;i++){
if(str1[i]!=str2[i]) break;
count++;
}
printf("先頭から一致した文字の数:%d\n",count);
Page 3
Page 4
途中からの一致文字数
char str1[10]="ababbaaba";
char str2[10]="bbababbab";
str1の1番からとstr2の3番からの一致文字数を求める
i
str1[1+i] str2[3+i]
初期値:
繰り返し:
(for文)
0
1
2
3
4
5
‘b’
‘a’
‘b’
‘b’
‘a’
‘a’
‘b’
‘a’
‘b’
‘b’
‘a’
‘b’
count
0
1
2
3
4
5
break
途中からの一致文字数
Page 5
[前回の課題2]前ページの途中からの一致文字を数える
プログラムを作成しなさい
実行結果
[前回の課題2解答]途中からの一致文字数
Page 6
#include<stdio.h>
void main(void){
char str1[10]="ababbaaba";
char str2[10]="bbababbab";
int i, count=0;
}
for(i=0;i<10;i++){
if(str1[1+i]!=str2[3+i]) break;
count++;
}
printf("str1の1からとstr2の3からの一致文字数:%d\n",
count);
Page 7
前回の課題3
char str1[10]="ababaaaba";
char str2[4]="aba";
str1の中にstr2と完全一致する文字列は何回入ってい
るか?またその一致する先頭の位置は?
位置:0 1 2 3 4 5 6 7 8
ababaaaba
一致した先頭位置:0,2,6
一致回数:3回
[前回の課題3]上のプログラムを作成しなさい
[前回の課題3解答]
#include<stdio.h>
void main(void){
char str1[10]="ababaaaba", str2[4]="aba";
int i, j, count=0;
}
printf("一致した先頭位置:");
for(i=0;i<10;i++){
for(j=0;j<3;j++){ //一致した文字数が j
if(str1[i+j]!=str2[j]) break;
}
if(j==3){
// jが3ならばstr2と一致
count++;
printf("%d,",i);
}
}
printf("\n一致回数:%d\n", count);
Page 8
P.9
関数
引数(ひきすう):
戻り値(もどりち):
関数が受け取る値
関数が出力する値
関数を使うときの書き方
受け取る値を入れ
る変数
戻り値の型 関数名(引数の型 引数,..,引数の型 引数){
関数の本体
}
return(戻り値);
関数が出力する値
関数の使用例
戻り値ansの型
ans の値が
a に入る
小林ルール:
関数名の単語の先頭を大
文字にする
int Func(int x, int y){
int ans;
x に 3が入り,
ans = x + y;
y に 5 が入る
return(ans);
}
void main(void){
int a;
a = Func(3, 5);
printf("%d\n",a);
}
[例題1] 二つの整数 x, y の大きい方の値を計
算する関数
#include<stdio.h>
int Max2(int x, int y){
int ans;
if(x>y) ans = x;
else
ans = y;
return(ans);
}
void main(void){
int a;
a = Max2(3, 5);
printf("最大値:%d\n", a);
}
P.11
[例題2] 実数 x が0以上ならば1を,xが負ならば-1
を返す関数 Sign
#include<stdio.h>
int Sign(double x){
if(x>=0) return(1);
return(-1);
}
void main(void){
int a;
a = Sign(-3.7);
printf("符号:%d\n", a);
}
実行結果
P.12
[例題3] nの階乗(n!=1×2×3×…×n) を計算する
関数 Kaijo
#include<stdio.h>
int Kaijo(int n){
int ans=1, i;
for(i=1;i<=n;i++) ans *= i;
return(ans);
}
void main(void){
int a;
a = Kaijo(5);
printf("5!=%d\n", a);
}
実行結果
P.13
[課題1] 1から n までの和を計算する関数SumN
#include<stdio.h>
??? SumN(???){
???
}
void main(void){
int a;
a = SumN(10);
printf("1から10までの和:%d\n", a);
}
実行結果
P.14
[課題2] xのy乗を計算して返す関数Beki
#include<stdio.h>
??? Beki(???){
実行結果
???
}
void main(void){
int a;
a = Beki(2 , 3);
printf("2の3乗は:%d\n", a);
}
P.15
グローバル変数
#include<stdio.h>
char Str[5]="abaa";
//グローバル変数
int ACount(void){
グローバル変数は
int i, count=0; //ローカル変数 どの関数でも使え
for(i=0;i<5;i++){
て中身は一つ
if(Str[i]=='a') count++;
小林ルール:
}
グローバル変数の
return(count);
名前の先頭を大文
}
字にする
void main(void){
int ans;
//ローカル変数
ローカル変数はそ
ans = ACount();
の関数でしか使え
printf("'a'の数:%d\n", ans);
ない。別の関数で
}
は別の中身
[課題3]配列Str1とStr2の先頭からの一致文字
数を計算する関数Icchichoのプログラ
ムを作成しなさい
#include<stdio.h>
char Str1[5]="abba", Str2[5]="abab";
??? Icchicho(???){
???
}
void main(void){
int ans;
ans = Icchicho();
printf("先頭から一致した文字の数:%d\n", ans);
}
Page 17
[課題4]配列Strを左に1つシフトする関数Shift
のプログラムを作成しなさい
#include<stdio.h>
char Str [10]="ababbaaba";
void Shift(???){
//戻り値が無い場合にはvoid
???
}
void main(void){
printf("もとのStr:%s\n", Str);
Shift();
printf("Shift後のStr:%s\n", Str);
}
Page 18
[課題5]10進数の数字を2進数で表示する関数を
作成しなさい.
#include<stdio.h>
void Binary(???){
??? //ここで2進数を表示する
}
void main(void){
Binary(100);
}
Page 19