算法笔记@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
- 题目描述 ,输入a和b两个整数,按先大后小的顺序输出a和b。注意请使用指针变量的方式进行比较和输出。
- 输入,两个用空格隔开的整数a和b。
- 输出,按先大后小的顺序输出a和b,用空格隔开。
请注意行尾输出换行。 - 样例输入, 5 9
- 样例输出, 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
- 题目描述 ,输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。
- 输入,三个用空格隔开的整数a、b和c。
- 输出,按先大后小的顺序输出a、b和c,用空格隔开。请注意行尾输出换行
- 样例输入, 9 0 10
- 样例输出, 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
- 题目描述 ,给定字符串定义char *a = “I love China!”,读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串。
- 输入,一个整数n,保证0<=n<13.
- 输出,输出进行了题目描述中赋值操作之后a对应的字符串。请注意行尾输出换行。
- 样例输入, 7
- 样例输出, 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
- 题目描述 ,输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理。
- 输入,3行,每行一个用字符串。保证每个字符串的长度不超过20。
- 输出,按从小到大的顺序输出这3个字符串,每个字符串一行。请注意行尾输出换行。
- 样例输入,
China
CLOCK
deal - 样例输出,
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
- 题目描述 ,输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
- 输入,用空格隔开的10个整数。
- 输出,输出进行题目描述操作之后的10个整数,每个整数之后输出一个空格。请注意行尾输出换行。
- 样例输入, 1 5 2 4 9 0 3 8 7 6
- 样例输出, 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;
}