咸鱼做题实录1
参考书是《C语言程序设计现代方法第二版》
会穿插PAT的一些题目
因为是初学者所以写的很烂,然后一点一点慢慢进步吧,记录一下成长过程
第八章 数组
1.随机步法
8-9 编写程序,生成一种贯穿10×10字符数组(初始时全为字符’.’)的"随机步法"。程序必须随机地从一个元素"走到"另一个元素,每次都向上、向下、向左或向右移动一个元素位置。已访问过的元素按访问顺序用字母A到Z进行标记。下面是一个输出示例∶
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
int main(void)
{//定义一个10*10的二维数组
char a[N][N];
int row, col;
for (row = 0; row < N; row++) {
for (col = 0; col < N; col++) {
a[row][col] = '.';
}
}
//定义一个字母数组
char letter[26]; char c;
for (int i = 0, c = 'A'; i < 26; i++, c++) {
letter[i] = c;
}
//初始化
a[0][0] = letter[0];
srand((unsigned)time(NULL));
//循环开始
int j = 0, k = 0, n = 1, randint,count=0;
int j1 = 0, k1 = 0,flag;
while (n < 26) {
randint = rand() % 4;//0向上j-1,1向下j+1,2向左k-1,3向右k+1
//不要做出格的事情
if (j < 1 && randint == 0||j>8&&randint==1||k<1&&randint==2||k>8&&randint==3) {
continue;
}
else {
switch (randint)
{
case 0:j1 = j - 1; flag = 0; break;
case 1:j1 = j + 1; flag = 0; break;
case 2:k1 = k - 1; flag = 1; break;
case 3:k1 = k + 1; flag = 1; break;
default:break;
}
if ((a[j1][k1] == '.')&&(flag==0)) {
j = j1;
k1 = k;
a[j][k] = letter[n];
count = 0;
}
else if ((a[j1][k1] == '.')&&(flag == 1))
{
k = k1;
j1 = j;
a[j][k] = letter[n];
count = 0;
}
//连续四次都不是.说明被包围,可以提前结束
else {
count++;
if (count == 4) {
break;
}
continue;
}
n++;
}
}
for (row = 0; row < N; row++) {
for (col = 0; col < N; col++) {
printf("%4c", a[row][col]);
}
printf("\n");
}
system("pause");
return 0;
}
2.整句颠倒
8-14 编写程序颠倒句子中单词的顺序∶
Enter a sentence: you can cage a swallow can‘t you?
Reversal of sentence: you can’t swallow a cage can you?
//别人的
#include<stdio.h>
int main()
{
int i = 0;
char word[80][80];
while (scanf("%s", word[i++]) && (getchar()) != '\n');
while (--i)
{
printf("%s ", word[i]);
}
printf("%s", word[0]);
return 0;
}
// 我的 哈哈哈
#include <stdio.h>
#define Max 80
int main(void)
{ //定义一个超长的字符数组用于存储字符串
char a[80];
int end, k, m;
a[0] = ' ';
int i = 1;
//输入的字符串循环存入字符数组a中 终止符为问号
while ((a[i++] = getchar()) != '?');
end = i-1;
//printf("%c\n", end);
for (k = i -1; k >= 0; k--) {
if (a[k] == ' '&&(k!=0)) {
for (m = k+1; m < end; m++) {
putchar(a[m]);
}
printf(" ");
end = k;
}
else if (a[k] == ' ' && (k == 0)) {
for (m = k+1; m < end; m++) {
putchar(a[m]);
}
}
}
putchar(a[i-1]);
system("pause");
return 0;
}
3.打印幻方
8.17 编写程序打印n×n的幻方(1.2.··,n²的方阵排列,且每行、每列和每条对角线上的和都相等)。由用户指定n的值∶
奇数阶幻方(罗伯法)
-
把1(或最小的数)放在第一行正中;
-
从2开始直到n×n止各数依次按下列规则存放:
按 45°方向行走,如向右上,每一个数存放的行比前一个数的行数减1,列数加1 -
如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最下一行,列数同样加1; -
如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
#include <stdio.h>
#define MAX 100
int main(void)
{
int n;
printf("打印幻方的阶数:");
scanf("%d", &n);
int a[MAX][MAX] = { 0 };
int row, col, x, y, temp ;
while (n) {
//第一步,把1放第一行中间
int a[MAX][MAX] = { 0 };
row = 0;
col = n / 2;
a[row][col] = 1;
temp = 2;
for (; temp <= n*n; temp++) {
//保存row和col的值
x=row ; y=col;
//向右上出发
row--; col++;
if (row < 0) {
row = n - 1;
}
if (col >= n) {
col = 0;
}
if (a[row][col] != 0) {
row = x + 1;
col = y;
}
a[row][col] = temp;
}
for (int i = 0; i<n; i++)
{
for (int j = 0; j<n; j++)
printf("%4d", a[i][j]);
printf("\n");
}
printf("打印幻方的阶数: ");
scanf("%d", &n);
}
system("pause");
return 0;
}