练习7-8 方阵循环右移 (20 分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
//这道题有点晕,m==n时相当于不移动
#include <stdio.h>
int main()
{
int n, m, i, j;
scanf("%d %d", &m, &n);
int a[6][6], b[6][6];
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
{
b[i][ (j + m)%n] = a[i][j];
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%d ", b[i][j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int n, m, i, j;
scanf("%d %d", &m, &n);
int a[6][6];
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
scanf("%d", &a[i][j]);
m %= n;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%d ",a[i][(n - m + j) % n]);
}
printf("\n");
}
return 0;
}
练习7-10 查找指定字符 (15 分)
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式:
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式:
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1:
m
programming
输出样例1:
index = 7
输入样例2:
a
1234
输出样例2:
Not Found
//1. c = getchar();getchar();要用第二个getchar把回车吸收 2.c语言对字符串的处理将添加'\0'作为结束标志 3.输出忘加index
#include <stdio.h>
int main()
{
int i, j, n = -1;
char c, d, str[80];
c = getchar();
getchar();
for(i = 0; (d = getchar()) != '\n'; i++)
{
str[i] = d;
}
for(j = 0; str[j] != '\0'; j++)
{
if(c == str[j])
n = j;
}
if(n != -1)
printf("index = %d", n);
else
printf("Not Found");
return 0;
}
习题7-1 选择法排序 (20 分)
本题要求将给定的n个整数从大到小排序后输出。
输入格式:
输入第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。
输出格式:
在一行中输出从大到小有序的数列,相邻数字间有一个空格,行末不得有多余空格。
输入样例:
4
5 1 7 6
输出样例:
7 6 5 1
//1.选择排序:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 2.两个for循环 3.a[max] = a[i]; a[i] = temp;应该放在第二个for循环之外。
#include <stdio.h>//选择排序,一次只排一个
int main()
{
int n, i, j, max, temp;
scanf("%d", &n);
int a[n];
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n; i++)
{
temp = a[i];
max = i;
for(j = i + 1; j < n; j++)
{
if(temp < a[j])
{
max = j;
temp = a[j];
}
}
a[max] = a[i];
a[i] = temp;
}
printf("%d", a[0]);
for(i = 1; i < n; i++)
{
printf(" %d", a[i]);
}
return 0;
}
#include <stdio.h>//冒泡排序:每次排出一个最大的,剩下的也有一个排序
int main()
{
int n, i, j, temp;
scanf("%d", &n);
int a[n];
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
for(i = 0; i < n; i++)//冒泡排序
{
for(j = i + 1; j < n; j++)
{
if(a[i] < a[j])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
printf("%d", a[0]);
for(i = 1; i < n; i++)
{
printf(" %d", a[i]);
}
return 0;
}