问题 A: 习题6-4 有序插入
题目描述
有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。
输入
第一行输入以空格分隔的9个整数数,要求按从小到大的顺序输入。
第二行输入一个整数。
输出
从小到大输出这10个数,每个数一行。
样例输入
1 11 21 31 41 51 61 71 81 45
样例输出
1 11 21 31 41 45 51 61 71 81
解题思路
1.输入数组中的前九个数
2.再输入一个整数
3.通过冒泡排序 定义中间变量temp 依次比较第二次输入的整数和前九个数
代码实现
#include <stdio.h>
int main()
{
int a[10];
for(int i = 0; i < 9; i++){
scanf("%d",&a[i]); //输入数组中的前九个数
}
scanf("%d",&a[9]); //再输入一个整数
for(int i = 9; i > 0; i--){
if(a[i]<a[i-1]){
int temp=a[i-1];
a[i-1]=a[i];
a[i]=temp; //通过定义中间变量temp,如果左边的数更大交换a[i-1]和a[i]
}
}
for (int j = 0; j < 10; j++)
{
printf("%d\n", a[j]);
}
return 0;
}
问题 B: 习题6-5 数组元素逆置
题目描述
将一个长度为10的整型数组中的值按逆序重新存放。
如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1
输入
从键盘上输入以空格分隔的10个整数。
输出
按相反的顺序输出这10个数,每个数占一行。
样例输入
1 2 3 4 5 6 7 8 9 0
样例输出
0 9 8 7 6 5 4 3 2 1
解题思路
这个是逆序输出,不用比较大小,直接定义中间变量,然后从右往左排序
代码实现
#include <stdio.h>
int main()
{
int a[10];
for (int i = 0; i < 10; i++){
scanf("%d",&a[i]); //输入10个整数,以空格隔开
}
//定义中间变量逆序输出,注意这里i<5,不是10,如果是10,就变成了从小到大排序
for (int i = 0; i < 5; i++){
int temp = a[i];
a[i] = a[9-i];
a[9-i] = temp;
}
for (int i = 0; i < 10; i++){
printf("%d\n", a[i]);
}
return 0;
}
问题 C: 习题6-6 杨辉三角
题目描述
按要求输入如下格式的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多输出10层
输入
输入只包含一个正整数n,表示将要输出的杨辉三角的层数。
输出
对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开。
样例输入
5
样例输出
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
解题思路
杨辉三角形规则
1.首列和每行最后一个都为1:a[i][j]=1
2.每行的第二个元素都是上一行的前一个和后一个元素之和:
a[i][j]=a[i-1][j]+a[i-1][j-1]
代码实现
#include <stdio.h>
int main()
{
int n,a[10][10]; //定义输出层数 和一个最多为10层的数组
scanf("%d",&n);
for (int i = 0; i < 10; i++)
{
for (int j = 0; j <= i; j++)
{
if(j==0 || j==i){ //首列和每行最后一个都为1
a[i][j]=1;
}
else{ //每行的第二个元素都是上一行的前一个和后一个元素之和
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i ; j++)
printf("%d\n",a[i][j]);
}
return 0;
}
问题 D: 习题6-12 解密
题目描述
有一行电文,已按如下规律译成密码:
A-->Z a-->z
B-->Y b-->y
C-->X c-->x
...... ......
即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求根据密码译回原文,并输出。
输入
输入一行密文。
输出
解密后的原文,单独占一行。
样例输入
ZYX123zyx
样例输出
ABC123abc
解题思路
根据ASCII码表中字母序号的大小关系进行思考,设想:
任何一个字母必处于a和z之间
字母a码值=x+1(1即第一位字母) 97=x+1 x=96
字母z码值=x+26(26即第二十六位字母) 122=x+26 x=96
第i位字母码值=x+i
所求转换后字母码值=x+26-i+1=x+27-i = (x+1)+(x+26)-(x+i)
因此可得 a[i]=‘a’+‘z’-a[i]
同理可得大写也是如此
代码实现
#include<stdio.h>
int main()
{
char str[50];
gets(str);
for(int i = 0; i<50 ; i++)
{
if(str[i] <= 'z' && str[i] >= 'a')
str[i] = 'a' + 'z' - str[i];
if(str[i] <= 'Z' && str[i] >= 'A')
str[i] = 'A' + 'Z' - str[i];
}
puts(str);
return 0;
}
问题 E: 习题6-13 字符串比较
题目描述
比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;若s1=s2,则输出0;若s1<s2,则输出一个负数。
要求:不用strcpy函数;两个字符串用gets函数读入。
例如:"A"与"C"相比,由于"A"<"C",应输出负数,同时由于"A"与"C"的ASCII码差值为2,因此应输出"-2"。
同理:"And"和"Aid"比较,根据第2个字符比较的结果,"n"比"i"大5,因此应该输出"5"
输入
输入2行字符串。
输出
一个整数,表示这两个字符串 比较的差值,单独占一行。
样例输入
And Aid
样例输出
5
解题思路
这个是要输出数值,所以不能用strcmp(),用strlen()
代码实现
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50],str2[50];
gets(str1);
gets(str2);
for (int i = 0; i < strlen(str1); i++)
{//这里用strlen()获得第一个\0前的字符串个数
if (str1[i] != str2[i]) //如果str1和str2不相等
{
printf("%d\n", str1[i]-str2[i] ); //则输出一个正数或者负数
return 0;
}
else{
if (i+1 == strlen(str1)) //如果s1=s2,即字符串大小一样,输出0
printf("0\n");
}
}
}
问题 F: 例题6-1 逆序输出数组元素
题目描述
从键盘上输入10个整数,存储在一个长度为10的整型数组中,要求将输入的10个数逆序输出。
如输入为:0,1,2,3,4,5,6,7,8,9 输出为9,8,7,6,5,4,3,2,1,0
输入
10个整数,以空格分隔
输出
将输入的10个整数逆序输出,每个数占一行。
样例输入
0 1 2 3 4 5 6 7 8 9
样例输出
9 8 7 6 5 4 3 2 1 0
代码实现
#include <stdio.h>
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j < 9-i; j++)
{
if(a[j+1]>a[j])
{
int temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
问题 G: 例题6-2 数组求解Fibonacci数列问题
题目描述
Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
要求输出Fibonacci数列的前20个数。
输入
无
输出
Fibonacci数列的前20个数,每个数占一行。
样例输入
无
样例输出
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
解题思路
1.第一个和第二个都是1 str1[0]=1,str1[1]=1
2.第三个开始,是前两个数之和:str1[i]=str[i-1]+str[i-2](2<=i<20)
代码实现
#include <stdio.h>
int main()
{
int str[20];
str[0]=1,str[1]=1; //第一个和第二个都是1
for (int i = 2; i < 20; i++)
{
str[i]=str[i-1]+str[i-2]; //第三个开始,都是前两个数之和
}
for (int i = 0; i < 20; i++)
{
printf("%d\n", str[i]);
}
return 0;
}
问题 H: 例题6-3 冒泡排序
题目描述
从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。
输入
以空格分隔的10个整数。
输出
依次输出排好序的10个整数,每个数占一行。
样例输入
1 3 5 7 9 2 4 6 8 0
样例输出
0 1 2 3 4 5 6 7 8 9
解题思路
和逆序输出解题思路相同
代码实现
#include <stdio.h>
int main()
{
int a[10];
for (int i = 0; i < 10; i++)
{
scanf("%d",&a[i]);
}
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j < 9-i; j++)
{
if(a[j]>a[j+1]) //和逆序输出的不同
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
问题 I: 例题6-4 矩阵转置
题目描述
将一个2行3列的矩阵(二维数组)行列互换,存储到另一个3行2列的矩阵中。
要求以整型数据为例来解答。
输入
输入2行数据,每行3个整数,以空格分隔。
输出
行列互换后的矩阵,3行,每行2个数据,以空格分隔。
样例输入
1 2 3 4 5 6
样例输出
1 4 2 5 3 6
代码实现
#include <stdio.h>
int main(){
int a[2][3];
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
scanf("%d",&a[i][j]); //输入2个长度为3的数组
}
}
//转化成3个长度为2的数组
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 2; j++)
{
printf("%d ",a[j][i]);
}
}
return 0;
}
问题 J: 例题6-9 字符串求最大值
题目描述
从键盘上输入3个字符串,求出其中最大者。
输入
输入3行,每行均为一个字符串。
输出
一行,输入三个字符串中最大者。
样例输入
England China America
样例输出
England
解题思路
strcpy():将后一个字符串复制给前一个字符串
strcmp():比较字符串大小
代码实现
#include <stdio.h>
#include <string.h>
int main()
{
char str1[50],str2[50],str3[50],smax[50];
gets(str1);
gets(str2);
gets(str3);
strcpy(smax,str1); //先把str1复制给smax,以str1作为比较字符串
if(strcmp(str2,smax)>0)
strcpy(smax,str2); //如果str2比smax大,即str2>str1
if (strcmp(str3,smax)>0)
strcpy(smax,str3); //如果str3比smax大,则最终输出str3
puts(smax);
return 0;
}