FizzBuzzに関する5つの問題を解いた

Qiitaを眺めていたら、面白い記事を見つけた。 qiita.com ということで、僕も解いてみた(発展質問はまだ解いてない)

[質問1] 1から100までの数をプリントするプログラムを書けるか?

#include<stdio.h>

int main(void)
{
        int i;
        for (i=1;i<=100;i++)
        {
                printf("%d\n",i);
        }
return 0;
}

[質問2] 3の倍数なら「Fizz」 5の倍数なら「Buzz」 両方の倍数なら「FizzBuzz

  1 #include<stdio.h>
  2 
  3 int main(void)
  4 {
  5 
  6         int i=1;
  7 
  8         while(i<100)
  9         {
 10                 if((i%3 == 0)&&(i%5 == 0)) printf("FizzBuzz\n");
 11                 else if(i%3 == 0) printf("Fizz\n");
 12                 else if(i%5 == 0) printf("Buzz\n");
 13                 else printf("%d\n",i);
 14                 i++;
 15         }
 16 return 0;
 17 
 18 }

[質問3] FizzBuzzを関数に分割できるか?

  1 #include<stdio.h>
  2 
  3 void toFizzBuzz(int n);         
  4 
  5 int main(void)
  6 {
  7         int i = 1;
  8 
  9         while(i<=100) 
 10         {
 11                 toFizzBuzz(i);
 12                 i++;
 13         }
 14         return 0;
 15 }
 16 
 17 
 18 
 19 void toFizzBuzz(int n)
 20 {       
 21   if ((n%3 == 0)&&(n%5 == 0)) printf("FizzBuzz\n");
 22   else if(n%3 == 0) printf("Fizz\n");
 23   else if(n%5 == 0) printf("Buzz\n");
 24   else printf("%d\n",n);
 25 }

[質問4] FizzBuzzユニットテストを書けるか?

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

#define N 256
char fizzbuzz[30]="FizzBuzz";
char fizz[30]="Fizz";
char buzz[30]="Buzz";

char *toFizzBuzz(int n);

int main(void)
{
         int i = 1;
         while(i<=100)
          {
             assert(toFizzBuzz(2)=="FizzBuzz");
             toFizzBuzz(i)
             printf("%s\n",toFizzBuzz(i)); 
         i++;
          }
    return 0;
 }
  
  
  
char *toFizzBuzz(int n)
{
    
    if ((n%3 == 0)&&(n%5 == 0)){      
       return "FizzBuzz";

    }else if(n%3 == 0){
       return  "Fizz";
   
    }else if(n%5 == 0){
       return  "Buzz";
   
    }else{
        static int tes;
        tes = n;
        static char s1[N] = {'\0'};
        sprintf(s1,"%d",tes);
        return s1;

    }
   
}

[質問5] HTML出力とテキスト出力を簡単にスイッチできるようにできるか?

これに関しては、元の記事の関数の処理のsprintfの出力文字列に指定してある記法で表記できることをゴールとした。 また、実行した際に、scanfでどちらにスイッチするか聞けるようにした。

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

#define N 256

static  int flag1=0;
static  int flag2=0;
static  int flag3=0;
//char ans[30]={'\0'};
char fizzbuzz[30]="FizzBuzz";
char fizz[30]="Fizz";
char buzz[30]="Buzz";

//int num = 0;

char *toFizzBuzz(int n);
char *html_printer(char *elements);
char *text_printer(char *elements);

int main(void)
{
         int i = 1;
     char s[N];
     char text[50] = {'\0'};

     printf("html出力?:Y/N");
     scanf("%s",text);
      while(i<=100)
          {
        if(text[0] == 'Y')
        {
            char *ans = toFizzBuzz(i); //ここはhtml出力用
            printf("%s\n",html_printer(ans)); 
            }else{
            char *ans = toFizzBuzz(i); //ここはtext出力用
            printf("%s\n",text_printer(ans)); 
        }
        i++;
          }
    return 0;
 }
  
  
  
char *toFizzBuzz(int n)
{
    
    if ((n%3 == 0)&&(n%5 == 0)){      
       return "FizzBuzz";

    }else if(n%3 == 0){
       return  "Fizz";
   
    }else if(n%5 == 0){
       return  "Buzz";
   
    }else{
    static int tes;
        tes = n;
    static char s1[N] = {'\0'};
    sprintf(s1,"%d",tes);
    return s1;
    }
}


char *html_printer(char *elements)
{
    static char s[] = {'\0'};
        int len = 0;
    int i = 0;

    len = strlen(elements);//文字列の要素数取得
    
    for(i=0; i<len; i++)
    {
        sprintf(s,"<li>%s</li>\n",elements);       
    }
    
    return s;
}

char *text_printer(char *elements)
{
    static char s2[] = {'\0'};
        int len = 0;
    int i = 0;

    len = strlen(elements);//文字列の要素数取得
    
    for(i=0; i<len; i++)
    {
        sprintf(s2,"{%s}\n",elements);     
    }
    
    return s2;
}