本章均被要求以指针的方法处理。
1.输入三个整数,按从小到大的顺序输出。
代码如下:
int x, y, z, t,*a,*b,*c;
printf("请输入x,y,z的值:\n");
scanf("%d %d %d", &x, &y, &z);
a = &x, b = &y, c = &z;
if (x > y) {
t = *a; *a = *b; *b = t;
}
if (x > z) {
t = *a; *a = *c; *c = t;
}
if (y > z) {
t = *b; *b = *c; *c = t;
}
printf("从小到大排序为:\n%d %d %d", x, y, z);
效果:
2. 输入三个字符串,按由小到大的顺序输出
原理和上一题大差不差
代码如下:
char s1 [234], s2 [234], s3 [234], t[234];
printf("排序前:\n");
gets(s1); gets(s2); gets(s3);
if (strcmp(s1, s2)>0) {
strcpy(t, s1);strcpy(s1, s2);strcpy(s2, t);
}
if (strcmp(s1, s3)>0) {
strcpy(t, s1); strcpy(s1, s3); strcpy(s3, t);
}
if (strcmp(s2, s3)>0) {
strcpy(t, s2); strcpy(s2, s3); strcpy(s3, t);
}
printf("排序后:\n");
puts(s1);
puts(s2);
puts(s3);
效果:
3.输入十个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
写三个函数:1、输入十个数;2、进行处理;3、输出十个数
输入函数:
void scanf_(int* a,int n) {
int* p;
for (p = a; p < a + n; p++)
scanf("%d", p);
}
处理函数:
int * deal_int(int* a) {
int* p, * min, * max, t;
max = min = a;
for (p = a + 1; p < a + 10; p++)
{
if (*max < *p) max = p;
else if (*min > *p) min = p;
}
t = a [0]; a [0] = *min; *min = t;
if (max == a) max = min;
t = a [9]; a [9] = *max; *max = t;
return a;
}
输出函数:
void array_print(int* arr,int n) {
for (int i = 0; i < n; i++) {
printf("%4d", arr [i]);
}
}
#include
void array_print(int* arr,int n) {
for (int i = 0; i < n; i++) {
printf("%4d", arr [i]);
}
}
int * deal_int(int* a) {
int* p, * min, * max, t;
max = min = a;
for (p = a + 1; p < a + 10; p++)
{
if (*max < *p) max = p;
else if (*min > *p) min = p;
}
t = a [0]; a [0] = *min; *min = t;
if (max == a) max = min;
t = a [9]; a [9] = *max; *max = t;
return a;
}
void scanf_(int* a,int n) {
int* p;
for (p = a; p < a + n; p++)
scanf("%d", p);
}
int main(){
int str [10];
scanf_(str, 10);
array_print(deal_int(str), 10);
return 0;
}
效果:
4.有n个整数,使前面个数顺序向后移m个位置,最后m个数变成最前面m个数。
写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数
代码如下:
#include
void string_int(int* a, int m, int n) {
int* p, arr_end;
for (m; m > 0; m--) {
arr_end = *(a + n - 1);
for (p = a + n - 1; p > a; p--)
*p = *(p - 1);
*a = arr_end;
}
}
int main(){
int len, i, m, a [234];
printf("Enter the lenth:\n");
scanf("%d", &len);
for (i = 0; i < len; i++)
scanf("%d", &a [i]);
printf("Enter back m:\n");
scanf("%d", &m);
string_int(a, m, len);
for (i = 0; i < len; i++)
printf("%4d", a [i]);
return 0;
}
效果:
5.有n个人围成一个圈,顺序排号。从第一个人开始报数(从1到3报数),凡是报到3的人主动退出圈子,问最后留下的是第几号的那位。
代码如下:
int i, k, m, n, num [245], * p;
printf("Enter a num:\n");
scanf("%d", &n);
p = num;
for (i = 0; i < n; i++)
*(p + i) = i + 1;
i = 0; k = 0; m = 0;
while (m < n - 1) {
if (*(p + i) != 0) k++;
if (k == 3) {
*(p + i) = 0;
k = 0;
m++;
}
i++;
if (i == n) i = 0;
}
while (*p == 0) p++;
printf("%d is left", *p);
效果:
6.写一函数,求一个字符串的长度。在main函数中输入字符串并输出其长度。
简单写了两种思路;
代码如下:
#include
int lenth_1(char* s) {
char* p=s;
while (*p) p++;
return p - s;
}
int lenth_2(char* s) {
int i=0;
while (*s++) i++;
return i;
}
int main(){
char str [245];
gets(str);
printf("len=%d", lenth1(str));
return 0;
}
效果如下:
7.有一字符串,包含n个字符。写一函数,将此字符串中从第m个字符开始的全部字符复制为另一个字符串。
代码如下:
#include
void strcpy_string(char* a, int m) {
char* q, * p;
q = a;
for (p = a + m-1; *p;)
*q++ = *p++;
*q = '\0';
}
int main(){
int m;
char str [234];
gets(str);
printf("Enter m:\n");
scanf("%d",&m);
strcpy_string(str, m);
puts(str);
return 0;
}
效果:
8.输入一行文字,找出其中大写字母,小写字母、空格、数字以及其他字符各有多少。
代码如下:
int letter = 0, Letter = 0, digi = 0, space = 0, other = 0;
char num [20],*p;
printf("input string num:\n");
gets(num);
p = num;
while (*p != '\0') {
if (*p >= 'A' && *p <= 'Z') Letter++;
else if (*p >= 'a' && *p <= 'z') letter++;
else if (*p >= '0' && *p <= '9') digi++;
else if (*p == ' ') space++;
else other++;
p++;
}
printf("大写字母%d个 小写字母%d个 数字%d个 空格%d个 其他字符%d个\n", Letter, letter, digi, space, other);
效果:
9.写一函数,将一个3X3的整型矩阵转置。
代码如下:
#include
void change_int(int* p) {
int i, j, t;
for(i=0;i<3;i++)
for (j = i; j < 3; j++)
{
t = *(p + 3 * i + j);
*(p + 3 * i + j) = *(p + 3 * j + i);
*(p + 3 * j + i) = t;
}
}
//输出二维数组
void double_array_print(int arr[][3], int n, int k) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < k; j++)
printf("%4d", arr[i][j]);
printf("\n");
}
}
int main(){
int i, j, k = 1, a [3][3], * p;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
a [i][j] = k++;
double_array_print(a, 3, 3);
printf("\n");
p = a;
change_int(p);
double_array_print(a, 3, 3);
return 0;
}
效果:
10.在主函数中输入10个等长的字符串。用另一函数对它们进行排序。然后在主函数输出这10个已经排序好了的字符串。
代码如下:
#include
void string_change1(char(*p) [20]) {
int i, j;
char t [245], * k;
k = t;
for(i=0;i<10;i++)
for(j=0;j<10-i-1;j++)
if (strcmp(p [j], p [j + 1])>0) {
strcpy(k,p[j]);
strcpy(p[j],p[j+1]);
strcpy(p [j + 1], k);
}
}
int main(){
char str [10][20], (*p) [20];
int i;
for (i = 0; i < 10; i++)
scanf("%s", str [i]);
p = str;
string_change1(p);
printf("\n");
for (i = 0; i < 10; i++)
puts(p [i]);
return 0;
}
效果:
11.用指针数组处理上一道题目,字符串不等长。
代码如下:
#include
void nihaoa(char* s[]) {
int i, j;
char* t;
for (i = 0; i < 10; i++)
for(j=0;j<10-i-1;j++)
if (strcmp(*(s + j), *(s + j + 1)) > 0) {
t = *(s + j);
*(s + j) = *(s + j + 1);
*(s + j+1)=t;
}
}
int main(){
char* p [10], a [10][20];
int i;
for (i = 0; i < 10; i++)
p [i] = a [i];//将第i个字符串的首地址赋给指针数组p的第i个元素
for (i = 0; i < 10; i++)
scanf("%s", p [i]);
nihaoa(p);
for (i = 0; i < 10; i++)
puts(p [i]);
return 0;
}
效果:
12.将n个数按输入时顺序的逆序排序,用函数实现。
代码如下:
#include
int* sort_convert(int* a, int n) {
int* q, * p, t;
for (p = a, q = a + n - 1; p < a + n / 2; p++, q--)
{
t = *q; *q = *p; *p = t;
}
return a;
}
int main(){
int n, i, a [256];
printf("Enter a len:\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a [i]);
array_print(sort_convert(a, n), n);
return 0;
}
效果:
13.写一函数,实现两个字符串的比较。即自己写一个strcmp函数,函数原型为
int strcmp(char *p1,char *p2);
代码如下:
#include
int _strcmp(char* p1, char* p2) {
int i = 0;
while (*(p1 + i) == *(p2 + i))
if (*(p1 + i++) == '\0') return 0;
return (*(p1 + i) - *(p2 + i));
}
int main(){
char s1 [234], s2 [234];
gets(s1);
gets(s2);
printf("%d", _strcmp(s1, s2));
return 0;
}
效果:
14.编一程序,输入月份号,输出该月的英文名.
例如,输入3,则输出“March”,要求用指针数组处理。
代码如下:
int main(){
char* p [] = { "illeaal","January","February","March","April","May","June","July","August","September","October","September","December" };
int num;
printf("Enter the month:\n");
scanf("%d", &num);
if (num > 0 && num <= 12) {
puts(*(p + num));
}
else printf("Error!");
return 0;
}
效果:
15.(1)编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针(地址),指向字符串开始的空间。new(n)表示分配n个字节的内存空间。
(2)写一函数(free),将前面用new函数占用的空间释放。free(p)表示将p(地址)指向的单元以后的内存段释放。
代码如下:
#define NEWSIZE 1000
char newbuf [NEWSIZE];
char* newp = newbuf;
char* new(int n) {
if (newp + n <= newbuf + NEWSIZE) {
newp += n;
return (newp - n);
}
else return NULL;
}
void free(char* p)
{
if (p >= newbuf && p <= newbuf + NEWSIZE)
newp = p;
}
16.用指向指针的指针的方法对5个字符串排序并输出。
代码如下:
#include
void pointer(char* *arr) {
char* t;
int i, j;
for(i=0;i<5;i++)
for(j=0;j<5-i-1;j++)
if (strcmp(*(arr + j), *(arr + j + 1)) > 0) {
t = *(arr + j);
*(arr + j) = *(arr + j + 1);
*(arr + j + 1) = t;
}
}
int main(){
char** p, * str [20], arr [5][20];
int i;
for (i = 0; i < 5; i++)
str [i] = arr [i];
printf("Enter 5 strings:\n");
for (i = 0; i < 5; i++)
scanf("%s", str [i]);
p = str;
pointer(p);
for (i = 0; i < 5; i++)
puts(p[i]);
return 0;
}
效果:
17.用指向指针的指针的方法对n个整数排序并输出。要求将排序单独写成一个函数。n个整数在主函数中输入,最后在主函数中输出。
代码如下:
#include
void point_sort(int** p, int n) {
int i, j, * t;
for(i=0;i **(p + j + 1)) {
t = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = t;
}
}
int main()[
int i, n, arr [20], ** p, * pstr [20];
printf("Tnput n:\n");
scanf("%d", &n);
for (i = 0; i < n; i++)
pstr [i] = &arr [i];
printf("Enter nums:\n");
for (i = 0; i < n; i++)
scanf("%d", pstr [i]);
p = pstr;
point_sort(p,n);
for (i = 0; i < n; i++)
printf("%4d", *pstr [i]);
return 0;
}
效果:
要考试了,有错误的可以评论或者私信谢谢大家!