diff --git a/code/practise/11 指针/01 数组的最大元素和最小元素/main.c b/code/practise/11 指针/01 数组的最大元素和最小元素/main.c new file mode 100644 index 0000000..af0ac0c --- /dev/null +++ b/code/practise/11 指针/01 数组的最大元素和最小元素/main.c @@ -0,0 +1,45 @@ +#include + +#define SIZE 5 + +void max_min(int a[], int len, int* max, int* min); + +int main(void) { + + int a[SIZE]; + int max, min, i; + + printf("Enter 5 numbers: "); + for (i = 0; i < SIZE; i++) + scanf("%d", &a[i]); + + max_min(a, SIZE, &max, &min); + + printf("Largest: %d\n", max); + printf("Smallest: %d\n", min); + + return 0; +} + +void max_min(int a[], int len, int* max, int* min) { + + int i; + + *max = *min = a[0]; + for (i = 1; i < len; i++) { + // a[i] *max ǿ϶ *min С֮Ҳ + if (a[i] > * max) + *max = a[i]; + else if (a[i] < *min) + *min = a[i]; + } + + // ԼдģΪ㷨ÿһѭҪж ifЧʿ϶ĸ + //for (i = 1; i < len; i++) { + // if (*max < a[i]) + // *max = a[i]; + + // if (*min > a[i]) + // *min = a[i]; + //} +} diff --git a/code/practise/11 指针/01 数组的最大元素和最小元素/readme.md b/code/practise/11 指针/01 数组的最大元素和最小元素/readme.md new file mode 100644 index 0000000..f772cfe --- /dev/null +++ b/code/practise/11 指针/01 数组的最大元素和最小元素/readme.md @@ -0,0 +1,10 @@ +#### 程序:找出数组中的最大元素和最小元素 + +与程序的交互如下: + +```c +Enter 5 numbers:9 5 2 7 8 +Largest: 9 +Smallest: 2 +``` + diff --git a/code/practise/13 字符串/01 设计字符串读取函数/read_line.c b/code/practise/13 字符串/01 设计字符串读取函数/read_line.c new file mode 100644 index 0000000..087cd44 --- /dev/null +++ b/code/practise/13 字符串/01 设计字符串读取函数/read_line.c @@ -0,0 +1,16 @@ +int read_line(char str[], int read_num) { + + int ch, i = 0; + + while ((ch = getchar()) != '\n' && ch != EOF) { + // i read_num ִвַ + if (i < read_num) + str[i++] = ch; + } + + str[i] = '\0'; + + return i; +} + +// ch int char ֻΪ getchar ַΪ int ͵ֵء diff --git a/code/practise/13 字符串/01 设计字符串读取函数/readme.md b/code/practise/13 字符串/01 设计字符串读取函数/readme.md new file mode 100644 index 0000000..5de929c --- /dev/null +++ b/code/practise/13 字符串/01 设计字符串读取函数/readme.md @@ -0,0 +1,25 @@ +#### 3. 逐个字符读取字符串 + +因为对许多程序而言,scanf 函数和 gets 函数都有风险而且不够灵活,C 程序员经常会自己编写输入函数。通过每次读一个字符的方式读取字符串。 + +如果决定自己设计输入函数,那么需要考虑以下问题: + +- 在开始存储字符串之前,函数应该跳过空白字符吗? +- 什么字符导致函数停止读取:换行符,任意空白字符,还是其他某种字符?需要存储这些字符还是忽略掉? +- 如果输入的字符串太长以至于无法存储,那么函数应该忽略额外的字符还是把它们留给下一次输入操作? + +示例中,我们选择:不跳过空白字符,换行符结束,不存储换行符,忽略掉额外字符。 + +函数原型如下: + +```c +int read_line(char str[], int read_num); +``` + +参数:str 表示存储输入的数组,read_num 表示读入字符的最大数量。 + +返回值:返回读入字符的个数。 + +使用 getchar 实现按字符读入。 + + diff --git a/code/practise/13 字符串/02 显示一个月的提醒列表/readme.md b/code/practise/13 字符串/02 显示一个月的提醒列表/readme.md new file mode 100644 index 0000000..1d06dfc --- /dev/null +++ b/code/practise/13 字符串/02 显示一个月的提醒列表/readme.md @@ -0,0 +1,20 @@ +#### 程序:显示一个月的提醒列表 + +此程序会显示每一个月的每日提醒列表。用户需要输入一系列提醒,每条提醒都要有一个前缀来说明是那一个月中的那一天。当用户输入的是 0 而不是有效日期时,程序会显示出录入的全部提醒列表(按日期排序)。下面是会话示例: + +```c +Enter day and reminder: 24 Suan's birstday +Enter day and reminder: 5 6:00 - Dinner with Marge +Enter day and reminder: 7 10:30 - Movie - "Chinatown" +Enter day and reminder: 0 +Day Reminder: + 5 6:00 - Dinner with Marge + 7 10:30 - Movie - "Chinatown" +24 Suan's birstday +``` + +- 读入提醒使用我们写的 read_line 函数 +- 将提醒存放在二维数组中,数组的每一行看作一个字符串。日期和提示消息都要放进去 。 +- 日期我们用整型输入,然后转换为字符串放入二维数组的前面。 +- 每次读入新的日期和提示消息后,将转为字符串的当前日期和二维数组每行前面表示日期的部分比较。如果当前日期字符串小于二维数组当前行的字符串,说明当前日期较小,应当插入到当前数组的行前一行。我们可以将二维数组从当前行到存放提示的最后一行每行依次向后移动一行,从而使得当前日期和提示可以插入二维数组的当前行。 +- 打印二维数组 \ No newline at end of file diff --git a/code/practise/13 字符串/02 显示一个月的提醒列表/remind.c b/code/practise/13 字符串/02 显示一个月的提醒列表/remind.c new file mode 100644 index 0000000..b5c655c --- /dev/null +++ b/code/practise/13 字符串/02 显示一个月的提醒列表/remind.c @@ -0,0 +1,76 @@ +#include +#include + +#define MAX_REMIND 50 +#define MSG_LEN 100 + + +int read_line(char str[], int read_num); + +int main(void) { + + char reminders[MAX_REMIND][MSG_LEN + 3]; // ʾ + char day_str[3];//ǰתΪַ + char msg_str[MSG_LEN + 1]; //ǰʾϢ + int day, num_remind = 0; // ں͵ǰʾ + int i, j; + + + for (;;) { + + if (num_remind == MAX_REMIND) { + printf("-- No space left --\n"); + break; + } + + printf("Enter day and reminder:"); + + scanf("%2d", &day); //ÿµֻʾɣֻ 2 ֶ + + if (day == 0) + break; + + sprintf(day_str, "%2d", day); // day "%2d" ĸʽд day_str ַС"%2d" ֤С10ռλҶ + read_line(msg_str, MSG_LEN); + + // ѰҵǰʾӦ÷ŵʾǸλ + for (i = 0; i < num_remind; i++) { + // ˵ǰӦڴǰ + if(strcmp(day_str, reminders[i]) < 0) + break; + } + + // ǰʾ뵽ȷλ + for (j = num_remind; j > i; j--) { + strcpy(reminders[j], reminders[j - 1]); + } + + strcpy(reminders[i], day_str); + strcat(reminders[i], msg_str);// պý day_str ƽȥĿַǵ + + num_remind++; + } + + printf("Day Reminder: \n"); + for (i = 0; i < num_remind; i++) + printf("%s\n", reminders[i]); + + + return 0; +} + + +int read_line(char str[], int read_num) { + + int ch, count = 0; + + while ((ch = getchar()) != '\n') { + if (count < read_num) { + str[count++] = ch; + } + } + + str[count] = '\0'; + + return count; +}