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;
}