0 = sıfır 1 = bir 2 = iki 3 = üç 4 = dört 5 = beş 6 = altı 7 = yedi 8 = sekiz 9 = dokuz 10 = on 20 = yirmi 30 = otuz 40 = kırk 50 = elli 60 = altmış 70 = yetmiş 80 = seksen 90 = doksan
0~99までの数値が与えられそれに応じて、下の例のようにに文字列を返す関数を作成しています。これはcodewars内での問題です。https://www.codewars.com/kata/5ebd53ea50d0680031190b96/train/c
1 --> "bir" 13 --> "on üç" 27 --> "yirmi yedi" 38 --> "otuz sekiz" 77 --> "yetmiş yedi" 94 --> "doksan dört"
下にコードを示します。10が与えられたときに、onではなくyirmiを返してしまうのですが、どこが問題なのか指摘して頂けないでしょうか?また、エラーに関係なく、コードの改善点だったり、より効率の良い書き方などがあれば教えていただければありがたいです。
c
1#include <stdlib.h>//malloc 2#include <string.h>//strcpy 3#include <stdio.h>//sprintf 4 5char* getTurkishNumber(unsigned int n) 6{ 7 char* string = malloc(12); 8 char* base = string; 9 char unit[10][7] = { 10 "sıfır", 11 "bir", 12 "iki", 13 "üç", 14 "dört", 15 "beş", 16 "altı", 17 "yedi", 18 "sekiz", 19 "dokuz", 20 }; 21 char tens[9][8] = { 22 "on", 23 "yirmi", 24 "otuz", 25 "kırk", 26 "elli", 27 "altmış", 28 "yetmiş", 29 "seksen", 30 "doksan", 31 }; 32 int te = n /10, un = n % 10; 33 34 if(te == 0) 35 { 36 strcpy(string, &unit[un - 1][7]); 37 38 return base; 39 } 40 41 if(un == 0 && (te == 1 || te == 2 || te == 3 || te == 4 || te == 5 || te == 6 || 42 te == 7 || te == 8 || te == 9 ) ) 43 { 44 strcpy(string, &tens[te -2][8]); 45 46 return base; 47 } 48 49 50 sprintf(string,"%s %s",tens[te - 1], unit[un - 1]); 51 52 return base; 53 54 55} 56 } 57 58 sprintf(string,"%s %s",tens[te - 1], unit[un - 1]); 59 60 return base; 61 62 63}
テスト用コード
c
1#include <criterion/criterion.h> 2#include <stdlib.h> 3#include <string.h> 4#include <memory.h> 5void Tester(unsigned int n, const char* expected); 6 7Test(Turkish_Numbers, should_pass_all_the_tests_provided) 8{ 9 Tester(1,"bir"); 10 Tester(10,"on"); 11 Tester(26,"yirmi altı"); 12} 13
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/04 19:42
2020/09/04 20:10
2020/09/04 22:24
2020/09/04 22:33
2020/09/04 22:36