【id:66】【60分】A. 三数论大小(指针)
题目描述
输入三个整数,然后按照从大到小的顺序输出数值。
要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数
输出时,必须使用这三个指针,不能使用存储三个整数的变量
输入
第一行输入t表示有t个测试实例
第二行起,每行输入三个整数
输入t行
输出
每行按照从大到小的顺序输出每个实例
在每行中,每个数据输出后都带有一个空格,即使该行最后一个数据输出后也要再输出一个空格
#include <iostream>
using namespace std;
void swap(int *q1,int *q2)
{
if(*q1<*q2)
{
int temp=*q1;
*q1=*q2;
*q2=temp;
}
}
int main()
{
int num;
cin>>num;
while(num--)
{
int num1,num2,num3;
cin>>num1>>num2>>num3;
if(num1<num2)
{
swap(&num1,&num2);
}
if(num1<num3)
{
swap(&num1,&num3);
}
if(num2<num3)
{
swap(&num2,&num3);
}
cout<<num1<<" "
<<num2<<" "
<<num3<<" "<<endl;
}
}
【id:68】【10分】B. 动态数组(指针与数组)
题目描述
一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求
若要求创建整数数组,计算数组内所有数据的平均值
若要求创建字符数组,找出数组内的最大字母
若要求创建浮点数数组,找出数组的最小值
要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针
提示:使用new关键字
输入
第一行输入t表示有t个测试实例
第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。
第三行输入n个数据
依次输入t个实例
输出
每个根据不同的数组类型输出相应的结果
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
char lei;
cin>>lei;
int len;
cin>>len;
if(lei=='I')
{
int *p=new int [len];
for(int i=0;i<len;i++)
{
cin>>*(p+i);
}
int sum=0;
for(int i=0;i<len;i++)
{
sum+=*(p+i);
}
cout<<sum/len<<endl;
}
if(lei=='C')
{
char *q=new char[len];
for(int i=0;i<len;i++)
{
cin>>*(q+i);
}
char maxx=0;
for(int i=0;i<len;i++)
{
if(*(q+i)>maxx)
{
maxx=*(q+i);
}
}
cout<<maxx<<endl;
}
if(lei=='F')
{
float *a=new float[len];
for(int i=0;i<len;i++)
{
cin>>*(a+i);
}
float minn=100000.0;
for(int i=0;i<len;i++)
{
if(*(a+i)<minn)
{
minn=*(a+i);
}
}
cout<<minn<<endl;
}
}
}
【id:35】【10分】C. 动态矩阵(指针与堆内存分配)
题目描述
未知一个整数矩阵的大小,在程序运行时才会输入矩阵的行数m和列数n
要求使用指针,结合new方法,动态创建一个二维数组,并求出该矩阵的最小值和最大值,可以使用数组下标法。
不能先创建一个超大矩阵,然后只使用矩阵的一部分空间来进行数据访问、
创建的矩阵大小必须和输入的行数m和列数n一样
输入
第一行输入t表示t个测试实例
第二行输入两个数字m和n,表示第一个矩阵的行数和列数
第三行起,连续输入m行,每行n个数字,表示输入第一个矩阵的数值
依次输入t个实例
输出
每行输出一个实例的最小值和最大值
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
int hang,lie;
cin>>hang>>lie;
int * *q =new int*[hang];//动态创建二维数组
for(int i=0;i<lie;i++)
{
q[i]=new int [lie];
}
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie;j++)
{
cin>>*(*(q+i)+j);
}
}
int maxx=-100000;
int minn=100000;
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie;j++)
{
if(q[i][j]>maxx) maxx=q[i][j];
}
}
for(int i=0;i<hang;i++)
{
for(int j=0;j<lie;j++)
{
if(q[i][j]<minn) minn=q[i][j];
}
}
cout<<minn<<" "<<maxx<<endl;
}
}
【id:31】【10分】D. 数字判断(指针为函数参数)
题目描述
输入一个字符串,判断这个字符串是否一个完全整数值的字符串,例如输入"1234",那么表示整数1234,输入"12a3"就表示只是一个字符串,不是一个整数
要求编写函数isNumber,参数是一个字符指针,返回值是整数类型
如果字符串表示一个整数,则计算出这个整数并且返回
如果字符串不是表示一个整数,则返回-1
主函数必须调用isNumber来判断字符串,不能使用任何C++自带或第三方的类似函数
输入
输入t表示有t个测试实例
每行输入一个字符串
依次输入t行
输出
每行输出判断结果
#include <iostream>
#include <string.h>
using namespace std;
int isnumber(char *q,int len)
{
int flag=0;
for(int i=0;i<len;i++)
{
if(*(q+i)<'0'||*(q+i)>'9')
{
flag=1;
}
}
if(flag==0) return 1;
else return 0;
}
int main()
{
int t;
cin>>t;
char s[100];
while(t--)
{
getchar( );//吃掉缓冲值,即回车行
cin>>s;
int len=strlen(s);
if(isnumber(s,len))
{
int sum=0;
for(int i=0;i<len;i++)
{
sum=sum*10+(s[i]-'0');
}
cout<<sum<<endl;
}
else cout<<"-1"<<endl;
}
}
【id:69】【10分】E. 三串合一(指针与字符数组)
题目描述
输入三个字符串,通过指针读取各个字符串的子串(子串是指字符串中连续的一小部分),把它们合并成一个新字符串
要求:
1. 三个字符串的创建和输入可以使用数组,也可以不用
2. 输入后,根据三个字符串的子串的长度,计算出新字符串的长度
3. 使用动态数组的方法创建新的字符串,并且使用指针读取三个字符串的不同部分,并且复制到新字符串中,要求整个过程都不能使用数组下标
4. 使用指针输出新的字符串
输
第一行输入t表示有t个测试实例
连续三行输入三个字符串,每个字符串都包含10个字符
连续三行,每行输入数字a和b,表示每个子串的开始和结束位置。注意字符串的位置是按照一般意义从1开始计算,和编程中的数组位置不同。例如字符串abcdefg,开始位置是3,结束位置是5,那么子串就是cde
依次输入t个实例
输出
每行输出合并后的新字符串
#include <iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
char s1[11],s2[11],s3[11];
cin>>s1;
cin>>s2;
cin>>s3;
int a1,b1,a2,b2,a3,b3;
cin>>a1>>b1;
cin>>a2>>b2;
cin>>a3>>b3;
int len=b1-a1+b2-a2+b3-a3+3;
char *a =new char [len+1];
char *q1=&s1[a1-1];
for(int i=0;i<b1-a1+1;i++)
{
*(a+i)=*(q1+i);
}
char *q2=&s2[a2-1];
for(int i=0;i<b2-a2+1;i++)
{
*(a+i+b1-a1+1)=*(q2+i);
}
char *q3=&s3[a3-1];
for(int i=0;i<b3-a3+1;i++)
{
*(a+i+b1-a1+1+b2-a2+1)=*(q3+i);
}
cout<<a;
cout<<endl;
}
}