前言:学校cg作业——行指针和列指针。第一题第二题个人认为有误。第3题在我上篇博客中点这里
这里是目录
1.使用指针法编程找出二维数组中最大的数
【问题描述】
现有如下的二维数组,请找出其中最大的数。
要求:
1、不在子函数中输出。
2、使用指定子函数,不得修改。
int GetMax(int *p,int m,int n)
【输入形式】
主函数中循环输入2行3列元素:
【输出形式】
输出最大值
【样例输入】
1 2 9
4 9 8
【样例输出】max=9
【样例说明】
注意:主函数中函数调用要考虑传实参是行地址。
题目本身很简单,但是题目要求使用行指针,这就需要对行指针有一定的了解
但是我个人认为,题目给的传参接收函数int* p并不能实现题目要求,二维指针的传参应该用函数指针来接收,下面展示的代码仅是为了完成题目要求而写
#include<stdio.h>
int GetMax(int* p, int m, int n)//p是行指针
{
int i = 0,j = 0;
int max = 0;
for (i = 0; i < m; i++)
{
p = p + i * n;
for (j = 0; j < n; j++)
{
if (*(p+j) > max)
max = *(p + j);
}
}
return max;
}
int main()
{
int i = 0, j = 0;
int arr[2][3] = { 0 };
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
scanf("%d", &arr[i][j]);
}
}
int* p = &arr[0][0];
printf("max=%d", GetMax(p, 2, 3));
return 0;
}
2.使用指针法编程找出其中最小的数,并输出对应的行号和列号(如果最小值有多个,输出最后一次出现最小值的行数和列数)
【问题描述】
现有两行三列的二维数组,数据是从键盘输入。请使用指针法找出其中最小的数,并输出对应的行号和列号(如果最小值有多个,输出最后一次出现最小值的行数和列数)。
要求:
1、不在子函数中输出。
2、使用指定子函数,不得修改。
void GetMin(int *p,int m,int n,int *b)//p是行地址,m是行,n是列,b存储最小值、行和列的结果
【输入形式】
主函数中循环输入2行3列数组元素。
【输出形式】
输出最后一次最小值及所在行号和列号
【样例输入】
7 6 4
4 3 3
【样例输出】
min=3,2,3
与上题一样,我认为题目给的接收参数并不严谨,展示代码仅为完成题目而写。
#include<stdio.h>
void GetMin(int* p, int m, int n, int* b)
{
int i = 0,j = 0;
int min = 100;
for (i = 0; i < 2; i++)
{
p += i * n;
for (j = 0; j < 3; j++)
if ( p[j] <= min)
{
min = p[j];
b[0] = p[j];
b[1] = i + 1;
b[2] = j + 1;
}
}
}
int main()
{
int i = 0, j = 0;
int b[3] = { 0 };
int arr[2][3] = { 0 };
for (i = 0; i < 2; i++)
for (j = 0; j < 3; j++)
scanf("%d", &arr[i][j]);
int* p = &arr[0][0];
GetMin(p, 2, 3, b);
printf("min=%d,%d,%d", b[0], b[1], b[2]);
return 0;
}
3.编写一个函数,利用指针将输入的两个字符串s1和s2连接起来,要求短的在前。
这题实际上就是让你模拟实现字符串函数strcat,不过稍有不同的是,短的字符串放在前面,做的时候可要看清题目。
编写一个函数,利用指针将输入的两个字符串s1和s2连接起来,要求短的在前。
要求:
1、使用子函数 char *StrCat(char *s,char *t)
2、不能使用字符串函数strcat
【输入形式】
从键盘输入两字符串,输入一个字符串后回车,再输入 另外一个。
【输出形式】
输出连接后的字符串
【样例输入】
示例1:
abcde
kobe
示例2:
123
456
【样例输出】
示例1:
kobeabcde
示例2:
123456
#include<stdio.h>
#include<string.h>
#define N 100
char* StrCat(char* s, char* t)
{
if (strlen(s) > strlen(t))
{
char* p = t; //存储t的首元素地址,作为函数的返回值,下同
while (*t != '\0') //走完t字符串
t++;
while (*t++ = *s++) //将s赋给t,当赋值完'\0'后,循环结束
;
return p;
}
else
{
char* p = s;
while (*s != '\0')
s++;
while (*s++ = *t++)
;
return p;
}
}
int main()
{
char st1[N] = { 0 };
char st2[N] = { 0 };
gets(st1);
gets(st2);
puts(StrCat(st1, st2));
return 0;
}
4.编写一个函数,利用指针在字符串s中的指定字符前插入标记字符。指定字符和标记字符均从键盘输入
数组的增删查改是很麻烦的,这里有两种思路,一是在原函数上作修改,很麻烦;二是创建一个新的数组用来存值,非常简便。下面展示的代码就是第二种。
编写一个函数,利用指针在字符串s中的指定字符前插入标记字符。指定字符和标记字符均从键盘输入。
要求:子函数 char *InsertStr(char *s,char t,char c)
【输入形式】
输入主串s,输入指定字符t,输入标记字符c。
【输出形式】
输出插入后字符串
【样例输入】
abcabcde
b
【样例输出】
a#bca#bcde
#include<stdio.h>
#include<string.h>
#define N 100
char* InsertStr(char* s, char t, char c)
{
int i = 0;
char arr[N] = { 0 };
char* tmp = s;
while (*tmp != '\0')
{
if (*tmp != t)
{
arr[i++] = *tmp;
}
else
{
arr[i++] = c;
arr[i++] = *tmp;
}
tmp++;
}
strcpy(s, arr); //不返回arr是因为arr是个局部变量,且不将arr设为全局变量是
//因为此题是程序片段编程题,题目要求只能在函数中修改。
return s;
}
int main()
{
char st[N] = { 0 };
char t = 0, c = 0;
gets(st);
scanf(" %c", &t);
scanf(" %c", &c);
puts(InsertStr(st, t, c));
return 0;
}
文末BB:对哪里有问题的朋友,可以在评论区留言,若哪里写的有问题,也欢迎朋友们在评论区指出,博主看到后会第一时间确定修改。最后,制作不易,如果对朋友们有帮助的话,希望能给点点赞和关注. 本篇文章个人感觉写的不太好。