初次接触C++,对它没什么概念,只知道是编程工具名称而已!定义动态数组

1.c++入门

2.初始值设定项

3..c++数组资料

4.从标准输入流读取设置数据格式

 

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

#include "stdafx.h"


using namespace std;





int 最大数(int x = 0, int y = 0, int z = 0);/*为什么这样写?什么道理,又不像公共变量或委托声明!*/
/*原来如此,这种形式在C++中叫做原型函数,必须和真正的函数体对应名称、返回类型和形式参数;它必须写在主函数之前,虽说多写这行代码,但有利于把多个函数集中在一起便于查看.如果在原型函数中赋值实参而真正函数体是形参是可以的*/
int _tmain(int argc, _TCHAR* argv[])
{
起始:
	
	printf("初次接触C++,对它没什么概念,只知道是编程工具名称而已!\n"
		"中文命名不仅仅是为了省去注释这么简单理由,更有利于用中国人熟悉的语言,流畅地构思程序设计思路、逻辑、算法,调试时分析时较顺畅发现问题。\n"
		"更能消除障碍,较容易地理解编程、学习编程变得容易,就像在读文章,写文章一样;为什么要给零英文、零基础的学生或有兴趣学习的人人为设置障碍非得要英文不可?"
		"当我为解答问题复制别人代码是第一要做的事就是用中文命名,才清楚作者设计思路和逻辑,更快速发现问题所在,从而顺畅设计和解决问题,常常得益于中文命名;因此,建议中国人学编程用中文命名有百利而无一害。\n\n");
	int 小明 = 5, 小明爸 = 37, 小明妈 = 30, 年 = 0;
	do
	{
		年++;
		小明 ++;
		小明爸++;
		小明妈++;
	}
	while ((小明爸 + 小明妈) - (5 * 小明) > 0);
	printf("5倍是小明%d岁,5倍是他爸爸%d岁,5倍是他妈妈%d岁,过%d年爸爸妈妈年龄之和是小明的5倍\n\n", 小明, 小明爸, 小明妈, 年);

	int 输入数, 位 = 0, 数位, 基 = 1;

	printf("输入任意整数不超过指定 int 范围位数: ");
	scanf_s("%d", &输入数);
	数位 = 输入数;
	do
	{
		位++;
		数位 /= 10;
	} while (数位 > 0);
	printf("输入数为: %d位\n", 位);
	
	int* 位组 = new int[位 - 1];
	int* 位数 = new int[位];
	
	if (位 == 1)位数[位 -1] = 输入数;
	else
	{
		for (int 序 = 0; 位 - 1 != 序; 序++)
		{
			基 *= 10;
			位组[位 - 2 - 序] = 基;
		}
		for (int 序 = 0; 序 != 位 - 1; 序++)
			printf("10的%d幕%d\n", 位 - 1 - 序, 位组[序]);

		基 = 输入数;
		for (int 序 = 0; 序 != 位 - 1; 序++)
		{
			位数[序] = 基 / 位组[序];
			基 %= 位组[序];
			if (基 < 10) 位数[序 + 1] = 基;
		}
	}

	for (int 序 = 0; 序 != 位; 序++)
		printf("%d ", 位数[序]);

	int 数1, 数2, 数3;
	scanf_s("%d%d%d", &数1, &数2, &数3);
	最大数(数1, 数2, 数3);

	scanf_s("%d", &数1);
	goto 起始;

	//return 0;
}


int 最大数(int x, int y, int z)/*还不了解这种是什么写法,类似C#自定义函数?*/
{
	int 大数 = x, 小数 = x, 逆序 = x;

	if (y > 大数) 大数 = y;
	if (z > 大数) 大数 = z;
	printf("最大值为: %d ", 大数);

	if (y < 小数) 小数 = y;
	if (z < 小数) 小数 = z;
	printf("最小值为: %d ", 小数);

	if (y > 逆序) 逆序 = y;
	if (z > 逆序) 逆序 = z;
	大数 = x;
	if (逆序 > y) if (y > 大数) 大数 = y;
	if (逆序 > z) if (z > 大数) 大数 = z;

	printf("逆序: %d ", 逆序 * 100 + 大数 * 10 + 小数);

	printf("正序: %d ", 小数 * 100 + 大数 * 10 + 逆序);

	return 大数;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

上班前突然冒出一个念,那个推算各位数如果遇到0会出错?上班一路上脑中推导运算逻辑,分析主推导循环算法决定没错,只是遇到0时这句将会不断运行到 if (基 < 10) 位数[序 + 1] = 基; 虽说不是原设计意图,原意在循环最后取个位数,因在最后幕=10时动作,分析之上语句执行当遇到0时这句将提前动作,再进一步分析我放心了,虽说如此,程序运行依然正确,虽说提前动作修改后一个数组单元值,但这一修改将在下一循环中被修改而正确,直到循环结束都按照设计思路正确推导运行,结果依然是正确的,如果,不让这句提前动作,只要加个判断就可以了 ,就变成这样 if (位组[序] == 10) 位数[序 + 1] = 基; 现在把以上算法移植到C#中

            Int64 输入数, 位 = 0, 数位, 基 = 1;

            Console.WriteLine("输入任意整数不超过指定 Int64 范围位数: ");
            输入数 = Int64.Parse(Console.ReadLine());
            数位 = 输入数;
            do
            {
                位++;
                数位 /= 10;
            } while (数位 > 0);
            Console.WriteLine("输入数为: {0}位\n", 位);

            Int64[] 位组 = new Int64[位 - 1];
            Int64[] 位数 = new Int64[位];

            if (位 == 1) 位数[位 - 1] = 输入数;
            else
            {
                for (int 序 = 0; 位 - 1 != 序; 序++)
                {
                    基 *= 10;
                    位组[位 - 2 - 序] = 基;
                }
                for (int 序 = 0; 序 != 位 - 1; 序++)
                    Console.WriteLine("10的{0}幕{1}\n", 位 - 1 - 序, 位组[序]);

                基 = 输入数;
                for (int 序 = 0; 序 != 位 - 1; 序++)
                {
                    位数[序] = 基 / 位组[序];
                    基 %= 位组[序];
                    if (位组[序] == 10) 位数[序 + 1] = 基;
                }
            }

            Console.WriteLine(string .Join (" ", 位数));


运行结果修改前后结果一样

 

            Int64 位 = 0, 基;
            List<Int64> 动态位数 = new List<Int64>();
            Console.WriteLine("输入任意整数不超过指定 Int64 范围位数: ");
            基 = Int64.Parse(Console.ReadLine());
            do
            {
                动态位数.Add(基 % 10);
                基 /= 10;
                位++; 
            } while (基 > 0);
            Console.WriteLine("输入数为: {0}位\n", 位);
            动态位数.Reverse();/*输出反转即可。*/
            Console.WriteLine(string.Join(" ", 动态位数));
C++动态:
	int 输入数, 位 = 0;
	cout << "输入任意整数不超过指定 Int 范围位数:" << endl;
	cin >> 输入数; int *动态 = new int[输入数];
	do
	{
		动态[位] = 输入数 % 10;
		输入数 /= 10;
		位++;
	} while (输入数 > 0);
	printf("输入数为: %d位\n", 位);
	for (int 序 = 0; 序 != 位; 序++)
		printf("%d ", 动态[序]);
	printf("\n");
 /*功能完成后觉得还可以优化代码,把幕循环进行优化,分到2个循环中去完成,这样可以省去一个数组和一个循环,这些话对新手初学说,老者德者捻花微笑就好了.*/
	int 输入数, 位 = 0, 数位, 基 = 1;

	printf("输入任意整数不超过指定 int 范围位数: ");
	scanf_s("%d", &输入数);
	数位 = 输入数;
	do
	{
		基 *= 10;/*替换幕运算循环直接计算最大幕*/
		位++;/*为了创建数组及计算位数*/
		数位 /= 10;
	} while (数位 > 0);
	printf("输入数为: %d位\n", 位);

	int* 位数 = new int[位];

	if (位 == 1) 位数[位 - 1] = 输入数;

	数位 = 输入数;
	for (int 序 = 0; 序 != 位 - 1; 序++)
	{
		基 /= 10;
		位数[序] = 数位 / 基;
		数位 %= 基;
		if (基 == 10) 位数[序 + 1] = 数位;
	}
另假定在无法用动态数组情况下,可以建立一个固定数组,位数等于类型最大位,这样就可以在一个循环完成所有动作,用如上动态的DO循环就可以了,这样,数据已经存储在数组中,又有位值可用,那么,无论顺取,逆取都可以得到正确的数据了,虽然说不能用尽数组,但可以进一步减少一个变量和减少一个循环.
就是这样从易到难一步一步完成到完美。



struct 菜单数据{ string 菜名; int 价格; };


	array<菜单数据, 3> snack =
	{
		{ { "清 蒸 鱼 - 10元", 10 }, { "剁椒鱼头 - 10元", 10 }, { "红烧带鱼 - 10元", 10 } }
	};
cout << snack[0].菜名 << snack[0].价格 << endl << snack[1].菜名 << snack[1].价格 << endl << snack[2].菜名 << snack[2].价格;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值