优秀的代码或解决某个问题的思路(2)

1.数组的倒序排列

// ConsoleApplication3.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

int *swap(int *c, int b)
{
	int *a = new int [b];
	int i;
	for (i = 0; i <= b - 1; i++)
	{
		a[i] = c[b - 1 - i];
	}
	return a;
}
int main()
{
	const int u = 12;
	int a[u];
	int i;
	for (i = 0; i <= 11; i++)
	{
		a[i] = i;
	}
	int *v=swap(a, u);
	for (i = 0; i <= 11; i++)
	{
		cout << v[i]<<" ";
	}
}


2.结构体和指针

// ConsoleApplication3.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

struct a
{
	int b;
	int c;
	char d;

}*k[4];
int main()
{
	a *p[4] = { &k[0],&k[1],&k[2],&k[3] };
	cin >> p[0]->b >> p[1]->b >> p[2]->b >> p[3]->b;
	a *o;
	if (p[0]->b > p[2]->b)
	{
		o = p[0];
		p[0] = p[2];
		p[2] = o;
	}
	cout << p[0]->b << p[2]->b;
}

3.交换值的新思路
// ConsoleApplication3.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

void swap_(int *&a, int *&b)
{
	int *c;
	c = a;
	a = b;
	b = c;
}

int main()
{
	int g = 23;
	int k = 230;
	int *a = &g;
	int *b = &k;
	swap_(a,b);
	cout << *a << " " << *b;
}



4.数组和指针的几个重要的地方

	int a = 12;
	int *p = &a;
	p++;
	*p++;
	*p++;                                                                          *p+1;                                                                                                  *(p+1)

我们在看几个重要的地方:

比如说 *p+1和*(p+1)

5.改变一个数组的原来的值

a.可以用指针;写的时候,形参写指针,实参写地址:可以是指针的内容,也可以是数组(会退化为指针),也可以是取地址;

b.可以用引用;形参是引用,实参是这个变量名;

c.可以用数组;形参是数组,实参是数组的名字;

d.可以用传地址;形参是*&p,实参是地址名。


6.倒序

// ConsoleApplication3.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

void swap_(int a[], int *p)//数组名经过传递,退化为指针
{
	for (; a < p; a++, p--)
	{
		int t=*p;
		*p = *a;
		*a = t;
	}
}

int main()
{
	int a[2] = { 12,23 };
	int *p;
	p = &a[1];
	swap_(a, p);
	int i;
	for (i = 0; i <= 1; i++)
	{
		cout << a[i];
	}
}



总结一下:倒序或者换值的几个常见的思路:

1.可以采用中间值改变法;

2.可以试一试交换地址;

{对于地址的传递我们有如下几种方式:详见上方的总结}

3.可以再新构造一个类似的类型,在全局或者需要应用的地方还生存并具有可见性。

{再说一下,全局都存在的几个东西,第一个是全局变量,第二个是静态变量,第三个是栈区的数据;我们需要注意的是:全局静态变量和局部静态变量有一定的差别,前者和动态的区别是作用域,而后者和动态的差别是生产周期。}


7.我们接着对指针和引用做出一点解释

*&:指针的引用

typedef long typr ,*ptype;

这个语句完成的目的是声明typr是long的别名,ptype是long*的别名;指针的别名的作用大概是传指针时改变指针的地址,然后引用的使用的方法是:和原来的类型使用的方法完全一致;


8.一个对数组的特殊排列(如果有为0的数的话,需要将其放在首位,然后进行从小到大的排列)

// ConsoleApplication3.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;


int  * change(int a[], const int n)
{
	int i, m,q,time=0,k;
	int *b = new int[n];
	for (i = 0; i <= n - 1; i++)
	{
		if (a[i] == 0)
			time++;
	}
	if (time >= 1)
	{
		
		for (i = 0; i <= time - 1; i++)
		{
			*(b + i) = 0;
		}
		m = 0;
		q = 0;
		for (i = 0; i <= time-1 ; i++)
		{
			if (i != time - 1)
			{
				while (a[m] != 0)
				{
					*(b + time + q) = a[m];
					q++;
					m++;
				}
				m++;
			}
			else
			{
				while (a[m] != 0)
				{
					*(b + time + q) = a[m];
					q++;
					m++;
				}
				m++;
				while (q != (n-time))
				{
					*(b + time + q) = a[m];
					q++;
					m++;
				}
				m++;
			}
		}
		for (i = 1; i <= n - time - 1; i++)
		{
			for (k = time; k <= n - 2; k++)
			{
				if (*(b + k) >= *(b + k + 1))
				{
					int t;
					t = *(b + k);
					*(b + k) = *(b + k + 1);
					*(b + k + 1) = t;
				}
			}
		}
	}
	else
	{
		for (i = 0; i <= n - 1; i++)
		{
			*(b + i) = a[i];
		}
		for (i = 1; i <= n ; i++)
		{
			for (k =0; k <= n - 2; k++)
			{
				if (*(b + k) >= *(b + k + 1))
				{
					int t;
					t = *(b + k);
					*(b + k) = *(b + k + 1);
					*(b + k + 1) = t;
				}
			}
		}
	}
	return b;
}

int main()
{
	const int n = 10;
	int array[n];
	int k;
	for (k = 0; k <= n-1; k++)
	{
		cin >> array[k];
	}
	int *c=change(array, n);
	for (k = 0; k <= n-1; k++)
	{
		if (k == 0)
		{
			cout << endl;
		}
		cout << *(c + k) << endl;;
	}
	//cout << *c;
	//cout << *(c+1);
	
}


9.排序,字符串,记得用strcmp

// ConsoleApplication4.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;

int main()
{
	char *p[4];
	const int n = 4;
	int i,k;
	for (i = 0; i <= n - 1; i++)
	{
		p[i] = new char[80];
		cin >> p[i];
	}
	char *q;
	for (i = 0; i <= n - 1; i++)
	{
		for (k = 0; k <= n - 2; k++)
		{
			if (strcmp(p[k],p[k+1])>0)
			{
				q = p[k];
				p[k] = p[k + 1];
				p[k + 1] = q;
			}
		}
	}
	for (i = 0 ; i <= n - 1; i++)
	{
		cout << p[i] << endl;;
	}
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值