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