CH12_1
(a):
#include <stdio.h>
#define MAX_LEN 100
int main(void)
{
char a[MAX_LEN];
int i;
printf("Enter a message: ");
for (i = 0; i < MAX_LEN; i++) {
a[i] = getchar();
if (a[i] == '\n')
break;
}
printf("Reversal is: ");
for (i--; i >= 0; i--) {
putchar(a[i]);
}
putchar('\n');
return 0;
}
(b):
#include <stdio.h>
#define MAX_LEN 100
int main(void)
{
char a[MAX_LEN];
int* p;
printf("Enter a message: ");
for (p = a; p < a + MAX_LEN; p++) {
a[p - a] = getchar();
if (a[p - a] == '\n')
break;
}
printf("Reversal is: ");
for (p--; p >= a; p--) {
putchar(a[p - a]);
}
putchar('\n');
return 0;
}
CH12_2
(a):
#include <stdio.h>
#include <ctype.h>
#define MAX_LEN 100
int main(void)
{
char a[MAX_LEN];
char ch;
int i, num;
int flag = 0;
printf("Enter a message: ");
for (i = 0; i < MAX_LEN; ) {
ch = toupper(getchar());
if (ch == '\n') {
break;
}
else if (ch >= 'A' && ch <= 'Z') {
a[i] = ch;
i++;
}
}
num = --i;
for (int i = num, j = 0; i >= num / 2 && j <= num / 2; i--, j++) {
if (a[i] == a[j]) {
flag++;
}
}
if (flag == num / 2 + 1) {
printf("Palindrome\n");
}
else {
printf("Not a palindrome\n");
}
return 0;
}
(b):
#include <stdio.h>
#include <ctype.h>
#define MAX_LEN 100
int main(void)
{
char a[MAX_LEN];
char ch;
int flag = 0;
char* p, * num;
printf("Enter a message: ");
for (p = a; p < a + MAX_LEN; ) {
ch = toupper(getchar());
if (ch == '\n') {
break;
}
else if (ch >= 'A' && ch <= 'Z') {
a[p - a] = ch;
p++;
}
}
num = --p;
for (char* p = num, *q = a; p >= a + (num - a) / 2 && q <= a + (num - a) / 2; p--, q++) {
if (a[p - a] == a[q - a]) {
flag++;
}
}
if (flag == (num - a) / 2 + 1) {
printf("Palindrome\n");
}
else {
printf("Not a palindrome\n");
}
return 0;
}
CH12_3
//已经在CH12_1(b)中采用了该方式,无需简化
CH12_4
//已经在CH12_2(b)中采用了该方式,无需简化
CH12_5
#include <stdio.h>
int main(void)
{
char ch[100];
char* p = ch;
char* t1;
char* t2;
printf("Enter a sentence: ");
while ((ch[p - ch] = getchar()) != '.' && ch[p - ch] != '?' && ch[p - ch] != '!') {
t1 = ++p;
}
char sign = ch[p - ch]; //记录符号位
if (p == ch) {
printf("Reversal of sentence: %c\n", sign);
return 0;
}
ch[p - ch] = ' ';
t2 = t1; //t2表示一个单词左方指示,t1表示该单词右方指示,并将t2至t1单词输出
//然后再重复移动t1,t2。具体见下面循环
printf("Reversal of sentence: ");
while (1) {
while (ch[t2 - ch] != ' ') {
t2--;
if (t2 - ch == -1) {
break;
}
}
for (char* i = t2 + 1; i <= t1; i++) {
printf("%c", ch[i - ch]);
}
t1 = t2--;
if (t2 - ch == -2) {
break;
}
}
printf("\b%c\n", sign);
return 0;
}
CH12_6
#include <stdio.h>
#define N 10
void quicksort(int* low, int* high);
int* split(int* low, int* high);
int main(void)
{
int a[N], i;
printf("Enter %d numbers to be sorted: ", N);
for (i = 0; i < N; i++)
scanf("%d", &a[i]);
quicksort(a, a + N - 1);
printf("In sorted order: ");
for (i = 0; i < N; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
void quicksort(int* low, int* high)
{
int* middle;
if (low >= high) return;
middle = split(low, high);
quicksort(low, middle - 1);
quicksort(middle + 1, high);
}
int* split(int* low, int* high)
{
int part_element = *low;
for (;;) {
while (low < high && part_element <= *high)
high--;
if (low >= high) break;
*low++ = *high;
while (low < high && *low <= part_element)
low++;
if (low >= high) break;
*high-- = *low;
}
*high = part_element;
return high;
}
CH12_7
#include <stdio.h>
#define N 10
void max_min(int a[], int n, int* max, int* min);
int main(void)
{
int b[N], i, big, small;
printf("Enter %d numbers: ", N);
for (i = 0; i < N; i++)
scanf("%d", &b[i]);
max_min(b, N, &big, &small);
printf("Largest: %d\n", big);
printf("Smallest: %d\n", small);
return 0;
}
void max_min(int a[], int n, int* max, int* min)
{
int* p;
*max = *min = a[0];
for (p = a + 1; p < a + n; p++) {
if (*p > * max)
*max = *p;
else if (*p < *min)
*min = *p;
}
}