算法笔记习题 2-7小节

算法笔记@Ada_Lake

算法笔记代码保留地~~~

有关引用的一些话:
1.引用只是相当于给变量加了一个别名,但常量是不能加引用的。
2.

// Ada
#include<stdio.h>
void change(int* a, int* b){
	int *temp;
	temp = a; 
	a = b;
	b = temp;
}

int main(){
	int a = 2, b = 3;
	int *p, *q;
	p = &a, q = &b;
	
	change(p, q);
	printf("%d %d", *p, *q);
	return 0;
}

这样写*p, *q里面的值存放的仍然是2,3。因为函数交换的是地址的值,但那相当于改变的是副本的地址,与原本的无关。
而如果用引用,则相当于给主函数中的地址起了一个别名。交换的是两个地址,则两个地址所指向的内容就改变了

// Ada
#include<stdio.h>
void change(int* &a, int* &b){
	int *temp;
	temp = a; 
	a = b;
	b = temp;
}

2.7小节——C/C++快速入门->指针

问题 A: C语言10.1
  1. 题目描述 ,输入a和b两个整数,按先大后小的顺序输出a和b。注意请使用指针变量的方式进行比较和输出。
  2. 输入,两个用空格隔开的整数a和b。
  3. 输出,按先大后小的顺序输出a和b,用空格隔开。
    请注意行尾输出换行。
  4. 样例输入, 5 9
  5. 样例输出, 9 5

我的理解
1.用一个数组存放一个字符串
2.调用函数,函数实现的功能是将字符串反序
3.输出整个字符串
注意
指针变量的方式进行比较和输出。
以下是代码

// Ada
#include<stdio.h>
int main(){
	void compair(int*, int*);
	void print(int*, int*);
	
	int a, b;
	int* p, *q;
	p = &a, q = &b;
	
	scanf("%d %d", &a, &b);
	compair(p, q);
	print(p, q);
	
	return 0;
}

void compair(int* a, int* b) {
	int temp;
	temp = *a;
	*a = *b;
	*b = temp;
}
void print(int* a, int* b) {
	printf("%d %d", *a, *b);
}

问题 B: C语言10.2
  1. 题目描述 ,输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。
  2. 输入,三个用空格隔开的整数a、b和c。
  3. 输出,按先大后小的顺序输出a、b和c,用空格隔开。请注意行尾输出换行
  4. 样例输入, 9 0 10
  5. 样例输出, 10 9 0

我的理解
用指针即可

**以下是代码**
// Ada
#include<stdio.h>
int main(){
	int a, b, c, temp;
	int *p = &a, *q = &b, *f = &c;

	scanf("%d %d %d", &a, &b, &c);
	if(*p < *q){
		temp = *p;
		*p = *q;
		*q = temp;
	}
	if(*p < *f){
		temp = *p;
		*p = *f;
		*f = temp;
	}
	if(*q < *f){
		temp = *q;
		*q = *f;
		*f = temp; 
	}
	printf("%d %d %d", *p, *q, *f);
	
	return 0;
}
问题 C: C语言10.10
  1. 题目描述 ,给定字符串定义char *a = “I love China!”,读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串。
  2. 输入,一个整数n,保证0<=n<13.
  3. 输出,输出进行了题目描述中赋值操作之后a对应的字符串。请注意行尾输出换行。
  4. 样例输入, 7
  5. 样例输出, China!

我的理解
这题开始没看明白什么意思 其实char *a = “I love China!”;
就是定义了一个char型指针变量,变量名为a.给这个指针变量赋了一串字符串。指针指向首地址的位置。
a + n 即指针指向的位置往后移n位。输出 a + n位置的值即输出指针所指向的值
还是觉得有点没。。太想明白!!!
1.就当作先定义了一个字符数组。再定义了一个字符指针,指向这个字符数组
即 char a = “I love China!”;相当于
char a[30] = “I love china!”;
char
b = a;
2.printf("%s", a + n);
类比字符数组。字符数组的输入输出不就是
scanf("%s", str);
printf("%s", str);

// Ada
#include<stdio.h>
int main(){
	char a[50] = "I love China!";
	char* b = a;
	int n;

	scanf("%d", &n);
	b = b + n;
	printf("%s", b);
	
	return 0;
}
// Ada
#include<stdio.h>
int main(){
	char* p = "I love China!";
	int n;
	
	scanf("%d", &n);
	p = p + n;
	printf("%s", p); 
	
	return 0;
}
问题 D: C语言10.15
  1. 题目描述 ,输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理。
  2. 输入,3行,每行一个用字符串。保证每个字符串的长度不超过20。
  3. 输出,按从小到大的顺序输出这3个字符串,每个字符串一行。请注意行尾输出换行。
  4. 样例输入,
    China
    CLOCK
    deal
  5. 样例输出,
    CLOCK
    China
    deal

我的理解
我感觉数组指针,因为很多比较原本就是用数组首地址,只要把首地址赋给指针就可以了
以下是代码

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

int main(){
	char str1[20], str2[20], str3[20], temp[20];
	char* st1 = str1, *st2 = str2, *st3 = str3, *tep = temp;
	gets(st1);
	gets(st2);
	gets(st3);
	
	if( strcmp(st1, st2) > 0 ) {
		tep = st1;
		st1 = st2;
		st2 = tep;
	}
	if( strcmp(st1, st3) > 0 ) {
		tep = st1;
		st1 = st3;
		st3 = tep;		
	}
	if( strcmp(st2, st3) > 0 ) {
		tep = st2;
		st2 = st3;
		st3 = tep;		
	}
	
	puts(st1);
	puts(st2);
	puts(st3);
	
	return 0;
}

str1, str2已经存放在字符指针中了。现在要交换内容。除了像上面那样再定义一个数组和一个指针,交换指针外。还可以直接用strcpy
如下:

// Ada
void swap(char* p1, char* p2){
	char temp[100];
	strcpy(temp, p1);
	strcpy(p1, p2);
	strcpy(p2, temp);
}

因为如果直接交换不行。因为p1指针,temp是数组,类型不匹配。

问题 E: C语言10.16
  1. 题目描述 ,输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
  2. 输入,用空格隔开的10个整数。
  3. 输出,输出进行题目描述操作之后的10个整数,每个整数之后输出一个空格。请注意行尾输出换行。
  4. 样例输入, 1 5 2 4 9 0 3 8 7 6
  5. 样例输出, 0 5 2 4 6 1 3 8 7 9

我的理解
1.函数一:输入10个数
2.函数二:处理10个数
3.函数三:输出10个数

// Ada
#include<stdio.h>

void scan(int *p){
	for(int i = 0; i < 10; i++){
		scanf("%d",p + i);
	}
} 

void swap(int *p){
	int* max = p + 9, *min = p;
	int n;
	for(int i = 0; i < 10; i++){
		if(*(p + i) > *max){
			max = p + i;
		} 
		if(*(p + i ) < *min){
			min = p + i;
		}
	}
	n = *max;
	*max = *(p + 9);
	*(p + 9) = n;
	n = *min;
	*min = *p;
	*p = n;
	
} 

void print(int* a){
	for(int i = 0; i < 10; i++){
		printf("%d ", *(a + i));
	}
}

int main(){
	int a[10];
	scan(a);	 
	swap(a);
	print(a);
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值