第5周中级练习

1.比较字符串(不区分大小写)(10分)

题目内容:

编写函数,比较两个字符串str1,str2的大小(不区分大小写),前者大返回1后者大返回-1,相等返回0。

编写主函数,输入两个字符串,调用函数比较,输出返回值。字符串长度超过100。

输入格式:

一行,两个字符串用空格隔开。

输出格式:

1,-1,0三个整数之一。

输入样例:

four for

输出样例:

1

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

#include <iostream>
using namespace std;
void reset(char *s);//将字符串变成小写
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)//找到了大的字符返回1
		return 1;
	if(*p<*q)//找到了小的字符返回-1
		return -1;
	return 0;//剩下的就是字符串相等返回0
}
//字符串的大小是说:按照ASCII码的大小,对字符依次进行比较,与长短没关系

2.二分法解方程(10分)

题目内容:

编写函数,用二分法求方程2x3−4x2+3x−6=0在[-10,10]之间的根。|f(x)|<eps时停止迭代。

二分法:对于区间[a,b]上连续 且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点的距离逐步逼近零点,进而得到零点近似值的方法。

编写主函数,输入区间个精度,调用函数求根,显示返回值。数据类型double。

输入格式:

一行,三个实数,前两个是区间的左右端点,第三个是精度。

输出格式:

一个实数,表示近似根。

输入样例:

-10 10 0.00001

输出样例:

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

#include <iostream>
#include <cmath>
using namespace std;
double f(double x);//待求零点的函数
double zeroPoint(double left, double right, double esp);
int main()
{
	double left, right, esp;
	cin>>left>>right;
	cin>>esp;
	cout<<zeroPoint(left, right, esp)<<endl;
	return 0;
}
double f(double x)
{
	return 2*x*x*x-4*x*x+3*x-6;
}
double zeroPoint(double left, double right, double esp)
{
	double midX;//区间中点的下标
	double mid;//区间中点函数值
	do
	{
		midX = (left+right)/2;
		mid  = f(midX);
		if(mid==0)//找到了零点,就跳出循环
			break;
		if(mid*f(left)<0)//零点在左边
			right = midX;
		else			//零点在右边
			left = midX;
	}while(abs(mid)>=esp);//当中间值小于精度时结束循环
	return midX;//返回下标
}

3.牛顿法解方程(10分)

题目内容:

编写函数,用牛顿法求方程f(x)=x³+2x²+3x+4=0在x0附近的根。要求|f(x)|<eps时停止。数据类型用double。

k=1,2,3,…

编写主函数,输入初始根和精度,调用函数求根,输出返回值。数据类型double。不能使用数学库函数。

输入:输入初始根x0和精度eps。
输出:输出一个实数。

【输入输出样例】

输入:

1 0.0001

输出:

-1.65064

技巧提示:f(x),导数,求绝对值,均定义为函数。

`在这里插入代码片时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
double abs(double x);//绝对值函数
double f(double x);//原函数
double df(double x);//导数
double zeroPoint(double x0, double esp);
int main()
{
	double x0, esp;
	cin>>x0>>esp;
	cout<<zeroPoint(x0,esp)<<endl;
	return 0;
}
double abs(double x)
{
	return (x>0?x:-x);
}
double f(double x)
{
	return x*x*x+2*x*x+3*x+4;
}
double df(double x)
{
	return 3*x*x+4*x+3;
}
double zeroPoint(double x0, double esp)
{
	double r = x0 - f(x0)/df(x0);//r表示切线与x轴交点横坐标
	while(abs(f(r))>=esp)
	{
		r = r-f(r)/df(r);//用在(r,f(r))处的切线进行逼近
	}					//这个切线与x轴交点横坐标赋值给r,就可以实现
	return r;
}
//牛顿法:用切线与x轴交点逼近零点,切线的选取是一个迭代的过程,画图更为直观

4.输入、排序、查找(10分)

题目内容:

分别编写函数输入数组元素(输入-9999表示结束)、从小到大排序数组元素、用二分法在有序数组中查找(返回下标)。

编写主函数,调用函数进行输入、排序和查找。数组元素不超过100个,均为整数。

输入格式:

两行,第1行为输入的数组元素,以-9999结束;第2行输入5个待查找的元素。数据用空格隔开。

输出格式:

5行,每行是查找到的元素的下标,找不到时结果为-1。

输入样例:

2 1 3 4 5 -9999

2 3 4 -10 10

输出样例:

1

2

3

-1

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

#include <iostream>
using namespace std;
int input(int a[]);//输入
void sort(int a[], int left, int right);//快排
int binarySearch(int a[], int left, int right, int dest);//二分查找
int main()
{
	int a[100], b[5];
	int len = input(a);
	sort(a,0,len-1);
	for(int i=0; i<5; i++)
	{
		cin>>b[i];
		cout<<binarySearch(a,0,len,b[i])<<endl;
	}
	return 0;
}
int input(int a[])
{
	int num, i=0;
	while(cin>>num&&num!=-9999)
		a[i++] = num;
	return i;
}
void sort(int a[], int left, int right)
{
	int i = left, j = right;
	int pivot = a[(left+right)/2];
	while(i<=j)
	{
		while(a[i]<pivot)   i++;
		while(a[j]>pivot)   j--;
		if(i<=j)
		{
			int temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			i++;
			j--;
		}
	if(left<j)  sort(a, left, j);
	if(right>i) sort(a, i, right);
	}
}
int binarySearch(int a[], int left, int right, int dest)
{
	int mid;
	while(left<=right)
	{
		mid = (left+right)/2;
		if(dest>a[mid])
			left =  mid+1;
		if(dest<a[mid])
			right = mid-1;
		if(dest==a[mid])
			return mid;
	}
	return -1;
}
//把之前写过的输入,排序,查找函数写过来就行

5.单词排序(10分)

题目内容:

编写程序,对输入的若干单词按词典排序,不区分大小写。要求字符串的比较、复制、大小写转换、排序等工作均用函数实现。

在主函数中输入单词,调用函数排序,在主函数中输出结果。字符串个数不超过100个,每个单词的长度不超过20。

不能使用系统的字符串处理库函数,不能使用标准模板库的类和函数。

输入格式:

两行:第1行为单词个数n,第2行为n个单词,用空格隔开。

输出格式:

n行,每行一个单词。

输入样例:

5

sin cos log exp sqrt
输出样例:

cos
exp
log
sin
sqrt
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void strcpy(char s[], char dest[]);//实现字符串的复制
void swap(char str1[], char str2[]);//实现字符串的交换
bool isFront(char s1[], char s2[]);//字符串大小判断
void sort(char s[][20], int left, int right);//字符串快排
int main()
{
	char s[100][20];
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>s[i];
	sort(s,0,n-1);
	for(int i=0; i<n; i++)
		cout<<s[i]<<endl;
	return 0;
}
void strcpy(char s[], char dest[])//这是模拟系统库里的函数,用指针遍历赋值即可
{
	char *p = s;
	char *q = dest;
	while(*q++=*p++);
}
void swap(char str1[], char str2[])
{
	char t[20];
	strcpy(str1,t);//调用字符串复制函数进行交换
	strcpy(str2,str1);
	strcpy(t,str2);
}
bool isFront(char s1[], char s2[])//判断s1在字典中是不是在s2前面
{								//是的话返回true
	bool sign;					//这个函数相当于>号,而不是>=
	char *p = s1;
	char *q = s2;
	char c1, c2;
	while(*p&&*q)
	{
		c1 = *p;
		c2 = *q;			//用其他值来实现大小写转换,防止对原字符串修改
		if(*p>='A'&&*p<='Z') c1=*p-'A'+'a';
		if(*q>='A'&&*q<='Z') c2=*q-'A'+'a';
		if(c1>c2)
			return false;
		if(c1<c2)
			return true;
		p++;
		q++;
	}
	if(*p)  return false;//如果*p比*q长,返回false
	if(*q)  return true;//反之,返回true
						//值得注意的是:在字典中,前缀排在前面
}
void sort(char s[][20], int left, int right)//和快排思路一样
{											//只是对整数的操作变成了对字符串的操作
	int i=left, j=right;
	char pivot[20];
	strcpy(s[(i+j)/2],pivot);
	while(i<=j)
	{
		while(isFront(s[i],pivot))  i++;//相当于>
		while(isFront(pivot,s[j])) j--;//相当于<,注意,都没有等号
		if(i<=j)
		{
			swap(s[i], s[j]);
			i++;
			j--;
		}
	}
	if(j>left) sort(s,left,j);
	if(i<right) sort(s,i,right);
}
//用冒泡排序好像会超时

6.识别数字(10分)

题目内容:

编写函数,输出字符串中的所有整数。要考虑正、负数。

编写主函数,输入带空格的字符串,调用函数输出其中的整数。

输入格式:

一行,表示一个句子,中间可能有空格,有若干整数。

输出格式:

一行,若干整数,用一个空格隔开,末尾无空格。

注意:单独符号不算数字,但-0为0,+0也为0。

输入样例:

CHINA DAILY | Updated: 2020-03-21 07:57

输出样例:

2020 -3 -21 7 57

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

#include <iostream>
using namespace std;
int Num(char *p, char *q)//求数字串的和
{
	int t = 0;
	while(p!=q)
	{
		t*=10;
		t+=*p-'0';
		p++;
	}
	return t;
}
int distgNum(char str[], int num[])
{
	int cnt = 0;
	char *p = str;
	while(*p)
	{
		if(*p>='0'&&*p<='9')//找到数字字符串的开头和结尾,(结尾不是数字)
		{
			char *q =p;
			while(*q>='0'&&*q<='9')
				q++;
			num[cnt]=Num(p,q);
			if(*(p-1)=='-')//如果数字串前面是负号,就加上负号
				num[cnt] = -num[cnt];
			cnt ++;	//cnt可以代表数组的长度
			p = q;
		}
		p++;
	}
	return cnt;
}
int main()
{
	char s[110];
	cin.getline(s+1,110);
	int num[100];
	int len=distgNum(s+1,num);
	cout<<num[0];
	for(int i=1; i<len; i++)
		cout<<" "<<num[i];
	return 0;
}
发布了28 篇原创文章 · 获赞 38 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/weixin_45543556/article/details/105089545