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时,通过条件判断实现
判断计算结果是否正确,没有考虑小数的情况,这里用相减后的差值去判断,不能直接判断是否相等,要考虑到小数的情况