实验5

实验任务1

实验代码

#include <stdio.h>
#define N 4
int main()
{
	int x[N] = {1, 9, 8, 4};
	int i;
	int *p;
	for (i = 0; i < N; ++i)
	printf("%d", x[i]);
	printf("\n");
	for (p = x; p < x + N; ++p)
	printf("%d", *p);
	printf("\n");
	p = x;
	for (i = 0; i < N; ++i)
	printf("%d", *(p + i));
	printf("\n");
	p = x;
	for (i = 0; i < N; ++i)
	printf("%d", p[i]);
	printf("\n");
	return 0;
}

#include <stdio.h>

int main() {
	
	int x[2][4] = {{1, 9, 8, 4}, {2, 0, 4, 9}};
	int i, j;
	int *p;
	int (*q)[4];

	for(i = 0;i < 2; i++) {
		for(j = 0;j < 4; j++)
			printf("%d", x[i][j]);
		printf("\n");
	}
	
	for(p = &x[0][0], i = 0;p < &x[0][0] + 8; ++p, ++i) 
	{
		printf("%d", *p);
		if((i + 1) % 4 == 0) 
			printf("\n"); 
	}
	
	for(q = x;q < x + 2; ++q) {
		for(j = 0;j < 4; ++j)
			printf("%d", *(*q + j));
		printf("\n");
	}
	
	return 0;
}

实验结论


实验任务2

实验代码

#include <stdio.h>
#include <string.h>
#define N 80

int main() {
	
	char s1[] = "Learning makes me happy";
	char s2[] = "Learning makes me sleepy";
	char tmp[N];
	
	printf("sizeof(s1) vs. strlen(s1): \n");
	printf("sizeof(s1) = %d\n", sizeof(s1));
	printf("strlen(s1) = %d\n", strlen(s1));
	
	printf("\nbefore swap: \n");
	printf("s1: %s\n", s1);
	printf("s2: %s\n", s2);
	
	printf("\nswapping...\n");
	strcpy(tmp, s1);
	strcpy(s1, s2);
	strcpy(s2, tmp);
	
	printf("\nafter swap: \n");
	printf("s1: %s\n", s1);
	printf("s2: %s\n", s2);	
	
	return 0;
}
#include <stdio.h>
#include <string.h>
#define N 80
int main() {
	
	//char *s1 = "Learning makes me happy";
	char *s1;
	s1 = "Learning makes me happy";
	char *s2 = "Learning makes me sleepy";
	char *tmp;
	
	printf("sizeof(s1) vs. strlen(s1): \n");
	printf("sizeof(s1) = %d\n", sizeof(s1));
	printf("strlen(s1) = %d\n", strlen(s1));
	
	printf("\nbefore swap: \n");
	printf("s1: %s\n", s1);
	printf("s2: %s\n", s2);
	printf("\nswapping...\n");
	
	tmp = s1;
	s1 = s2;
	s2 = tmp;
	
	printf("\nafter swap: \n");
	printf("s1: %s\n", s1);
	printf("s2: %s\n", s2);
	
	return 0;
}

实验结论


回答问题

task2_1:
1.数组s1的大小是24,sizeof计算的是大小包括'0',strlen计算的是长度
2.不能,不能像这样直接声明一个没有确定大小的数组。字符串赋值只能一位一位的。
3.交换了
task2_2:
1.指针s1存放的是字符数组的首地址,sizeof计算的一个指针的大小,strlen计算的是长度
2.能
3.交换的是指针,储存单元中的内容没有交换

实验任务3

实验代码

#include <stdio.h>
 
void str_cpy(char *target, const char *source);
void str_cat(char *str1, char *str2);

int main() {
	
	char s1[80], s2[20] = "1984";
	
	str_cpy(s1, s2);
	puts(s1);
	
	str_cat(s1, " Animal Farm");
	puts(s1);
	
	return 0;
}

void str_cpy(char *target, const char *source) {
	while (*target++ = *source++);
}

void str_cat(char *str1, char *str2) {
	while (*str1)
		str1++;
	while (*str1++ = *str2++);
}

实验结论

实验任务4

实验代码

#include <stdio.h>
#define N 80

int func(char *);

int main() {
	
	char str[80];
	while (gets(str) != NULL) {
		if (func(str))
			printf("yes\n");
		else
			printf("no\n");
	}
	
	return 0;
}

int func(char *str) {
	char *begin, *end;
	begin = end = str;
	while (*end)
		end++;
	end--;
	while (begin < end) {
		if (*begin != *end)
			return 0;
		else {
			begin++;
			end--;
		}
	}
	return 1;
}

实验结论

实验任务5

实验代码

#include <stdio.h>
#define N 80

void func(char *);

int main() {
	char s[N];
	while (scanf("%s", s) != EOF) {
		func(s);
		puts(s);
	}
		
	return 0;
}

void func(char *str)
{
	int i;
	char *p1, *p2, *p;
	
	p1 = str;
	while (*p1 == '*')
		p1++;
		
	p2 = str;
	while (*p2)
		p2++;
	p2--;
	
	while (*p2 == '*')
		p2--;
	p = str;
	
	i = 0;
	while (p < p1) {
		str[i] = *p;
		p++;
		i++;
	}
	while (p <= p2) {
		if (*p != '*') {
			str[i] = *p;
			i++;
		}
		p++;
	}
	while (*p != '\0') {
		str[i] = *p;
		p++;
		i++;
	}
	str[i] = '\0';
}

实验结论

实验任务6

实验代码

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

void sort(char *name[], int n);

int main() {
	
	char *course[4] = {"C Program",
						"C++ Object Oriented Program",
						"Operating System",
						"Data Structure and Algorithms"};
	int i;
	
	sort(course, 4);
	for (i = 0; i < 4; i++)
		printf("%s\n", course[i]);
		
	return 0;
}

void sort(char *name[], int n) {
	
	int i, j;
	char *tmp;
	
	for (i = 0; i < n - 1; ++i)
		for (j = 0; j < n - 1 - i; ++j)
			if (strcmp(name[j], name[j + 1]) > 0) {
				tmp = name[j];
				name[j] = name[j + 1];
				name[j + 1] = tmp;
			}
}
#include <stdio.h>
#include <string.h>

void sort(char *name[], int n);

int main() {
	
	char *course[4] = {"C Program",
						"C++ Object Oriented Program",
						"Operating System",
						"Data Structure and Algorithms"};
	int i;
	
	sort(course, 4);
	for (i = 0; i < 4; i++)
		printf("%s\n", course[i]);
		
	return 0;
}

void sort(char *name[], int n) {
	
	int i, j, k;
	char *tmp;
	
	for (i = 0; i < n - 1; i++) {
		k = i;
		for (j = i + 1; j < n; j++)
			if (strcmp(name[j], name[k]) < 0)
				k = j;
			if (k != i) {
				tmp = name[i];
				name[i] = name[k];
				name[k] = tmp;
			}
	}
}
 

实验结论


回答问题

交换的是内存中字符串的储存位置

实验任务7

实验代码

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

#define N 5

int check_id(char *str);

int main() {
	
	char * pid[N] = {"31010120000721656X",
					"330106199609203301",
					"53010220051126571",
					"510104199211197977",
					"53010220051126133Y"};
	int i;
	
	for(i = 0;i < N; i++) 
		if(check_id(pid[i]))
			printf("%s\tTrue\n", pid[i]);
		else
			printf("%s\tFalse\n", pid[i]);
	
	return 0;
} 

int check_id(char *str) {
	int len = strlen(str);
	int i;
	
	if(len != 18) return 0;
	
	for(i = 0;i < len; i++) {
		char x = *(str + i);
		if(i == 17) {
			if((x >= '0' && x <= '9') || x =='X') continue ;
			else return 0;
		}
		else {
			if(x >= '0' && x <= '9') continue ;
			else return 0;
		}
	}
	return 1;
}

实验结论

实验任务8

实验代码

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

#define N 80

void encoder(char *s);
void decoder(char *s);

int main() {
	
	char words[N];
	
	printf("输入英文文本:");
	gets(words);
	
	printf("编码后的英文文本:");
	encoder(words);
	printf("%s\n", words);
	
	printf("对编码后的英文文本解码:");
	decoder(words);
	printf("%s\n", words);
	
	return 0;
}

void encoder(char *s) {
	int i, len;
	
	len = strlen(s);
	
	for(i = 0;i < len; i++) {
		char x;
		x = *(s + i);
		if((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z')) {
			if(x == 'z') *(s + i) = 'a';
			else if(x == 'Z') *(s + i) = 'A';
			else *(s + i) = x + 1;
		}
	}
}

void decoder(char *s) {
	int i, len;
	
	len = strlen(s);
	
	for(i = 0;i < len; i++) {
		char x;
		x = *(s + i);
		if((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z')) {
			if(x == 'a') *(s + i) = 'z';
			else if(x == 'A') *(s + i) = 'Z';
			else *(s + i) = x - 1;
		}
	}
}

实验结论



posted @ 2023-05-06 20:25  C锥  阅读(13)  评论(0编辑  收藏  举报