1使用指针输出数组元素(10分)
题目内容:
编写程序,定义大小为20的整型数组,通过指针输入数组元素(9999为结束标志),数据超过20时只接收前20个。通过指针输出数组元素,用空格隔开。
输入:一行中输入若干整数,用空格隔开,9999表示结束。
输出:一行中输出数组元素,用一个空格隔开,末尾无空格。
【注意】本题输入输出不是问题,关键是要用指针操作。除定义数组外,后面的程序中不应出现下标运算。
样例1输入:
1 2 3 4 5 9999
样例1输出:
1 2 3 4 5
//使用指针输出数组元素
#include<iostream>
using namespace std;
int main()
{
const int N = 20;
int a[N];
int* p = a;
cin >> *p;
int i = 0;
while (*p != 9999)
{
i++;
if (i == N)
break;
p++;
cin >> *p;
}
if (i > 0)
{
p = a;
cout << *p;
while (p < a + i-1)
{
p++;
cout << " " << *p;
}
cout << endl;
}
return 0;
}
2通过指针输入输出数组元素的函数(10分)
题目内容:
编写两个函数,分别通过指针输入输出数组元素。编写主函数,定义数组,调用函数输入、输出数组元素。输入结束标志位9999,输出数据在一行中用空格隔开,末尾无空格。数据个数不超过100个。函数格式如下:
int input(int *p); //输入,返回输入的元素个数
void print(int *p,int n); //显示数组元素,n为元素个数
输入:一行中输入若干整数,用空格隔开,9999表示结束。
输出:一行中输出数组元素,用一个空格隔开,末尾无空格。
【注意】本题一要用函数,二要用指针,函数中不出现下标运算。主函中数组的定义仍可以用静态数组。
样例1输入:
1 2 3 4 5 9999
样例1输出:
1 2 3 4 5
//通过指针输入输出数组元素的函数
#include<iostream>
using namespace std;
#define N 100
int input(int* p); //输入,返回输入的元素个数
void print(int* p, int n); //显示数组元素,n为元素个数
int main()
{
int a[100];
int num = input(a);
print(a, num);
return 0;
}
int input(int* p)
{
cin >> *p;
int n = 0;
while (*(p + n) != 9999)
{
n++;
cin >> *(p + n);
}
return n;
}
void print(int* p, int n)
{
cout << *p;
int i = 1;
while (i < n)
{
p++;
cout << " " << *p;
i++;
}
cout << endl;
}
3指针实现字符串复制函数(10分)
题目内容:
编写字符串复制的函数,用指针实现。函数格式为:
char * mystrcpy(char *s1,char *s2); //将s2中的内容复制到s1中,返回s1首地址。
编写主函数,输入字符串到s2中,调用函数实现复制,直接输出复制结果。函数调用格式如下:
cout<<mystrcpy(s1,s2)<<endl;
字符串长度不超过100,函数中不出现下标运算,不使用字符串处理库函数,不使用string类。
输入:一个字符串
输出:一个字符串
【注意】本题的输入、输出相同,结果不是问题,关键一是用指针,二是用函数,三是返回指针,四是利用了返回的指针。
样例1输入:
copy
样例1输出:
copy
#include<iostream>
using namespace std;
char* mystrcpy(char* s1, char* s2); //将s2中的内容复制到s1中,返回s1首地址。
int main()
{
char s1[100], s2[100];
cin.getline(s2, 100);
cout << mystrcpy(s1, s2) << endl;
return 0;
}
char* mystrcpy(char* s1, char* s2)
{
char* p = s1;
char* q = s2;
while (*q != 0)
*p++ = *q++;
*p = 0;
return s1;
}
4指针实现字符串比较(10分)
题目内容:
编写函数,用指针实现字符串的比较,不区分大小写,若s1>s2返回1,若s1<s2返回-1,若s1等于s2返回0。函数的格式为:
int mystrcmp(char *s1,char *s2);
在主函数中定义字符数组,输入字符串,调用函数进行比较,在主函数中输出结果。
注意,必须用字符数组和指针,函数中不出现下标运算,不能使用字符串处理库函数,也不能使用string类。字符串的长度不超过200.
输入:两个英文字符串,用空格隔开。
输出:1,0,或-1
【提示】关于不区分大小写,即"ABC"和"abc"被认为是相同的。实现方法是在比较字符时,如果是字母,将它们转为小写或大写(用一个函数实现,但不改变原字符),再比较。
【注意】本题的关键是用函数和指针实现。还有就是不区分大小写。
样例1输入:
abc ABC
样例1输出:
0
//指针实现字符串比较
#include<iostream>
using namespace std;
#define N 100
int mystrcmp(char* s1, char* s2);
void transform(char*);
int main()
{
char* s1, * s2;
s1 = new char[N];
s2 = new char[N];//尝试下这样分配内存空间
cin >> s1;
cin >> s2;//这样输入以空格结束
transform(s1);//和cin.getline() 的输入以换行结束区分
transform(s2);
cout << mystrcmp(s1, s2) << endl;
delete [] s1;
delete [] s2;//记得释放内存
return 0;
}
void transform(char* s)
{
char* p = s;
while (*p != 0)
{
if (*p >= 'a' && *p <= 'z')
*p = *p + 'A' - 'a';
p++;
}
}
int mystrcmp(char* s1, char* s2)
{
char* p = s1, * q = s2;
while (*p && *q && *p == *q)//找到第一个不相等的位置
{
++q;
p++;
}
if (*p > * q)
return 1;
else if (*p < *q)
return -1;
else
return 0;
}
5通过指针访问结构体变量(10分)
题目内容:
定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性别(char),年龄(int)。在主函数中定义结构体变量,通过指针输入一个人的信息,通过指针输出这个人的信息。
输入:姓名、性别、年龄,用空格隔开。
输出:姓名、性别、年龄,用空格隔开,末尾无空格。
样例1输入:
Zhang male 20
样例1输出:
Zhang male 20
//通过指针访问结构体变量
#include<iostream>
using namespace std;
struct STU{
char name[40];
char sex[10];
int age;
};
int main()
{
STU a;
STU* p;
p = &a;
cin >> p->name >> p->sex >> p->age;
cout << p->name << " " << p->sex << " " << p->age << endl;
return 0;
}
6通过指针访问结构体数组(10分)
题目内容:
定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性别(char),年龄(int)。在主函数中定义结构体数组表示一个班级(不超过50人),通过指针若干人的信息,输入三个0时表示结束,通过指针逆序输出这些人的信息。字符串的比较可以使用字符串处理库函数。
输入:若干行,每行是一个人的信息,用空格隔开。最后一行是0 0 0 表示结束。
输出:逆序输出人员信息,每行一人,个人信息各项用一个 空格隔开,末尾无空格。
样例1输入:
zhao male 18
qian female 17
sun male 19
0 0 0
样例1输出:
sun male 19
qian female 17
zhao male 18
//通过指针访问结构体数组
#include<iostream>
#include<cstring>
#define _CRT_SECURE_NO_WARNINGS//高版本VS中strcmp等函数被视为不安全的,会报错加上这句话就行
using namespace std;
struct STU {
char name[40];
char sex[10];
int age;
};
int main()
{
STU a[50];
STU* p;
p = a;
int num=0;//计数用
cin >> p->name >> p->sex >> p->age;
while (strcmp(p->name,"0")!=0 && strcmp(p->sex,"0")!=0 && p->age != 0)//万一有人叫0呢,狗头
{
p++;
cin >> p->name >> p->sex >> p->age;
num++;
}
p = a + num - 1;//末尾
while (p >= a)
{
cout << p->name << " " << p->sex << " " << p->age << endl;
p--;
}
}
7动态申请变量(10分)
题目内容:
编写动态申请三个存放整数的存储单元,输入三个整数,输出它们的和。
输入:三个整数,用空格隔开。
输出:整数
【注意】输入、计算、输出都不是问题,关键是存放整数的空间是用new申请的。
样例1输入:
1 2 3
样例1输出:
6
//动态申请变量
#include<iostream>
using namespace std;
int main()
{
int* a, * b, * c;
a = new int;
b = new int;
c = new int;
cin >> *a >> *b >> *c;
cout << (*a + *b + *c) << endl;
delete[] a, b, c;//释放内存
return 0;
}
8动态申请数组(10分)
题目内容:
编写程序,输入整数n,动态申请能存放n个double型数据的空间(动态数组),输入若干实数,以9999表示结束,实际个数不超过最大个数n,逆序输出数据。
输入:两行,第一行是元素最大个数;第1行是若干实数,用空格隔开,9999表示结束。
输出:逆序输出若干实数,用一个空格隔开,末尾无空格。
【注意】关键是动态和指针,程序中不出现下标运算。注意释放空间。
样例1输入:
20
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 9999
样例1输出:
1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1
//动态申请数组
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
double* p;
p = new double[n];
int num = 0;//计数
cin >> *p;
double* q = p;
while (*q != 9999)
{
num++;
q++;
if (num >= n)
break;
cin >> *q;
}
q = p + num - 1;//q指向动态数组最后一个元素
while (q > p)
{
cout << *q << " ";
q--;
}
cout << *p;
delete[] p;
return 0;
}
动态申请结构体数组(10分)
题目内容:
定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性别(char),年龄(int)。在主函数中输入正整数n,动态申请能存放n个人的基本信息的存储空间,通过指针输入若干人的信息,输入三个0时表示结束,通过指针逆序输出这些人的信息。实际人数不超过n,字符串的比较可以使用字符串处理库函数。
输入:若干行,第1行是最大人数,以后每行是一个人的信息,用空格隔开。最后一行是0 0 0 表示结束。
输出:逆序输出人员信息,每行一人,个人信息各项用一个空格隔开,末尾无空格。
样例1输入:
10
zhao male 18
qian female 17
sun male 19
0 0 0
样例1输出:
sun male 19
qian female 17
zhao male 18
//动态申请结构体数组
#include<iostream>
#include<cstring>
#define _CRT_SECURE_NO_WARNINGS//高版本VS中strcmp等函数被视为不安全的,会报错加上这句话就行
using namespace std;
struct STU {
char name[40];
char sex[10];
int age;
};
int main()
{
int n;
cin >> n;
STU* p;
p = new STU[n];
STU* q = p;
int num = 0;//计数
cin >> q->name >> q->sex >> q->age;
while (strcmp(q->name, "0") != 0 && strcmp(q->sex, "0") != 0 && q->age != 0)//万一有人叫0呢,狗头
{
q++;
num++;
cin >> q->name >> q->sex >> q->age;
}
q = p + num - 1;//q指向末尾
while (q >= p)
{
cout << q->name << " " << q->sex << " " << q->age << endl;
q--;
}
delete[] p;
}
10动态申请结构体数组空间和结构体数组复制(10分)
题目内容:
定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性别(char),年龄(int)。在主函数中输入正整数n,动态申请能存放n个人的基本信息的存储空间,通过指针输入若干人的信息,输入三个0时表示结束,实际人数不超过n。根据实际人数再动态申请一个结构体数组,将输入的数据逆序复制到新的结构体数组中,通过指针输出这些人的信息。字符串的比较可以使用字符串处理库函数。
输入:若干行,第1行是最大人数,以后每行是一个人的信息,用空格隔开。最后一行是0 0 0 表示结束。
输出:逆序输出人员信息,每行一人,个人信息各项用一个空格隔开,末尾无空格。
【注意】关键一是动态申请存储空间,二是指针操作,程序中不出现下标运算;三是真正实现复制。
样例1输入:
10
zhao male 18
qian female 17
sun male 19
0 0 0
样例1输出:
sun male 19
qian female 17
zhao male 18
//动态申请结构体数组空间和结构体数组复制
#include<iostream>
#include<cstring>
#define _CRT_SECURE_NO_WARNINGS//高版本VS中strcmp等函数被视为不安全的,会报错加上这句话就行
using namespace std;
struct STU {
char name[40];
char sex[10];
int age;
};
int main()
{
int n;
cin >> n;
STU* p;
p = new STU[n];
STU* q = p;
int num = 0;//计数
cin >> q->name >> q->sex >> q->age;
while (strcmp(q->name, "0") != 0 && strcmp(q->sex, "0") != 0 && q->age != 0)//万一有人叫0呢,狗头
{
q++;
num++;
cin >> q->name >> q->sex >> q->age;
}
//下面是结构体数组操作
STU* a;
a = new STU[num];
q = p + num - 1;//q指向末尾的数据
for (int i = 0; i < num; i++)
{
a[i] = *q;
q--;
}
//下面输出元素
for (int i = 0; i < num; i++)
cout << a[i].name << " " << a[i].sex << " " << a[i].age << endl;
return 0;
}