第5周中级练习(dwiefbbrg)

1比较字符串(不区分大小写)(10分)
题目内容:

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

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

输入格式:

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

输出格式:

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

输入样例:

four for

输出样例:

1

//比较字符串(不区分大小写)
#include<iostream>
using namespace std;
void convert(char s[], int len)//字符串转大写
{
	int i;
	for (i = 0; i < len; i++)
	{
		if (s[i] >= 'a' && s[i] <= 'z')
			s[i] = s[i] + 'A' - 'a';
	}
}
int length(char s[])//字符串长度
{
	int len = 0;
	while (s[len] != '\0')
		len++;
	return len;
}
int mystrcmp(char str1[], char str2[])//字符串比较
{
	convert(str1, length(str1));
	convert(str2, length(str2));
	char* p = str1;
	char* q = str2;
	while (*p == *q && *p && *q)
	{
		p++;
		++q;
	}
	if (*p > * q)
		return 1;
	else if (*p == *q)
		return 0;
	else
		return -1;
}
int main()
{
	char a[101], b[101];
	cin >> a >> b;
	cout << mystrcmp(a, b) << endl;
	return 0;
}

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

//二分法解方程
#include<iostream>
#include<cmath>
using namespace std;
double f(double x)
{
	return (2 * x * x * x - 4 * x * x + 3 * x - 6);
}
double zeropoint(double left, double right, double esp)
{
	double mididx;//中点坐标
	double mid;//中点函数值
	
	do
	{
		mididx = (left + right) / 2.0;
		mid = f(mididx);
		if (mid == 0)
			break;
		if (mid *f(left)< 0)
			right = mididx;
		else
			left = mididx;
	} while (abs(mid) > esp);
	return mididx;

}
int main()
{
	double eps,a,b;
	cin >> a >> b >> eps;
	cout << zeropoint(a, b, eps);
	return 0;
}

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),导数,求绝对值,均定义为函数。

//牛顿法解方程
#include<iostream>
using namespace std;
double f(double x)
{
	return (x * x * x + 2 * x * x + 3 * x + 4);
}
double myabs(double x)
{
	if (x >= 0)
		return x;
	else
		return (-x);
}
double df(double x)
{
	return 3 * x * x + 4 * x + 3;
}
double zeropoint(double x0, double esp)
{
	double xn;
	xn = x0 - f(x0) / df(x0);
	do
	{
		xn = xn - f(xn) / df(xn);
	} while (myabs(f(xn)) > esp);
	return xn;
}
int main()
{
	double x0, esp;
	cin >> x0 >> esp;
	cout << zeropoint(x0, esp);
	return 0;
}

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

//
#include<iostream>
using namespace std;
int input(int a[])
{
	int i = 0;
	cin >> a[i];
	while (a[i] != -9999)
	{
		i++;
		cin >> a[i];
	}
	return i;
}
void sort(int a[], int n)
{
	int i, j, temp;
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (a[j] > a[j + 1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
}
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;
}
int main()
{
	int a[101];
	int n = input(a);
	sort(a, n);
	int b[5];
	for (int i = 0; i < 5; i++)
	{
		cin >> b[i];
		cout << binarysearch(a, 0, n - 1, b[i]) << endl;
	}
	return 0;
}

5单词排序(10分)
题目内容:

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

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

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

输入格式:

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

输出格式:

n行,每行一个单词。

输入样例:

5

sin cos log exp sqrt

输出样例:

cos

exp

log

sin

sqrt

//单词排序
#include<iostream>
using namespace std;
void strcpy(char a[], char b[])
{
	char* p = a;
	char* q = b;
	while (*q++ = *p++);
}
void swap(char a[], char b[])
{
	char temp[20];
	strcpy(a,temp);
	strcpy(b,a);
	strcpy(temp,b);
}
bool isFront(char s1[], char s2[])//判断s1在字典中是不是在s2前面
{								
	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;
	if (*q)  return 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);
}
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;
}

6识别数字(10分)
题目内容:

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

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

输入格式:

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

输出格式:

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

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

输入样例:

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

输出样例:

2020 -3 -21 7 57

//识别数字
#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 findnum(char s[], int a[])//字符串s中的数字存在a数组中
{
	int i = 0;
	char* p = s;
	while (*p)
	{
		if (*p >= '0' && *p <= '9')//p和q分别指向数字的开头和末尾
		{
			char* q;
			q = p;
			while (*q >= '0' && *q <= '9')
			{
				q++;
			}
			a[i] = Num(p, q);
			if (*(p - 1) == '-')//有负号的话
				a[i] *= -1;
			i++;
			p = q;//头指针移到数字尾部
		}
		p++;
	}
	return i;
}
int main()
{
	char s[201];
	cin.getline(s + 1, 200);
	int a[100];
	int len = findnum(s + 1, a);
	cout << a[0];
	for (int i = 1; i < len; i++)
		cout << " " << a[i];
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值