【数据结构与算法】学习笔记-《算法笔记》-3

函数

  • 函数的基本语法格式
    返回类型 函数名称(参数类型 参数){
    函数主体
    }

  • 值传递:函数定义的小括号内的参数称为形参,实际调用的参数为实参

  • 数组作为函数参数:实际调用的时候只要写数组名。
    在函数中对数组元素的修改就等同于对原数组元素的修改(这与普通的局部变量不同)
    不过,虽然数组可以作为参数,却不允许作为返回类型出现。
    练习
    习题7-5 字符串逆序存放

题目描述 写一个函数将一个字符串按反序存放。在主函数中输入一个字符串,通过调用该函数,得到该字符串按反序存放后的字符串,并输出。 输入
一行字符串。 输出 输入字符串反序存放后的字符串。单独占一行。

#include <cstdio>
#include<cstring>

void k(char s1[], char s2[])
{
	int n = strlen(s1);
	for (int i = 0; i < n; i++)
	{
		 s2[i]= s1[n-i-1] ;
	}
}
 
int main()
{
	char str1[100], str2[100] = {};
	scanf("%s", str1);
	k(str1, str2);
	printf("%s",str2);
	return 0;
}

习题7-7 复制字符串中的元音字母

题目描述
写一个函数,将一个字符串中的元音字母复制到另一个字符串中。在主函数中输入一个字符串,通过调用该函数,得到一个有该字符串中的元音字母组成的一个字符串,并输出。
输入 一个字符串(一行字符)。

输出 该字符串所有元音字母构成的字符串。行尾换行。

- [x] 遇到问题

#include <cstdio>
#include<cstring>

void vowels(char s1[], char s2[])
{
	int n = strlen(s1),j=0;
	for (int i = 0; i < n; i++)
	{
		if ((s1[i] == 'a') || (s1[i] == 'e') || (s1[i] == 'i') || (s1[i] == 'o') || (s1[i] == 'u'))
		{
			s2[j] = s1[i];
			j++;
		}
	}
}
 
int main()
{
	char str1[100], str2[100];//*
	scanf("%s", str1);
	vowels(str1, str2);
	printf("%s", str2);
	return 0;
}

在主函数中没有初始化str2[100]={};的情况下,最终结果会输入乱码(正确的转换字符串后跟一堆“烫”)
解决办法:对str2进行初始化,但还是不知道要怎么解释这个问题。

指针

  • 指针是一个unsigned类型的整数
  • 指针变量用来存放指针,在某种数据类型后/前加*来表示这是一个指针变量
	int *p;//C写法
	int* p;//C++写法
	int* p1, p2, p3;//只有p是指针变量
	int *p1, *p2, *p3;//三个都是指针变量
  • 其中,int* 是变量类型,后面的p才是变量名,因此地址是赋给p而不是*p
  • & 取地址符 *取内容符
  • 指针类型也可以作为函数参数的类型,这时视为把变量的地址传入函数,如果在函数中对这个地址中的元素进行改变,原先的数据就会确实地被改变,这种方式称为地址传递。
#include <cstdio>
#include<cstring>

void change(int* p) {
	*p = 233;
}

int main()
{
	int a = 1;
	int* p = &a;
	change(p);
	printf("%d\n",a);
	return 0;
}

这里使用*p修改地址中存放的数据,也就是改变了a本身,改变了a的值。

  • 使用指针作为参数,交换两个数
#include <cstdio>
#include<cstring>

void swap(int* pa,int* pb) {
	int temp;
	temp = *pa;
	*pa = *pb;
	*pb = temp;
}

int main()
{
	int a = 1, b = 2;
	int* pa = &a;
	int* pb = &b;
	swap(pa, pb);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}
  • 引用不产生副本,只是给原变量起了一个别名
    - [ ] 遇到问题:引用是什么东西?

练习
C语言10.1

题目描述
输入a和b两个整数,按先大后小的顺序输出a和b。注意请使用指针变量的方式进行比较和输出。

输入 两个用空格隔开的整数a和b。

输出 按先大后小的顺序输出a和b,用空格隔开。 请注意行尾输出换行。

#include <cstdio>
#include<cstring>

void func(int* pa,int* pb) {
	int temp;
	if (*pa <= *pb)
	{
		temp = *pa;
		*pa = *pb;
		*pb = temp;
	}
}

int main()
{
	int a , b ;
	scanf("%d %d", &a, &b);
	int* pa = &a;
	int* pb = &b;
	func(pa, pb);
	printf("%d %d\n",a,b);
	return 0;
}

C语言10.2

题目描述 输入a、b、c三个整数,按先大后小的顺序输出a、b和c。注意请使用指针变量的方式进行比较和输出。

输入 三个用空格隔开的整数a、b和c。

输出 按先大后小的顺序输出a、b和c,用空格隔开。 请注意行尾输出换行。

#include <cstdio>
#include <cstring>

void change(int* p1, int* p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int main()
{
	int a , b,c ;
	scanf("%d %d %d", &a, &b,&c);
	int* pa = &a;
	int* pb = &b;
	int* pc = &c;
	if (*pb < *pc) change(pb, pc);
	if (*pa < *pb) change(pa, pb);
	if (*pb < *pc) change(pb, pc);
	printf("%d %d %d\n",a,b,c);
	return 0;
}

C语言10.10

题目描述 给定字符串定义char *a = “I love China!”,读入整数n,
输出在进行了a = a +n这个赋值操作以后字符指针a对应的字符串。

输入 一个整数n,保证0<=n<13.

输出 输出进行了题目描述中赋值操作之后a对应的字符串。 请注意行尾输出换行。

#include <cstdio>
#include <cstring>


int main()
{
	char str[14] = "I love China!";
	char* a = str;
	int t;
	scanf("%d", &t);
	for (int i = t; i < 13; i++)
	{
		printf("%c", *(a + i));
	}
	return 0;
}

C语言10.15

题目描述 输入3个字符串,按从小到大的顺序输出。
要求使用指针的方法进行处理。
输入 3行,每行一个用字符串。保证每个字符串的长度不超过20。
输出 按从小到大的顺序输出这3个字符串,每个字符串一行。
请注意行尾输出换行。

- [ ] 遇到问题

#include "stdafx.h"
#include <cstdio>
#include <cstring>

void change(char* str1,char* str2)
{
	char temp;
	temp = *str1;
	*str1 = *str2;
	*str2 = temp;
}

int main()
{
	char stra[10], strb[10], strc[10];
	scanf("%s\n%s\n%s",stra,strb,strc);
	char *a=stra, *b=strb, *c=strc;
	if (strcmp(a, b) > 0)	change(a, b);
	if (strcmp(b, c) > 0)	change(b, c);
	if (strcmp(a, b) > 0)	change(a, b);
	printf("%s\n%s\n%s", stra, strb, strc);
	return 0;
}

C语言10.16

题目描述
输入10个整数,将其中最小的数与第一个数对换,
把最大的数与最后一个数对换。要求用3个函数实现,
分别为输入10个数、进行处理、输出10个数。
要求使用指针的方法进行处理。
输入 用空格隔开的10个整数。
输出 输出进行题目描述操作之后的10个整数,每个整数之后输出一个空格。 请注意行尾输出换行。

#include <cstdio>
#include <cstring>

void input(int* a)
{
	for (int i = 0; i <= 9; i++)
	{
		scanf("%d", a+i);//这里到底要不要取址
	}

}

void change(int* a)
{
	/**(a + 9)=999;*/
	int *min,*max;
	min =a; max = (a + 9);//这里之前写错了
	for (int i = 0; i <= 9; i++)
	{
		if (*(a+i) <= *min)		min = (a + i);
		if (*(a + i) >= *max)	max = (a + i);
	}
	int temp;
	temp = *a;
	*a = *min;
	*min = temp;
	temp = *(a+9);
	*(a + 9) = *max;
	*max = temp;
}

void output(int* a)
{
	for (int i = 0; i <= 9; i++)
	{
		printf("%d ",*( a + i));//这里到底要不要取址
	}
}

int main()
{
	int a[10];
	int *p = a;
	input(p);
	change(p);
	output(p);
	return 0;
}
发布了43 篇原创文章 · 获赞 4 · 访问量 1224

猜你喜欢

转载自blog.csdn.net/weixin_42176221/article/details/99691333