实验四

实验任务1.1

实验代码

#include <stdio.h>
#define N 4
int main() {
	int a[N] = {2, 0, 2, 3};
	char b[N] = {'2', '0', '2', '3'};
	int i;
	
	printf("sizeof(int) = %d\n", sizeof(int));
	printf("sizeof(char) = %d\n", sizeof(char));
	printf("\n");
	
	for (i = 0; i < N; ++i)
		printf("%p: %d\n", &a[i], a[i]);
	
	printf("\n");
	
	for (i = 0; i < N; ++i)
		printf("%p: %c\n", &b[i], b[i]);
	
	printf("\n");
	
	printf("a = %p\n", a);
	printf("b = %p\n", b);

	return 0;
}

实验结论

回答问题

1.连续,4个字节
2.连续,1个字节
3.一样,一样

实验任务1.2

实验代码

#include <stdio.h>
#define N 2
#define M 3

int main() {
	int a[N][M] = {{1, 2, 3}, {4, 5, 6}};
	char b[N][M] = {{'1', '2', '3'}, {'4', '5', '6'}};
	int i, j;

	for (i = 0; i < N; ++i)
		for (j = 0; j < M; ++j)
			printf("%p: %d\n", &a[i][j], a[i][j]);

	printf("\n");

	printf("a[0] = %p\n", a[0]);
	printf("a[1] = %p\n", a[1]);
	printf("\n");

	for (i = 0; i < N; ++i)
		for (j = 0; j < M; ++j)
			printf("%p: %c\n", &b[i][j], b[i][j]);
	printf("\n");

	printf("b = %p\n", b);
	printf("b[0] = %p\n", b[0]);
	printf("b[1] = %p\n", b[1]);
	printf("\n");
	
	return 0;
}

实验结论

回答问题

1.是,四个字节
2.是一样的
3.是,一个字节
4.是一样的
5.a[0]的值为a[0,0]的值,a[1]的值为a[1,1]的值
b[0]的值为b[0,0]的值,b[1]的值为b[1,1]的值

实验任务2

实验代码

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

#define N 80

void swap_str(char s1[N], char s2[N]);
void test1();
void test2();

int main() {
	printf("测试1: 用两个一维维数组,实现两个字符串交换\n");
	test1();

	printf("\n测试: 用二维数组,实现两个字符串交换\n");
	test2();

	return 0;
}

void test1() {
	char views1[N] = "hey, C, I hate u.";
	char views2[N] = "hey, C, I love u.";

	printf("交换前: \n");
	puts(views1);
	puts(views2);

	swap_str(views1, views2);

	printf("交换后: \n");
	puts(views1);
	puts(views2);
}
void test2() {
	char views[2][N] = {"hey, C, I hate u.", "hey, C, I love u."};

	printf("交换前: \n");
	puts(views[0]);
	puts(views[1]);

	swap_str(views[0], views[1]);

	printf("交换后: \n");
	puts(views[0]);
	puts(views[1]);
}
void swap_str(char s1[N], char s2[N]) {
	char tmp[N];
	
	strcpy(tmp, s1);
	strcpy(s1, s2);
	strcpy(s2, tmp);
}

实验结论

回答问题

views1为"hey, C, I hate u."的首地址,views2为"hey, C, I love u."的首地址,输出时直接输出views1,views2即可,
views[0]为"hey, C, I hate u."的首地址,views[1]为"hey, C, I love u."的首地址,
views1为一个整体,views[0]为一个整体

实验任务3.1

实验代码

#include <stdio.h>

#define N 80

int count(char x[]);

int main() {
	char words[N+1];
	int n;

	while(gets(words) != NULL) {
		n = count(words);
		printf("单词数: %d\n\n", n);
	}
	return 0;
}
int count(char x[]) {
	int i;
	int word_flag = 0; // 用作单词标志,一个新单词开始,值为1;单词结束,值为0
	int number = 0; // 统计单词个数

	for(i = 0; x[i] != '\0'; i++) {
		if(x[i] == ' ')
			word_flag = 0;
		else if(word_flag == 0) {
			word_flag = 1;
			number++;
		}
	}
	return number;
}

实验结论

实验任务3.2

实验代码

#include <stdio.h>
#define N 1000
int main() {
	char line[N];
	int word_len;
	int max_len;
	int end; 
	int i;

	while(gets(line) != NULL) {
		word_len = 0;
		max_len = 0;
		end = 0;

		i = 0;
		while(1) {

			while(line[i] == ' ') {
				word_len = 0; 
				i++;
			}

			while(line[i] != '\0' && line[i] != ' ') {
				word_len++;
				i++;
			}

			if(max_len < word_len) {
				max_len = word_len;
				end = i; 
		}

			if(line[i] == '\0')
				break;
		}

		printf("最长单词: ");
		for(i = end - max_len; i < end; ++i)
			printf("%c", line[i]);
		printf("\n\n");
	}
	return 0;
}

实验结论

回答问题

可以引入 ctype.h 头文件,使用 isspace() 函数来判断是否是空格,使用 isalpha() 函数来判断一个字符是否是字母。

实验任务4

实验代码

#include <stdio.h>
#define N 5

void input(int x[], int n);
void output(int x[], int n);
double average(int x[], int n);
void bubble_sort(int x[], int n);

int main() {
	int scores[N];
	double ave;

	printf("录入%d个分数:\n", N);
	input(scores, N);

	printf("\n输出课程分数: \n");
	output(scores, N);

	printf("\n课程分数处理: 计算均分、排序...\n");
	ave = average(scores, N);
	bubble_sort(scores, N);

	printf("\n输出课程均分: %.2f\n", ave);
	printf("\n输出课程分数(高->低):\n");
	output(scores, N);

	return 0;
}


void input(int x[], int n) {
	int i;

	for(i = 0; i < n; ++i)
		scanf("%d", &x[i]);
}

void output(int x[], int n) {
	int i;

	for(i = 0; i < n; ++i)
		printf("%d ", x[i]);
	printf("\n");
}

double average(int x[], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += x[i];
    }
    double average = (double)sum / n;
    return average;
}


void bubble_sort(int x[], int n) {
    int i, j;
    for (i = 0; i < n-1; i++) {
        for (j = 0; j < n-i-1; j++) {
            if (x[j] < x[j+1]) {
                int temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
        }
    }
}

实验结论

实验任务5

实验代码

#include <stdio.h>
#define N 100
void dec2n(int x, int n); 

int main() {
	int x;

	printf("输入一个十进制整数: ");
	while(scanf("%d", &x) != EOF) {
		dec2n(x, 2);
		dec2n(x, 8); 
		dec2n(x, 16); 

		printf("\n输入一个十进制整数: ");
	}
	return 0;
}

void dec2n(int x, int n) {
    int result[100], i = 0;
    
    while (x > 0) {
        result[i] = x % n;
        x /= n;
        i++;
    }
    
    printf("%d进制数为:", n);
    for (int j = i - 1; j >= 0; j--) {
        if (result[j] < 10) {
            printf("%d", result[j]);
        } else {
            printf("%c", 'A' + result[j] - 10);
        }
    }
    printf("\n");
}

实验结论

实验任务6

实验代码

#include <stdio.h>
#define N 100
#define M 4

void output(int x[][N], int n);
void rotate_to_right(int x[][N], int n);

int main() {
    int t[][N] = {{21, 12, 13, 24},
                  {25, 16, 47, 38},
                  {29, 11, 32, 54},
                  {42, 21, 33, 10}};
    printf("原始矩阵:\n");
    output(t, M);

    rotate_to_right(t, M);

    printf("变换后矩阵:\n");
    output(t, M);

    return 0;
}

void output(int x[][N], int n) {
    int i, j;

    for (i = 0; i < n; ++i) {
        for (j = 0; j < n; ++j)
            printf("%4d", x[i][j]);

        printf("\n");
    }
}

void rotate_to_right(int x[][N], int n) {
    int tmp[N];
    for (int i = 0; i < n; i++) {
        
        for (int j = n-1; j >= 0; j--) {
            if (j == n - 1) {
                tmp[j] = x[i][j];
            } else {
                x[i][j + 1] = x[i][j];
            }
        }
        
		x[i][0] = tmp[n - 1];
    }
}

实验结论

实验任务7.1

实验代码

#include <stdio.h>
#define N 80

void replace(char x[], char old_char, char new_char);

int main() {
	char text[N] = "Life is a fucking movie.";

	printf("原始文本: \n");
	printf("%s\n", text);

	replace(text, 'i', '*');

	printf("处理后文本: \n");
	printf("%s\n", text);

	return 0;
}

void replace(char x[], char old_char, char new_char) {
	int i;
	
	for (i = 0; x[i] != '\0'; ++i) 
		if (x[i] == old_char)
			x[i] = new_char;
} 

实验结论

回答问题

1:在字符串中查找出指定字符并将其替换为另一字符
2:字符串结束符,当x[i]为\0时字符串刚好结束,此时字符串刚好被循环一遍。

实验任务7.2

实验代码

#include <stdio.h>
#define N 80

int main() {
	char str[N], ch;
	int i;

	printf("输入字符串: ");
	gets(str);

	printf("输入一个字符: ");
	ch = getchar();

	printf("截断处理......");
	
	i = 0;
	while (str[i] != '\0') {
		if (str[i] == ch)
			str[i] = '\0';
		i++;
}

	printf("\n截断处理后字符串: %s\n", str);

	return 0;
}

实验结论

实验任务8

实验代码

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

#define N 5
#define M 20

void bubble_sort(char str[][M], int n); 

int main() {
	char name[][M] = {"Bob", "Bill", "Joseph", "Taylor", "George"};
	int i;

	printf("输出初始名单:\n");
	for (i = 0; i < N; i++)
		printf("%s\n", name[i]);

	printf("\n排序中...\n");
	bubble_sort(name, N); 

	printf("\n按字典序输出名单:\n");
	for (i = 0; i < N; i++)
		printf("%s\n", name[i]);
	return 0;
}

void bubble_sort(char str[][M], int n){
	int i, j;
    char temp[M];

    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (strcmp(str[j], str[j+1]) > 0) {
                strcpy(temp, str[j]);
                strcpy(str[j], str[j+1]);
                strcpy(str[j+1], temp);
            }
        }
    }
}

实验结论