第10回資料 - 湘南工科大学 情報工学科 ホームページ

Download Report

Transcript 第10回資料 - 湘南工科大学 情報工学科 ホームページ

2011年12月13日
湘南工科大学
情報理論2
第10回
小林 学
〒251-8511 神奈川県藤沢市辻堂西海岸1-1-25
Tel.
0466-30-0232(直通)
Fax.
0466-34-5932
[email protected]
LZ77符号の符号化
[例]ABABCABCABA
位置 0 1 2 3 4 5 6 7
(1)
A A A A A A A A A B A B C A B C
出力:(0,1,B)
(2)
注:6番目の位置から2文字一致
A A A A B A B C A B C A B A
出力:(5,5,A)
(4)
注:0番目の位置から1文字一致
A A A A A A A B A B C A B C A B
出力:(6,2,C)
(3)
これから符号化する系列
注:5番目の位置から5文字一致
B C A B C A B A
符号化する系列が空なので,終了
[課題1] 系列「ABCABCBCACCACCB」をLZ77符号で符号化
しなさい.
位置 0 1 2 3 4 5 6 7
(1)
A A A A A A A A
出力:(?,?,?)
これから符号化する系列
関数
P.4
引数(ひきすう): 関数が受け取る値
戻り値(もどりち): 関数が出力する値
関数を使うときの書き方
受け取る値を入
れる変数
戻り値の型 関数名(引数の型 引数){
関数の本体
}
return(戻り値);
関数が出力
する値
関数の使用例
戻り値ansの型
小林ルール:
関数名の単語の先頭を大
文字にする
int Func(int x, int y){
int ans;
ans = x + y;
return(ans);
ローカル変数は
その関数でしか
使えない。
別の関数では
別の中身
}
ans の値が
a に入る
void main(void){
int a;
a = Func(3, 5);
printf("%d\n",a);
}
x に 3が入り,
y に 5 が入る
[前回の課題1解答] 1から n までの和を計算する
関数SumN
#include<stdio.h>
int SumN(int n){
int i, sum=0;
for(i=1;i<=n;i++) sum += i;
return(sum);
}
void main(void){
int a;
a = SumN(10);
printf("1からまでの和:%d\n", a);
}
Page 6
[前回の課題2解答] xのy乗を計算して返す
関数Beki
#include<stdio.h>
int Beki(int x, int y){
int i, ans=1;
for(i=0;i<y;i++) ans *= x;
return(ans);
}
void main(void){
int a;
a = Beki(2 , 3);
printf("2の乗は:%d\n", a);
}
Page 7
グローバル変数
#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=0; //ローカル変数
ans = ACount();
printf("'a'の数:%d\n", ans);
}
[前回の課題3解答] 配列Str1とStr2の先頭からの一致文字数を
計算する関数Icchichoのプログラムを作成しなさい
#include<stdio.h>
char Str1[5]="abba", Str2[5]="abab";
int Icchicho(void){
int i, count=0;
for(i=0;i<4;i++){
if(Str1[i]!=Str2[i]) break;
count++;
}
return(count);
}
void main(void){
int ans;
ans = Icchicho();
printf("先頭から一致した文字の数:%d\n", ans);
}
[前回の課題4解答] 配列Strの中身を左へ1つずらす(シフトする)関
数Shiftを作成しなさい
#include<stdio.h>
char Str[10]="ababbaaba";
void Shift(void){
int i;
for(i=0;i<9;i++) Str[i]=Str[i+1];
}
void main(void){
printf("ずらす前の文字列:%s\n", Str);
Shift();
printf("ずらした後の文字列:%s\n", Str);
}
実行結果
[前回の課題5解答] 10進数の数字を2進数で表示する関数を作成し
なさい.
#include<stdio.h>
void Binary(int x){
int amari;
printf("10進数x:%d\n2進数x(逆順):",x);
while(x>0){
amari = x % 2;
printf("%d",amari);
x = x / 2;
}
printf("\n");
}
void main(void){
Binary(100);
}
[課題2] 配列Strの中身を左へnずらす(シフトする)関数Shiftを作
成しなさい
#include<stdio.h>
char Str[10]="ababbaaba";
??? Shift(???){
「配列Strの中身をnだけ左へずらす」
}
void main(void){
int n=3;
printf("ずらす前の文字列:%s\n", Str);
Shift(n);
printf("ずらした後の文字列:%s\n", Str);
}
実行結果
[課題3] 配列Str1のp番目からとStr2の先頭からの一致文字数を計
算する関数Icchichoのプログラムを作成しなさい
#include<stdio.h>
char Str1[10]="ababbaaba", Str2[10]="abbababba";
??? Icchicho(???){
「配列Str1のp番目からとStr2の先頭からの一致文字数を
計算」
}
void main(void){
int ans, p=2;
ans = Icchicho(p);
printf("一致した文字の数:%d\n", ans);
}
実行結果
[課題4] 課題3の関数Icchichoを利用して,Str1の全ての位置と
Str2の先頭からとの一致長を出力するプログラムを作成しなさい
#include<stdio.h>
char Str1[10]="ababbaaba", Str2[10]="abbababba";
??? Icchicho(???){省略}
void main(void){
int ans, p;
for(???){
ans = Icchicho(p);
printf("%d番目から一致した文字の数:%d\n", p, ans);
}
}
実行結果
[課題5]LZ77符号の符号化プログラムを作成しなさい.
#include<stdio.h>
char Str[17]="AAAAAAAAABABCAD";
int Icchicho(???){省略}
void Shift(???){省略}
void main(void){
int p, max, position;
while(1){//無限ループ
??? //最大一致長の計算
printf("%s\n", Str);
printf("(%d,%d,%c)\n", ???);
??? //シフト
if(Str[8]==0) break;
}
printf("%s\n", Str);
}
実行結果