第8周基础练习

有一说一,这些题目好多题都有现成代码,但代码量可观…
所以,很多相同的功能写一遍之后就直接复制了

1.使用指针输出数组元素(10分)

题目内容:

编写程序,定义大小为20的整型数组,通过指针输入数组元素(9999为结束标志),数据超过20时只接收前20个。通过指针输出数组元素,用空格隔开。

输入:一行中输入若干整数,用空格隔开,9999表示结束。

输出:一行中输出数组元素,用一个空格隔开,末尾无空格。

【注意】本题输入输出不是问题,关键是要用指针操作。除定义数组外,后面的程序中不应出现下标运算。

样例1输入:

1 2 3 4 5 9999

样例1输出:

1 2 3 4 5
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int main()
{
	int a[20];
	int *p=a;
	int cnt = 0;
	for(int i=0; i<20; i++)
	{
		cin>>*(p+i);
		if(*(p+i)==9999)
			break;
		cnt++;
	}//这其实把9999也读进了数组,要求不太严格的情况下可以这么写
	 //下面好多用指针输入的题目都是这样做的
	cout<<*p;
	for(int i=1; i<cnt; i++)
		cout<<" "<<*(p+i);
	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
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int input(int* p);
void output(int *p, int n);
int main()
{
	int a[100];
	int len = input(a);
	output(a,len);
	return 0;
}
int input(int* p)
{
	int cnt=0;
	int num;
	while(cin>>num&&num!=9999)
	{
		*p = num;
		p++;
		cnt++;
	}
	return cnt;
}
void output(int *p, int n)
{
	cout<<*p;
	for(int i=1; i<n; i++)
		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

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
char *mystrcpy(char *s1, char *s2);
int main()
{
	char s1[100];
	char s2[100];
	cin>>s2;
	mystrcpy(s1,s2);
	cout<<s1<<endl;
	return 0;
}
char *mystrcpy(char *s1, char *s2)
{
	char *p = s1;
	char *q = s2;
	while(*p++ = *q++);//先赋值,再右移
}
//这题和下面那道题之前都做过

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
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void reset(char *s);//没按题目要求保留原字符串,可以直接通过strcpy复制一份
int myStrCmp(char str1[], char str2[]);
int main()
{
	char s1[100];
	char s2[100];
	cin>>s1>>s2;
	cout<<myStrCmp(s1,s2)<<endl;
	return 0;
}
void reset(char *s)
{
	while(*s)
	{
		if(*s>='A'&&*s<='Z')
			*s = *s - 'A' + 'a';
		s++;
	}
}
int myStrCmp(char str1[], char str2[])
{
	reset(str1);
	reset(str2);
	char *p = str1;
	char *q = str2;
	while(*p==*q&&*p&&*q)
	{
		p++;
		q++;
	}
	if(*p>*q)
		return 1;
	if(*p<*q)
		return -1;
	return 0;
}

5.通过指针访问结构体变量(10分)

题目内容:

定义结构体PERSON表示一个人的基本信息,成员包含姓名(char),性别(char),年龄(int)。在主函数中定义结构体变量,通过指针输入一个人的信息,通过指针输出这个人的信息。

输入:姓名、性别、年龄,用空格隔开。

输出:姓名、性别、年龄,用空格隔开,末尾无空格。

样例1输入:

Zhang male 20

样例1输出:

Zhang male 20
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
struct person{
	char name[100];
	char sex[6];
	int age;
};
int main()
{
	struct person p, *sp = &p;
	cin>>sp->name;
	cin>>sp->sex;
	cin>>sp->age;
	cout<<sp->name;
	cout<<" "<<sp->sex;
	cout<<" "<<sp->age;
	cout<<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
时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cstring>
using namespace std;
struct person{
	char name[100];
	char sex[6];
	int age;
};
int main()
{
	struct person a[50];
	struct person *p = a;
	do
	{
		cin>>p->name;
		cin>>p->sex;
		cin>>p->age;
	}while(strcmp((p++)->name,"0")!=0);//这里合并写了
	p-=2;				//所以要把p向前移动两位,指向最后一个
	while(p>=a)//刚好逆序输出
	{
		cout<<p->name;
		cout<<" "<<p->sex;
		cout<<" "<<p->age<<endl;
		p--;
	}
	return 0;
}

7.动态申请变量(10分)

题目内容:

编写动态申请三个存放整数的存储单元,输入三个整数,输出它们的和。

输入:三个整数,用空格隔开。

输出:整数

【注意】输入、计算、输出都不是问题,关键是存放整数的空间是用new申请的。

样例1输入:

1 2 3

样例1输出:

6
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int main()
{
	int *a = new int;
	int *b = new int;
	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
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	double *p = new double[n];
	double *q = p;//用来保存首位地址
	while(cin>>*p&&*p!=9999)
	   p++;
	p--;//指向9999前面那一位
	cout<<*p--;//先取出值,再左移
	while(p>=q)
		cout<<" "<<*p--;
	cout<<endl;
	delete []q;
	return 0;
}

9.动态申请结构体数组(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

时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cstring>
using namespace std;
typedef struct person{
	char name[100];
	char sex[6];
	int age;
}PE;//简化名字
int main()
{
	int n;
	cin>>n;
	PE *p = new PE[n];
	PE *q = p;
	do
	{
		cin>>p->name;
		cin>>p->sex;
		cin>>p->age;
	}while(strcmp((p++)->name,"0")!=0);
	p-=2;
	while(p>=q)
	{
		cout<<p->name;
		cout<<" "<<p->sex;
		cout<<" "<<p->age<<endl;
		p--;
	}
	delete []q;
	return 0;
}
//和第六题类似,只不过多了一个动态内存申请

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
时间限制:500ms内存限制:32000kb

#include <iostream>
#include <cstring>
using namespace std;
typedef struct person{
	char name[100];
	char sex[6];
	int age;
}PE;
int main()
{
	int n;
	cin>>n;
	PE *p = new PE[n];
	PE *copy=new PE[n];
	PE *q = p, *r = copy;
	do
	{
		cin>>p->name;
		cin>>p->sex;
		cin>>p->age;
	}while(strcmp((p++)->name,"0")!=0);
	p-=2;
	int cnt = 0;
	while(p>=q)
	{
		*copy = *p;
		p--;
		copy++;
		cnt++;
	}
	for(int i=0; i<cnt; i++)
	{
		cout<<(r+i)->name;
		cout<<" "<<(r+i)->sex;
		cout<<" "<<(r+i)->age<<endl;
	}
	delete []q;
	delete []r;
	return 0;
}
//1.动态内存申请
//2.结构体相互赋值
//中间要保留大量的位置,比较繁琐
//但好在是对之前功能的综合,只要复制过来就行了
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值