C++编程题总结

1、重复打印+换行

	for (int n = 5;n > 0;n--)
	{
		for (int j = 1;j <= n;j++)
		{
			printf("*");
			//if (j == n)
				//printf("\n");//循环结束,自动打印换行,直接放在for循环外面,无需if判断
		}
		printf("\n");
	}

printf和for循环能实现重复打印

printf("\n")实现换行打印

	for (int i = 1;i <= 5;i++)
	{
		for (int j = 1;j <= 5;j++)
		{
			if (j == i || j == 5 - i + 1)
				printf("*");
			else
				printf(" ");
		}
		printf("\n");
	}

是对称,打印对称位置即可(用||进行if条件判断)

空格的打印直接用printf(" "),,另外用printf("\t")也能打印出空格

总结套路:外层for循环行数,内层for循环列数并用  if、或  条件来限定打印

 

2、取出开方数

嵌套for取开方数,第二个for逐一判断

	for (int i = 1;i <= 40;i++)
	{
		int result = i * i;
		if (result > 1000)
			break;
		printf("%d\t", result);
	}

自己写的虽然满足题意,但是不能把开方数打印出来

3、打印9×9乘法表

	for (int i = 1;i <= 9;i++)
	{
		for (int j = 1;j <= i;j++)
			printf("%d×%d=%d ", j, i, i*j);
		printf("\n");
	}

第一个for循环不加大括号的话,虽然第二个printf的格式没问题,但是程序会一直执行完最外层的for循环后才执行printf("\n"),这样就无法达到乘法表的效果

4、倒序

①倒序打印某数

自己方法是分1-9,10-99,100-999,1000-9999,10000这5种情况

优化:对10取余不停获取到末尾数,知道取余结果为0则break(无论几位数,对10取余)

{
	/*倒序打印数字*/
	int n = 0;
	scanf_s("%d", &n);
	while (1)
	{
		int ge = n % 10;
		printf("%d", ge);
		n = n / 10;
		if (n == 0)
			break;
		printf("-");
	}

取位数的方法和保留除掉位数的其余数,这与固定的三位数取个(n%100/10,可直接替换成n%10),十,百位数字的方法不同

 ②反转数组

方法1:数组中线,两边对调,需要定义一个temp临时变量。由于中线,所以for循环只需取数组长度一半即可

void reverse(int* arr, int size)
{
	for (int i = 0; i < size/2; i++)
	{
		int temp = arr[i];
		arr[i] = arr[size - 1 - i];
		arr[size - 1 - i] = temp;
	}
}

 

5、四舍五入(加减0.5)

自己思路:取整后与原数做差再与0.5比较。(对于负数而言这种方法就需要改变符号进行处理,较麻烦)

int round(double x)
{
	if (x >= 0)
	{
		return (int)(x + 0.5);
	}
	else
	{
		return (int)(x - 0.5);
	}
}

大于0加0.5取整,小于0减0.5取整

 

6、用结构体表示一道多项选择题

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

// 选项
struct Option
{
	char answer[100]; // 选项提示文字 
	bool selected;  // 是否选中
};

// 题目
struct Example
{
	char question[100];
	struct Option options[4];
};

int main()
{
	struct Example ex;
	strcpy_s(ex.question, 100, "你喜欢的编程语言?");
	
	// 第1项
	strcpy_s(ex.options[0].answer, 100, "C");
	ex.options[0].selected = true;

	// 第2项
	strcpy_s(ex.options[1].answer, 100, "C++");
	ex.options[1].selected = true;

	// 第3项
	strcpy_s(ex.options[2].answer, 100, "Java");
	ex.options[2].selected = true;

	// 第4项
	strcpy_s(ex.options[3].answer, 100, "Python");
	ex.options[3].selected = false;

	//
	printf("题目: %s \n", ex.question);
	for (int i = 0; i < 4; i++)
	{
		struct Option* po = &ex.options[i];

		// 用一个符号表示是否被选中
		char* mark = "■";
		if (!po->selected)
			mark = "□";

		// 显示这一选项
		printf(" %s %s \n", mark, po->answer);

	}
	getchar();
	return 0;
}

这题将代码复制到vs2017无法通过?

 

7、随机出题,输入答案是够正确

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
	srand(time(NULL));

	// 随机产生
	int left=0, right=0;
	left = rand() % 1000 + 1; // 1 - 1000
	right = rand() % 1000 + 1; // 1 - 1000

	char ops[] = "+-*/";
	int sel = rand() % 4;
	char op = ops[sel];

	printf("请计算: %d %c %d = ", left, op, right);
	
	// 读取用户的输入
	double input = 0;
	scanf("%lf", &input);

	// 正确的值是多少?
	double result = 0;
	switch(op)
	{
	case '+':
		result = left + right;
		break;
	case '-':
		result = left - right;
		break;
	case '*':
		result = left * right;
		break;
	case '/':
		result = (double)left / right;
		break;
	}

	// 检查用户输入的是否正确?
	double delta = result - input;
	if( delta > -0.01 && delta < 0.01)
	{
		printf("输入正确!好样的!\n");
	}
	else
	{
		printf("输入不正确!加油!\n");
	}
	return 0;
}

left right op,自己用的num1,num2,c根本不能表示任何含义,注意命名

计算真实值,无法直接用lef op right时,通过条件判断实现

判断计算结果是否正确,没有考虑小数的情况,这里用相减后的差值去判断,不能直接判断是否相等,要考虑到小数的情况

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值