王道例题2.4 输出梯形
描述
输入一个高度h,输出一个高度为h,上底边长度为h的梯形。
思路
两次for循环遍历
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
int h;
scanf_s("%d", &h);
int row = 3 * h - 2;
for (int i = 0; i < h; i++)
{
for (int j = 0; j < row; j++)
{
if (j < (2 * h - 2 - 2 * i)) {
printf_s(" ");
}
else
printf_s("*");
}
printf_s("\n");
}
return 0;
}
王道例题2.5 叠筐
描述
把一个个大小差一圈的筐叠上去,使得从上往下看时,边框花色交。(P12)
思路
用二维数组存储字符
用for循环遍历
第一个for循环遍历圈数
需要定位筐的四个角
代码
#include<iostream>
#include<cstdio>
#include<stdio.h>
using namespace std;
int main() {
char mat[80][80]{};
int n;
char a, b;
bool firstCase = true;
scanf_s("%d%c%c", &n, &a, 80, &b, 80);
if (firstCase == true) {
firstCase = false;
}
else
printf_s("\n");
for (int i = 0; i <= n / 2; i++) {
int j = n - i - 1;
int length = n - 2 * i;
char c;
if ((n / 2 - i) % 2 == 0)
c = a;
else c = b;
for (int k = 0; k < length; k++) {
mat[i][i + k] = c;
mat[i + k][i] = c;
mat[j][j - k] = c;
mat[j - k][j] = c;
}
}
if (n != 1) {
mat[0][0] = ' ';
mat[0][n - 1] = ' ';
mat[n - 1][0] = ' ';
mat[n - 1][n - 1] = ' ';
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf_s("%c", mat[i][j]);
}
printf_s("\n");
}
return 0;
}
scanf_s 输入字符串时需要指定长度
错误方式
scanf_s("%d%c%c", &n, &a, &b);
会出现错误
0x00007FFBE1876191 (ucrtbased.dll)处(位于)引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
正确方式
scanf_s("%d%c%c", &n, &a, 80, &b, 80);
KY19 今年的第几天?
描述
输入年、月、日,计算该天是本年的第几天。
思路
要判断是否闰年
用二维数组记录每月天数
代码
#include <stdbool.h>
#include <stdio.h>
int daytab[2][13] = {
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
bool IsLeapYear(int x){
return (x % 4 ==0 && x % 100 != 0)||(x%400==0);
}
int main() {
int year, month, day;
while (scanf("%d %d %d", &year, &month, &day) != EOF) { // 注意 while 处理多个 case
int number = 0;
int row = IsLeapYear(year);
for (int j = 0; j < month; ++j) {
number += daytab[row][j];
}
number+=day;
printf("%d\n", number);
}
return 0;
}
KY222 打印日期
描述
给出年分m和一年中的第n天,算出第n天是几月几号。
代码
#include <stdio.h>
#include <stdbool.h>
int daytab[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
bool IsLeapYear(int x) {
return (x % 4 == 0 && x % 100 != 0) || (x % 400 == 0);
}
int main() {
int year, month = 0, day, number;
while (scanf("%d %d", &year, &number) != EOF) {
int row = IsLeapYear(year);
int i;
int count = 0;
while(number > daytab[row][month]){
number -= daytab[row][month];
month++;
}
day = number;
printf("%04d-%02d-%02d\n",year,month,number);
}
return 0;
}
KY210 排序
描述
对输入的n个数进行排序并输出。
思路
用快速排序
理解快排的思路
代码
#include <stdio.h>
int Partition(int A[], int low, int high);
void QuickSort(int A[], int low, int high) {
if (low < high) {
int pivotpos = Partition(A, low, high);
QuickSort(A, low, pivotpos - 1);
QuickSort(A, pivotpos + 1, high);
}
}
int Partition(int A[], int low, int high) {
int pivot = A[low];
while (low < high) {
while (low < high && A[high] >= pivot) {
--high;
}
A[low] = A[high];
while (low < high && A[low] < pivot) {
++low;
}
A[high] = A[low];
}
A[low] = pivot;
return low;
}
int main() {
int n;
int arr[100] = {0};
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
QuickSort(arr, 0, n - 1);
for (size_t i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
return 0;
}