読者です 読者をやめる 読者になる 読者になる

for文縛りのFizzBazz

だいぶ前に学校でFizzBazzの課題が出された時に普通のif分岐のものを書くのが退屈だったので、for文のみで書いてみました。

案外難しく、大変だったですけど結構楽しめました。

文字列処理を多用しているので、プログラミングを少し学んだ人の練習などにいいかもしれません。

ソースコード置いときます。もっと賢い方法があれば教えてください!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void slide();//配列の位置を前にずらす
void dspace();//先頭の空白を削除する

int main(int argc, char const *argv[]) {
  char n[100][16];
  int i,j;
  for(i=1;i<=100;i++)
  {
    sprintf(n[i-1],"%d",i);//数値を文字列に変換し配列に格納
    strcat(n[i-1],"  ");//空白追加
  }
  for(i=3;i<=100;i+=3)//3の倍数
    strcat(n[i-1],"Fizz");
  for(i=5;i<=100;i+=5)//5の倍数
  {
    strcat(n[i-1],"Buzz");
    slide(n[i-1],2);//先頭の数字を消す
  }
  for(i=3;i<=100;i+=3)
    slide(n[i-1],2);//3の倍数の先頭の数字を消す

  slide(n[99],3);//最後だけ3ケタのため消す文字数を変更

  for(i=0;i<100;i++)
  {
    for(j=0;j<strlen(n[i]);j++)
      dspace(n[i]);//先頭の空白を全て削除
    printf("%s\n",n[i]);//表示
  }

  return 0;
}

void slide(char *n,int len)
{
  int i,j;
  for(j=0;j<len;j++)//消す文字数の分のループ
    for(i=0;i<strlen(n);i++)//前に一つずらす
      n[i] = n[i+1];
  n[i] = '\0';//文字列の直後にnull文字を追加
}

void dspace(char *n)
{
  int i;
  for(i=0;isspace(n[i]);i++)//空白文字が先頭にあればずらす
    slide(n,1);
}