最近要复习一下C和C++的基础知识,于是计划把之前学过的谭浩强的《C程序设计》和《C++程序设计》习题重新做一遍。
编译环境为:操作系统32位Win7,编译工具VC++6.0
第十章:指针(注:本文为该章11-21题解)
10.11)在主函数中输入10个等长字符串,用一个函数对它们进行排序。在主函数中输出这10个字符串。
#include<stdio.h>
#include<string.h>
void Sort(char s[10][100])
{
int i, j;
for(i = 0; i < 10; i++)
{
for(j = i + 1; j < 10; j++)
{
char temp[100];
if(strcmp(s[i], s[j]) > 0)
{
printf("%s > %s: swap them!\n", s[i], s[j]);
strcpy(temp, s[i]);
strcpy(s[i], s[j]);
strcpy(s[j], temp);
}
}
}
}
void main()
{
int i, j;
//输入数组
char s[10][100];
for(i = 0; i < 10; i++)
{
scanf("%s", s[i]);
}
Sort(s);
//输出排序后的数组
for(i = 0; i < 10; i++)
{
printf("%s\n", s[i]);
}
}
10.12)用指针数组处理上一题目
VC中不支持这样的声明
char* s; scanf("%s", s);
10.13)分段计算定积分
#include<stdio.h>
#include<math.h>
#define left 0
#define right 1
void main()
{
double fx = 0, gx = 0, hx = 0;
double counter;
for(counter = left; counter < right; counter += 0.00001)
{
fx += (sin(counter) + sin(counter)) / 2.0 * 0.00001;
gx += (cos(counter) + cos(counter)) / 2.0 * 0.00001;
hx += (exp(counter) + exp(counter)) / 2.0 * 0.00001;
}
printf("∫(0→1)sin(x)dx result=%lf\n", fx);
printf("∫(0→1)cos(x)dx result=%lf\n", gx);
printf("∫(0→1)exp(x)dx result=%lf\n", hx);
}
10.14)将n个数按输入时的逆序排列,用函数实现
#include<stdio.h>
void ReverseInput(int* array)
{
int counter = 10;
while(counter--)
{
scanf("%d", array + counter);
}
}
void main()
{
int a[10];
ReverseInput(a);
int i = 0;
for(i = 0; i < 10; i++)
{
printf("%d\t", a[i]);
}
printf("\n");
}
10.15)一个班有4个学生,每个学生都要修5门课,用函数实现:
①:求第一门课程的平均分
②:找出2门以上课程成绩不及格的学生,输出他们的学号和分数
③:找出平均成绩在90以上或全部课程成绩在85以上的学生
#include<stdio.h>
#define STUDTCOUNT 4
#define CROUSCOUNT 5
//函数:求第一门课平均分
void AverageOfCourse1(int matrix[STUDTCOUNT][CROUSCOUNT])
{
int i, average = 0;
for(i = 0; i < STUDTCOUNT; i++)
{
average += matrix[i][0];
}
average /= STUDTCOUNT;
printf("第一门课平均分:%d\n", average);
}
//找到不及格科目数超过2科者并打印成绩
void Find2PlusFailed(int matrix[STUDTCOUNT][CROUSCOUNT])
{
int i, j, k;
for(i = 0; i < STUDTCOUNT; i++)
{
k = 0;
for(j = 0; j < CROUSCOUNT; j++)
{
if(matrix[i][j] < 60)
{
k++;
}
if(k > 2)
{
break;
}
}
if(k > 2)
{
printf("学生:%d挂掉科目2门以上,成绩如下:\n", i);
for(j = 0; j < CROUSCOUNT; j++)
{
printf("%d\t", matrix[i][j]);
}
printf("\n");
}
}
}
//找出平均成绩在90分以上或所有成绩在85分以上的学生
void FindAvrgBT90orAllBT85(int matrix[STUDTCOUNT][CROUSCOUNT])
{
int i, j, k, average;
for(i = 0; i < STUDTCOUNT; i++)
{
k = 1;
average = 0;
for(j = 0; j < CROUSCOUNT; j++)
{
if(matrix[i][j] < 85)
{
k = 0;
break;
}
average += matrix[i][j];
}
average /= STUDTCOUNT;
if(k == 1 || average >= 90)
{
printf("学生%d被选中\n", i);
}
}
}
void main()
{
int matrix[STUDTCOUNT][CROUSCOUNT] =
{
{ 40, 40, 40, 40, 40 },
{ 80, 80, 80, 80, 80 },
{ 90, 90, 90, 90, 90 },
{ 95, 95, 95, 95, 95 }
};
void (*p)(int matrix[STUDTCOUNT][CROUSCOUNT]);
//指向函数的指针
p = AverageOfCourse1;
(*p)(matrix);
p = Find2PlusFailed;
(*p)(matrix);
p = FindAvrgBT90orAllBT85;
(*p)(matrix);
}
10.16)输入一个字符串,内有数字和非数字字符,将其中的连续数字作为一个整数,依次存放到一个新的数组中。统计共有多少整数,并输出这些数
#include<stdio.h>
void main()
{
char s[100];
char num[10][10];
//测试数据: a123x456 17960? 302tab5876
gets(s);
int i = 0, j = 0, k = 0;
while(s[i] != '\0')
{
k = 0;
//发现数字则将数字整体放到数组
while(s[i] >= '0' && s[i] <= '9')
{
num[j][k] = s[i];
i++;
k++;
}
if(k != 0) //刚刚发现完数字的情况
{
num[j][k] = '\0';
j++;
continue;
}
else //发现的字符不是数字的情况
{
i++;
}
}
//输出全部数字
printf("共有数字%d个\n", j);
for(i = 0; i < j; i++)
{
printf("%s\n", num[i]);
}
}
10.17)写一个函数,实现两个字符串比较(即自己实现一个strcmp函数)
#include<stdio.h>
int strcmp(char* p1, char* p2)
{
int i = 0;
while(true)
{
if(p1[i] == '\0' && p2[i] == '\0')
{
return 0;
}
if(p1[i] == p2[i])
{
i++;
continue;
}
return p1[i] - p2[i];
}
}
void main()
{
printf("%d\n", strcmp("1234", "5678"));
printf("%d\n", strcmp("1111", "1111"));
printf("%d\n", strcmp("1111", "11112"));
printf("%d\n", strcmp("11112", "1111"));
}
10.18)输入月份号,输出该月的英文名
#include<stdio.h>
void main()
{
char* s[12] =
{
"Janurary", "Febrary", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"
};
int input;
scanf("%d", &input);
printf("%s\n", s[input - 1]);
}
10.20)用指向指针的指针的方法对5个字符串排序并输出
#include<stdio.h>
#include<string.h>
void main()
{
//测试数据: 5687 4567 3465 2345 1234
char s[5][100];
scanf("%s", s[0]);
scanf("%s", s[1]);
scanf("%s", s[2]);
scanf("%s", s[3]);
scanf("%s", s[4]);
//不能写成 char* s[5] = { "5678", "4567", "3456", "2345", "1234" };
//从小到大排序
int i, j, k, l;
char temp[100];
for(i = 0; i < 5; i++)
{
for(j = i + 1; j < 5; j++)
{
k = 0; //遍历用数
l = 0; //s[i]<s[j]时l<0 s[i]=s[j]时l=0 s[i]>s[j]时l>0
while(true)
{
if(*(*(s + i) + k) == '\0' && *(*(s + j) + k) == '\0')
{
break;
}
else if(*(*(s + i) + k) == *(*(s + j) + k))
{
k++;
continue;
}
else
{
l = *(*(s + i) + k) - *(*(s + j) + k);
break;
}
}
//第一个字符串大于第二个字符串则调换位置
if(l > 0)
{
strcpy(temp, s[i]);
strcpy(s[i], s[j]);
strcpy(s[j], temp);
}
}
}
for(i = 0; i < 5; i++)
{
printf("%s\n", s[i]);
}
}
10.21)用指向指针的指针的方法对n个字符串排序并输出
#include<stdio.h>
#define n 5
void Sort(int* array[n])
{
int temp;
int i = 5, j = 5;
int **tempi = array;
int **tempj = array;
for(i = 0, tempi = array; i < n; i++, tempi++)
{
for(j = i + 1, tempj = tempi + 1; j < n; j++, tempj++)
{
if(**tempi > **tempj)
{
temp = **tempi;
**tempi = **tempj;
**tempj = temp;
}
}
}
}
void main()
{
int a[n] = { 5, 4, 3, 2, 1 };
int *x[n] = { &a[0], &a[1], &a[2], &a[3], &a[4] };
Sort(x);
int i;
for(i = 0; i < n; i++)
{
printf("%d\t", *(a + i));
}
printf("\n");
}
END