最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的《C程序设计》和《C++程序设计》习题重新做一遍。
编译环境为:操作系统32位Win7,编译工具VC++6.0
第十章:指针(注:本文为该章1-10题解)
10.1)输入三个整数,按由小到大顺序输出
#include
//交换两个数
void swap(int *p1, int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void main()
{
int array[3];
scanf("%d%d%d", &array[0], &array[1], &array[2]);
//交换前
printf("%d %d %d\n", array[0], array[1], array[2]);
//对数组进行排序
int i, j;
for(i = 0; i < 3; i++)
{
for(j = i + 1; j < 3; j++)
{
if(array[i] > array[j])
{
//printf("Before: %d - %d\t", array[i], array[j]);
swap(&array[i], &array[j]);
//printf("After: %d - %d\n", array[i], array[j]);
}
}
}
//交换后
printf("%d %d %d\n", array[0], array[1], array[2]);
}
10.2)输入三个字符串,按由小到大顺序输出
#include
#include
void main()
{
char s[3][100];
gets(s[0]);
gets(s[1]);
gets(s[2]);
//排序
int i, j;
for(i = 0; i < 3; i++)
{
for(j = i + 1; j < 3; j++)
{
char temp[100];
if(strcmp(s[i], s[j]) > 0)
{
strcpy(temp, s[i]);
strcpy(s[i], s[j]);
strcpy(s[j], temp);
}
}
}
//输出
for(i = 0; i < 3; i++)
{
printf("%s\n", s[i]);
}
}
10.3)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换
写三个函数:(一)输入10个数(二)进行处理(三)输出10个数
#include
//输入数组中元素
void InputArray(int* array, int length)
{
int i;
for(i = 0; i < length; i++)
{
scanf("%d", array + i);
}
}
//交换数组元素
void ChangeArray(int *array, int length)
{
int min = array[0], max = array[0], counter;
int *pmin, *pmax;
for(counter = 1; counter < length; counter++)
{
if(array[counter] < min)
{
min = array[counter];
pmin = array + counter;
}
if(array[counter] > max)
{
max = array[counter];
pmax = array + counter;
}
}
//printf("min:%d\n", *pmin);
//printf("max:%d\n", *pmax);
int temp;
//最小的数与第一个数交换
temp = *pmin;
*pmin = array[0];
array[0] = temp;
//最大的数与最后一个数交换
temp = *pmax;
*pmax = array[length - 1];
array[length - 1] = temp;
}
//打印数组中元素
void PrintArray(int* array, int length)
{
int i;
for(i = 0; i < length; i++)
{
printf("%d\t", *(array + i));
}
printf("\n");
}
void main()
{
int array[10];
InputArray(array, 10); //输入数组中元素
ChangeArray(array, 10); //交换数组
PrintArray(array, 10); //打印数组中元素
}
10.4)有n个整数,使前面个数顺序向后移动m个位置。最后m个数变成前面m个数
写一个函数实现以上功能,在主函数输入n个整数和输出调整后的n个数
#include
#define n 10 //数字总数
#define m 3 //平移位数
//将数组整体向右平移m次,移出的元素补到左边
void change(int* array, int length)
{
int i = m, j, temp;
while(i--)
{
temp = *(array + length - 1);
for(j = length - 2; j >= 0 ; j--)
{
array[j + 1] = array[j];
}
array[0] = temp;
}
}
void main()
{
int array[n], counter;
for(counter = 0; counter < n; counter++)
{
scanf("%d", array + counter);
}
//将数组整体向右平移m次,移出的元素补到左边
change(array, n);
for(counter = 0; counter < n; counter++)
{
printf("%d\t", *(array + counter));
}
printf("\n");
}
10.5)有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的人是第几号
#include
#define n 10
void main()
{
int a[n], i, j, k;
for(i = 0; i < 10; i++)
{
*(a + i) = 1;
}
i = n - 1;
j = 0;
while(i--)
{
k = 3;
while(k--)
{
while(true)
{
if(a[j] == 0)
{
j++;
if(j == n)
{
j = 0;
}
continue;
}
else
{
if(k == 0)
{
a[j] = 0;
}
j++;
if(j == n)
{
j = 0;
}
break;
}
}
}
}
for(i = 0; i < n; i++)
{
if(a[i])
{
printf("从0数第%d个人最后留下来了\n", i);
}
}
}
10.6)写一个函数,求一个字符串的长度
#include
int LengthOf(char* s)
{
int counter = 0;
while(*(s + counter++));
return counter - 1;
}
void main()
{
char s[100];
gets(s);
printf("%d\n", LengthOf(s));
}
10.7)有一个字符串,包含n个字符。写一个字符串,将次字符串中从第m个字符开始全部字符赋值成为另一个字符串
#include
void CopyXToY(char *x, char *y, int m)
{
//忽略之前m个元素
int i, j = 0;
for(i = 0; i < m; i++)
{
if(!*(x + i))
{
break;
}
}
//开始复制
while(*(x + i))
{
*(y + j++) = *(x + i++);
}
y[j] = '\0';
}
void main()
{
char a[100] = "abcdefghijklmn";
char b[100] = "";
CopyXToY(a, b, 5);
printf("%s\n", b);
}
10.8)输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少
#include
void CopyXToY(char *x, char *y, int m)
{
//忽略之前m个元素
int i, j = 0;
for(i = 0; i < m; i++)
{
if(!*(x + i))
{
break;
}
}
//开始复制
while(*(x + i))
{
*(y + j++) = *(x + i++);
}
y[j] = '\0';
}
void main()
{
char a[100] = "abcdefghijklmn";
char b[100] = "";
CopyXToY(a, b, 5);
printf("%s\n", b);
}
10.9)写一个函数,将一个3×3矩阵转置
#include
#define height 3
#define width 3
//矩阵转置
void Transposition(int matrix[height][width])
{
int i, j, temp;
for(i = 0; i < height; i++)
{
for(j = 0; j < i; j++)
{
temp = *(*(matrix + i) + j);
*(*(matrix + i) + j) = *(*(matrix + j) + i);
*(*(matrix + j) + i) = temp;
}
}
}
void main()
{
//建立矩阵
int a[height][width] =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
int i, j;
//打印矩阵
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
printf("%d\t", *(*(a + i) + j));
}
printf("\n");
}
//转置矩阵
Transposition(a);
//打印矩阵
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
printf("%d\t", *(*(a + i) + j));
}
printf("\n");
}
}
10.10)将一个5X5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一个函数实现
#include
#define height 5
#define width 5
//矩阵转置
void OperateMatrix(int matrix[height][width])
{
int i, j, x, y, temp;
//寻找最大值
int max = matrix[0][0];
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
if(max < *(*(matrix + i) + j))
{
max = *(*(matrix + i) + j);
x = i;
y = j;
}
}
}
//最大值与中心相换
temp = matrix[2][2];
matrix[2][2] = matrix[x][y];
matrix[x][y] = temp;
//寻找最小值
int min = matrix[0][0];
x = 0;
y = 0;
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
if(min > *(*(matrix + i) + j))
{
min = *(*(matrix + i) + j);
x = i;
y = j;
}
}
}
//最小值与左上相换
temp = matrix[0][0];
matrix[0][0] = matrix[x][y];
matrix[x][y] = temp;
//寻找第二小的值
min = matrix[0][1];
x = 0;
y = 1;
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
if(i == 0 && j == 0)
{
continue;
}
if(min > *(*(matrix + i) + j))
{
min = *(*(matrix + i) + j);
x = i;
y = j;
}
}
}
//第二小值与右上相换
temp = matrix[0][4];
matrix[0][4] = matrix[x][y];
matrix[x][y] = temp;
//寻找第三小的值
min = matrix[0][1];
x = 0;
y = 1;
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
if(i == 0 && j == 0)
{
continue;
}
if(i == 0 && j == 4)
{
continue;
}
if(min > *(*(matrix + i) + j))
{
min = *(*(matrix + i) + j);
x = i;
y = j;
}
}
}
//第三小值与右上相换
temp = matrix[4][0];
matrix[4][0] = matrix[x][y];
matrix[x][y] = temp;
//寻找第四小的值
min = matrix[0][1];
x = 0;
y = 1;
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
if(i == 0 && j == 0)
{
continue;
}
if(i == 0 && j == 4)
{
continue;
}
if(i == 4 && j == 0)
{
continue;
}
if(min > *(*(matrix + i) + j))
{
min = *(*(matrix + i) + j);
x = i;
y = j;
}
}
}
//第四小值与右上相换
temp = matrix[4][4];
matrix[4][4] = matrix[x][y];
matrix[x][y] = temp;
}
void main()
{
int a[5][5] =
{
{ 1, 2, 3, 4, 5 },
{ 2, 3, 4, 5, 6 },
{ 3, 4, 5, 6, 7 },
{ 4, 5, 6, 7, 8 },
{ 5, 6, 7, 8, 9 }
};
int i, j;
//打印矩阵
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
printf("%d\t", *(*(a + i) + j));
}
printf("\n");
}
printf("============\n");
//转置矩阵
OperateMatrix(a);
//打印矩阵
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
printf("%d\t", *(*(a + i) + j));
}
printf("\n");
}
}
END