課題1月18〆切

「課題1月18〆切」の編集履歴(バックアップ)一覧に戻る
課題1月18〆切」を以下のとおり復元します。
課題の答え(ほぼ完成版)(発展課題については後ほど追加する)

C言語 ソースコード
---------------------------------------------回答例1-----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int x;
int y;
int dx;
int dy;
int n=0;

void put_mark(int x, int y){
  move(x-2,y-2); cont(x+2,y+2);
  move(x+2,y-2); cont(x-2,y+2);
  move(x,y);
}


void forward(){/*進ませる。dx,dyにてどの方向にどれくらい動かすか決めている*/
  x=x+dx;
  y=y+dy;
  cont(x,y);
  put_mark(x,y);
}

void left_turn(){/*dx=-dy dy=dxとなるので、左方に向ことになる*/
  int tmp;
  tmp=dx;
  dx=-dy;
  dy=tmp;
}

void right_turn(){/*上とほぼ同位で、右方になる*/
  int tmp;
  tmp=dx;
  dx=dy;
  dy=-tmp;
}

void analysis(ch){
  int i;
  if(n==0)n=1;/*数字を打たなかったときに対しての処理 下のn=0 をn=1しても良いかも*/
  switch(ch){
  case 'F':
    for(i=0;i<n;i++)
    forward();
    break;
  case 'R':
    for(i=0;i<n;i++)
    right_turn();
    break;
  case 'L':
    for(i=0;i<n;i++)
    left_turn();
  }
  n=0;/*初期化*/
}

void turtle(){
  char ch,ch2[100];
  int i=0,j;
  while((ch=getchar())!=EOF){
    if(isalpha(ch)){
      n=atoi(ch2);/*数字をint型に直す*/
      printf("%d",n);
      analysis(ch);
      for(j=0;j<=i;j++)/*初期化*/
	ch2[j]=0;
      i=0;
    }
    if(isdigit(ch)){ch2[i]=ch; i++;}/* 数字をひとつずつ格納*/
  }
}

int main(){
  openpl();
  space(-300,-300,300,300);
  x=0;
  y=0;
  dx=0;
  dy=10;
  put_mark(x,y);
  turtle();
  closepl();
  return 0;
}

------------------------------------------------------------------------------------------------------------------
回答例2
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int x;
int y;
int dx;
int dy;
int n=0;

void put_mark(int x, int y){
  move(x-2,y-2); cont(x+2,y+2);
  move(x+2,y-2); cont(x-2,y+2);
  move(x,y);
}

/* */

void forward(){
  x=x+dx;
  y=y+dy;
  cont(x,y);
  put_mark(x,y);
}

void left_turn(){
  int tmp;
  tmp=dx;
  dx=-dy;
  dy=tmp;
}

void right_turn(){
  int tmp;
  tmp=dx;
  dx=dy;
  dy=-tmp;
}

void analysis(ch){
  int i;
  if(n==0)n=1;
  switch(ch){
  case 'F':
    for(i=0;i<n;i++)
    forward();
    break;
  case 'R':
    for(i=0;i<n;i++)
    right_turn();
    break;
  case 'L':
    for(i=0;i<n;i++)
    left_turn();
  }
  n=0;
}

void henkan(ch){
  switch(ch){
  case '1':
    n=n*10+1;
    break;
  case '2':
    n=n*10+2;
    break;
  case '3':
    n=n*10+3;
    break;
  case '4':
    n=n*10+4;
    break;
  case '5':
    n=n*10+5;
    break;
  case '6':
    n=n*10+6;
    break;
  case '7':
    n=n*10+7;
    break;
  case '8':
    n=n*10+8;
    break;
  case '9':
    n=n*10+9;
    break;
  case '0':
    n=n*10;
    break;
  }
}

void turtle(){
  char ch;
  while((ch=getchar())!=EOF){
    if(isalpha(ch))analysis(ch);
    if(isdigit(ch))henkan(ch);
  }
}

/* */

int main(){
  openpl();
  space(-300,-300,300,300);
  x=0;
  y=0;
  dx=0;
  dy=10;
  put_mark(x,y);
  turtle();
  closepl();
  return 0;
}

復元してよろしいですか?