diff --git a/code/practise/09 函数/01 判定素数/main.c b/code/practise/09 函数/01 判定素数/main.c new file mode 100644 index 0000000..65cf678 --- /dev/null +++ b/code/practise/09 函数/01 判定素数/main.c @@ -0,0 +1,33 @@ +#include +#include + +bool is_prime(int n) { + + int divisor; + + if (n <= 1) + return false; + + for (divisor = 2; divisor * divisor <= n; divisor++) { + if (n % divisor == 0) + return false; + } + + return true; +} + + +int main(void) { + + int n; + + printf("Enter a number: "); + scanf("%d", &n); + + if (is_prime(n)) + printf("Prime\n"); + else + printf("Not Prime\n"); + + return 0; +} diff --git a/code/practise/09 函数/01 判定素数/readme.md b/code/practise/09 函数/01 判定素数/readme.md new file mode 100644 index 0000000..d1aa036 --- /dev/null +++ b/code/practise/09 函数/01 判定素数/readme.md @@ -0,0 +1,10 @@ +#### 程序:判断素数 + +编写程序提示用户录入数,然后给出一条信息说明此数是否为素数。 + +```c +Enter a number: 24 +Not prime +``` + +把判断素数的实现写到另外一个函数中,此函数返回值为 true 就表示是素数,返回 false 表示不是素数。 \ No newline at end of file diff --git a/code/practise/10 程序结构/01 猜数/global_variable.c b/code/practise/10 程序结构/01 猜数/global_variable.c new file mode 100644 index 0000000..fbeb193 --- /dev/null +++ b/code/practise/10 程序结构/01 猜数/global_variable.c @@ -0,0 +1,74 @@ +#include +#include +#include + +#define MAX_NUMBER 100 + +int secret_number;// Ҫµ + +void generate_secret_number();// +void read_guesses(); // µʵ + +int main(void) { + + char command; + + printf("Guess the secret number between 1 and 100.\n"); + + do { + generate_secret_number(); + printf("A new number has been chosen.\n"); + read_guesses(); + printf("Play again?(Y/N)"); + scanf(" %c", &command);// ע %c ǰĿոҪ + printf("\n"); + } while (command == 'y' || command == 'Y'); + + return 0; +} + +// עͽĹдںĶϷ +// Ҹ˱Ƚϲ򵥵עдںԭʹ + +/**************************************************************************** +* +* generate_secret_number: Initilizes the random number generator using the +* time of day.Randomly selects a number between +* 1 and MAX_NUMBER and stores it in secret_number +* +*****************************************************************************/ + +void generate_secret_number() { + + srand((unsigned)time(NULL)); + + secret_number = rand() % MAX_NUMBER + 1; +} + +/***************************************************************** +* +* read_guessesRepeatedly reads user guesses and gives hints +* When guess is right,prints the total number of +* guesses and returns +* +******************************************************************/ + +void read_guesses() { + + int guess, count = 0; + + for (;;) { + printf("Enter guess: "); + scanf("%d", &guess); + count++; + if (guess > secret_number) { + printf("Too high; try again\n"); + } + else if (guess < secret_number) { + printf("Too low; try again.\n"); + } + else { + printf("You won in %d guesses!\n\n", count); + return; + } + } diff --git a/code/practise/10 程序结构/01 猜数/no_global_variable.c b/code/practise/10 程序结构/01 猜数/no_global_variable.c new file mode 100644 index 0000000..23473c0 --- /dev/null +++ b/code/practise/10 程序结构/01 猜数/no_global_variable.c @@ -0,0 +1,59 @@ +#include +#include +#include + +#define MAX_NUMBER 100 + +int generate_secret_number();// +void read_guesses(int secret_number); // µʵ + +int main(void) { + + char command; + int secret_number; + + printf("Guess the secret number between 1 and 100.\n"); + + do { + secret_number = generate_secret_number(); + printf("A new number has been chosen.\n"); + read_guesses(secret_number); + printf("Play again?(Y/N)"); + scanf(" %c", &command); + printf("\n"); + } while (command == 'y' || command == 'Y'); + + return 0; +} + + +int generate_secret_number() { + + srand((unsigned)time(NULL)); + + int secret_number = rand() % MAX_NUMBER + 1; + + return secret_number; +} + +void read_guesses(int secret_number) { + + int guess, count = 0; + + for (;;) { + printf("Enter guess: "); + scanf("%d", &guess); + count++; + if (guess > secret_number) { + printf("Too high; try again\n"); + } + else if (guess < secret_number) { + printf("Too low; try again.\n"); + } + else { + printf("You won in %d guesses!\n\n", count); + return; + } + } +} + diff --git a/code/practise/10 程序结构/01 猜数/readme.md b/code/practise/10 程序结构/01 猜数/readme.md new file mode 100644 index 0000000..7623241 --- /dev/null +++ b/code/practise/10 程序结构/01 猜数/readme.md @@ -0,0 +1,19 @@ +#### 程序:猜数 + +程序产生一个 1 ~ 100 的随机数,用户尝试用尽可能少的次数猜出这个数。程序运行如下: + +```c +Guess the secret number between 1 and 100. + +A new number has been chosen. +Enter guess:55 +Too low; try again. +Enter guess:65 +Too high; try again. +Enter guess: 60 +You won in 3 guesses! + +Play again?(Y/N) n +``` + +使用两种方法:使用全局变量/不使用全局变量 \ No newline at end of file diff --git a/code/practise/10 程序结构/02 手牌分类/main.c b/code/practise/10 程序结构/02 手牌分类/main.c new file mode 100644 index 0000000..ea1c2d2 --- /dev/null +++ b/code/practise/10 程序结构/02 手牌分类/main.c @@ -0,0 +1,209 @@ +/* + * ѵ˼· + * 1ΪжеǷظҪһ洢ƣʼΪ falseһѾϣôǽӦԪΪ true + * 2ֱ洢ÿͻɫĸǺжƵ + * 38 Ƶͣǿɲ ͬ˳ӣ4ţ3ţӣֵΪ 012ֻ͵ϡ + * + * ṹ + * ͨķǷ֣Ҫ 3 5 ΪΣԵЩ + * ңǰ˵ֻܷһֵҪ룬 5 ֻ;͵÷Ž飻ʹָ룬ָûѧϰָ뻹Ӳ + * һòʹȫֱõˡڳѧ˵ȷʵõġ + * ǣʹôȫֱǺܲõϰߣҲԼȥдĴ롣ΪⲻҲлĴȥд + * ǻѧϰԶͣṹ壬õĽ + * + * 4 ֽ + * 1)Ӧȫֱ + * 2ӦָΪ + * 3жϿ͵ĺӡϲ + * 4ʹýṹ + * + * Ҽʹýṹ⡣ȫֱֻҪ֪ɣ˵𷽷Ƴģ黯˼·ֵѧϰ + * ʹʹýṹ壬Ҫ߼Ҳ䡣ҪȫֱдԸдһ¡ + */ + +#include +#include + +#define RANK 13 +#define SUIT 4 +#define CARD 5 + +typedef struct CardType { + bool flush; //ͬ + bool straight; //˳ + bool four; // + bool three; // + int pair; // + // 0 ʾ 1 ʾ 1 2 ʾ + bool cardInHand[SUIT][RANK]; // жϴǷ + int numRank[RANK]; // ÿĸ + int numSuit[SUIT]; // ÿɫĸ +}CardType; + + +void initCardType(CardType* card); // ʼ +void readCard(CardType* card); // ȡ +void analyseCard(CardType* card); // +void printResult(CardType* card); //ӡ + +int main(void) { + + CardType card; + + for (; ;) { + initCardType(&card); + readCard(&card); + analyseCard(&card); + printResult(&card); + } + + return 0; +} + + +void initCardType(CardType* card) { + + card->flush = false; + card->straight = false; + card->four = false; + card->three = false; + card->pair = 0; + + int i, j; + + for (i = 0; i < SUIT; i++) { + card->numSuit[i] = 0; + for (j = 0; j < RANK; j++) { + card->cardInHand[i][j] = false; + } + } + + for (i = 0; i < RANK; i++) { + card->numRank[i] = 0; + } + +} + + +void readCard(CardType* card) { + + int card_read = CARD, rank, suit; + bool bad_card; + char ch; + + while (card_read) { + + bad_card = false; // ҪûƵı + + printf("Enter a card : "); + + // жϵ + ch = getchar(); + switch (ch) { + case '0': exit(0); break; + case '2': rank = 0; break; + case '3': rank = 1; break; + case '4': rank = 2; break; + case '5': rank = 3; break; + case '6': rank = 4; break; + case '7': rank = 5; break; + case '8': rank = 6; break; + case '9': rank = 7; break; + case 't':case 'T': rank = 8; break; + case 'j':case 'J': rank = 9; break; + case 'q':case 'Q': rank = 10; break; + case 'k':case 'K': rank = 11; break; + case 'a':case 'A': rank = 12; break; + default:bad_card = true; break; + } + + ch = getchar(); + switch (ch) { + case 'c': case 'C': suit = 0; break; + case 'd': case 'D': suit = 1; break; + case 'h': case 'H': suit = 2; break; + case 's': case 'S': suit = 3; break; + default: bad_card = true; break; + } + + // 1 + // Ƿַ + while ((ch = getchar()) != '\n') { + if (ch != ' ') + bad_card = true; + } + + if (bad_card) + printf("Bad card; ignored.\n"); + else if (card->cardInHand[suit][rank]) + printf("Duplicated card; ignored.\n"); + else { + ++card->numRank[rank]; + ++card->numSuit[suit]; + card->cardInHand[suit][rank] = true; + card_read--; + } + } +} + +void analyseCard(CardType* card) { + + int i, count; + + // ͬͬɫ + for (i = 0; i < SUIT; i++) { + if (card->numSuit[i] == 5) + card->flush = true; + } + + // 2 + // ˳ƣм䲻ܸ + + i = 0; + // ҵֵһŴڵ + while (card->numRank[i] == 0) + i++; + count = 0; + for (; i < RANK && card->numRank[i] != 0; i++) { + count++; + } + // ˳ӱ + if (count == CARD) { + card->straight = true; + return; // ˳ӿ϶Ƕ + } + + for (i = 0; i < RANK; i++) { + if (card->numRank[i] == 4) + card->four = true; + if (card->numRank[i] == 3) + card->three = true; + if (card->numRank[i] == 2) + ++card->pair; + } + +} + +void printResult(CardType* card) { + + if (card->flush && card->straight) + printf("Stright flush\n"); + else if (card->four) + printf("Four of a kind\n"); + else if (card->three && card->pair == 1) + printf("Full house\n"); + else if (card->flush) + printf("flush\n"); + else if (card->straight) + printf("straight\n"); + else if (card->three) + printf("Three of a kind\n"); + else if (card->pair == 2) + printf("Two pairs\n"); + else if (card->pair == 1) + printf("pair\n"); + else + printf("High card\n"); + + printf("\n\n"); +} diff --git a/code/practise/10 程序结构/02 手牌分类/readme.md b/code/practise/10 程序结构/02 手牌分类/readme.md new file mode 100644 index 0000000..afdaffd --- /dev/null +++ b/code/practise/10 程序结构/02 手牌分类/readme.md @@ -0,0 +1,56 @@ +#### 程序:手牌分类 + +编写程序对手牌进行读取和分类。手中的每张牌都有花色(方块,梅花,红桃和黑桃)和等级(2,3,4,5,6,7,8,9,T,J,Q,K 和 A)。不允许使用王牌,并且假设 A 是最高等级的。一手 5 张牌,然后把手中的牌分为下列某一类(列出的顺序从好到坏)。 + +- 同花顺(顺序连续且同花色) +- 四张(4 张牌等级相同) +- 葫芦(3 张牌等级一样,另外2 张等级一样) +- 同花(5 张牌同花色) +- 顺子(5 张牌等级顺序连续) +- 三张(3 张牌等级连续) +- 两对 +- 一对(2 张牌等级一样) +- 其他牌 + +如果一手牌可以分为两种或多种类别,程序将选择最好的一种。 + +为了便于输入,将牌的等级和花色简化如下: + +- 等级: 2,3,4,5,6,7,8,9,T,J,Q,K ,A +- 花色:c d h s + +如果用户输入非法牌或者输入同一张牌两次,程序将此牌忽略掉,产生错误信息,然后要求输入另一张牌。如果输入为 0 而不是一张牌,就会导致程序终止。 + +与程序的会话如下: + +```c +Enter a card : 2s +Enter a card : 5s +Enter a card : 4s +Enter a card : 3s +Enter a card : 6s +Straight flush + +Enter a card : 8c +Enter a card : as +Enter a card : 8c +Duplicated card; ignored. +Enter a card : 7c +Enter a card : ad +Enter a card : 3h +Pair + +Enter a card : 6s +Enter a card : d2 +Bad card; ignored. +Enter a card : 2d +Enter a card : 9c +Enter a card : 4h +Enter a card : ts +High card + +Enter a card: 0 +``` + + +