スライド 1

高度プログラミング演習
(09)
演習問題
• 格子の中で、点から点へは
– 上または右にしか進めないとする。
• 任意の(x0,y0)から任意の(x1,y1)までの経路が何
通りあるか計算するプログラムを作成せよ。
(x1,y1)
(x0,y0)
#include<stdio.h>
int cango(int x0,int y0,int x1,int y1)
{
int cnt=0;
printf("(%2d %2d) ",x0,y0);
if(x0==x1&&y0==y1){
printf("\n");
return 1;
}
}
main()
{
int x0,y0,x1,y1;
if( x0 + 1 <= x1)
cnt = cnt + cango(x0 +1,y0,x1,y1);
printf("始点を指定して下さい。(x, y): ");
scanf("%d %d",&x0,&y0);
if( y0 + 1 <= y1)
cnt = cnt +cango(x0,y0 +1,x1,y1);
printf("終点を指定して下さい。(x, y): ");
scanf("%d %d",&x1,&y1);
return cnt;
printf("%d\n",cango(x0,y0,x1,y1));
}
文字列の入力・出力
char ch[16];
scanf(“%s”,ch);
printf(“%s\n”, ch);
// ch はポインタ型
文字列操作には文字配列が格納され
ているメモリ領域を指す文字ポインタが
用いられる。
文字列の入力
scanf() だとスペースを含む文字列の
入力が困難。
gets(char *line)は入力された
1行すべてを文字配列 line にコピーする
文字列を扱う関数
• strlen(char *s);
– 文字列 s の文字数を返す
• strcmp(char *s1, char *s2);
– 文字列 s1 と s2 を比較する
– 等しければ0を返す
• strncmp(char *s1, char *s2, int n);
• strcpy(char *dst, char *src)
– 文字列 src を文字列 dst にコピーする
練習問題
• 適当な文字配列を宣言して
– gets関数を用いて文字列の入力
– printf 関数を用いて文字列の出力
– を行うプログラムを作成せよ。
• さらに別の文字配列のプログラムを宣言して
– strcpy 関数を用いて入力した文字列をコピーし
てその内容を表示するプログラムを作成せよ。
固定的な文字列を指すポインタ
char *name=“Kodo Programing”;
printf(“%s\n”,name);
•name にはメモリ領域は確保され
ていないので、
•name[0]を変更したり、
•name に scanf を用いて文字列
を読み込ませたり、
•name に strcpy を用いて文字列
をコピーしたりできない。
name
システム
領域
文字配列を指すポインタ
char buf[128];
char *name;
name = buf;
scanf(“%s”,name);
•name は領域が確保されている
メモリを指しているので
•name[0]を変更したり、
•name に scanf を用いて文字列
を読み込ませたり、
•name に strcpy を用いて文字列
をコピーしたりできる。
name
buf
例題問題
• 主語、述語、目的語からなる簡単な英文で、主語、
述語、目的語が与えられた文字列から適当に選ば
れるプログラムを作成せよ。
–
–
–
–
–
–
–
Bob likes desks.
Lee has cars.
Ken likes cars.
Bob sells dogs.
Lee has desks.
Ken has desks.
Ken sells desks.
例題問題
• ある文字列 s0 に文字列 s1 がいくつ含まれ
ているか調べるプログラムを作成せよ。
– 例: This is a pen. に is がいくつ含まれている
か?
練習問題
• ある文字列 s0 にアルファベットの文字列 s1
がアルファベットの大文字・小文字に関わら
ずいくつ含まれているか調べるプログラムを
作成せよ。
– 例: Ken likes cakes. に ke がいくつ含まれて
いるか?
演習問題
• 文字列 s0 中に文字列 s1 があれば、それを
s2 に置き換えるプログラムを作成せよ。
– s0: Bill likes dogs and Bill has three dogs.
– s1: Bill
– s2: Ken