题目内容:
编写程序,去掉字符串中间的所有空格(保持两头的空格)。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.
输入格式:一个字符串
输出格式:两行:第一行,原字符串;第二行,删除中间空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。参照样例。
输入样例:
strd sdf
输出样例:
|strd sdf|
|strdsdf|
//去掉字符串中间的所有空格
#include<iostream>
using namespace std;
void deletespace(char str[]);
int main()
{
char s[101];
cin.getline(s, 100);
cout << "|" << s << "|" << endl;
deletespace(s);
cout << "|" << s << "|" << endl;
return 0;
}
void deletespace(char str[])//去除中间空格的函数
{
char* p, * q;
p = str;
q = str;
while (*p == ' ')
{
p++;
}//p指向非空格的字符
do
{
while (*p != ' ' && *p != 0)//找到不是空格的元素,要防止p==0
p++;
q = p; //q和p指向相同的位置
while (*q == ' ')//用q找到所有空格之后的元素
q++;
if (*q != 0)//如果不是字符串结尾,就把q后面整体移到p那里
//这可以保护字符串末尾的空格
movForward(p, q);
} while (*p != ' ' && *p != 0);//当还没有把所有空格消完就继续循环
}
void movForward(char* p, char* q)
{
while (*q)
{
*p = *q;
*q = ' ';
q++;
p++;
}
*p = '\0';//移到前面后要把字符串末尾变成0
}
//可以用一个新的字符数组, 通过复制,把空格省略
查找子串(10分)
题目内容:
编写程序,在字符串中查找子字符串,找到则返回第一个字符所在的位置(从1开始),找不到则显示“没有该子串”。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.
输入格式:
两行:第一行为待查找的字符串;第二行为要查找的子字符串。
输出格式:
第一个字符所在的位置(从1开始),若找不到则显示“没有该子串”。
输入样例1:
This is a book!
is
输出样例1:
3
输入样例2:
This is a book!
isa
输出样例2:
没有该子串
//查找子串
#include<iostream>
using namespace std;
bool baohan(char* p, char* q);
int Findstr(char a[], char b[]);
int main()
{
char s[101];
char a[101];
cin.getline(s, 100);
cin.getline(a, 100);
int flag;
flag = Findstr(s, a);
if (flag == 0)
cout << "没有该字符串" << endl;
else
cout << flag << endl;
return 0;
}
int Findstr(char a[],char b[])
{
int counter = 0;
char* p = a;
char* q = b;
while (*p != '\0')
{
if (baohan(p, q))
{
counter = p - a;
break;
}
p++;
}
return counter + 1;
}
bool baohan(char *p, char *q)
{
bool sign = 1;
while (*q != '\0')
{
if (*p != *q)
{
sign = false;
break;
}
p++;
++q;
}
return sign;
}
7.排序(10分)
题目内容:
输入n个整数,对它们进行排序,从大到小输出。0<n<=100。注意,不应使用别人写的库函数。
输入格式:
两行,第1行为元素个数n;第2行为n个整数,用空格隔开。
输出格式:
n个排好序的整数,从大到小用一个空格隔开,末尾无空格。
输入样例:
5
1 2 5 4 3
输出样例:
5 4 3 2 1
//输入n个整数,对它们进行排序,这里使用冒泡排序
#include<iostream>
using namespace std;
void maopao(int a[],int n);
int main()
{
int n;
cin >> n;
int a[200];
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
maopao(a, n);
int i;
for ( i = 0; i < n - 1; i++)
cout << a[i] << " ";
cout << a[i];
return 0;
}
void maopao(int a[], int n)
{
int i, j;
int temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (a[j] < a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}
8二分查找(10分)
题目内容:
从小到大输入若干整数(不超过300),以-99999为结束符,然后再输入一个整数x,z在前面的整数中用二分查找法查找x,若找到,显示数的下标(即从0开始的序号);若找不到,显示-1。注意,不应使用别人写的库函数。
输入格式:
若干整数。
输出格式:
一个下标
输入样例:
1 2 3 4 5 -99999
2
输出样例:
1
//二分查找
#include<iostream>
using namespace std;
int binarysearch(int a[], int left, int right, int dest);
int main()
{
int a[400];
int num;
int i = 0;
while (cin >> num && num != -99999)
{
a[i++] = num;
}
int dest;
cin >> dest;
int j = binarysearch(a, 0, i - 1, dest);
cout << j << endl;
return 0;
}
int binarysearch(int a[], int left, int right, int dest)
{
while (left <= right)
{
int mididx=(left+right)/2;
int mid = a[mididx];
if (dest > mid)
{
left = mididx + 1;
}
else if (dest < mid)
{
right = mididx - 1;
}
else
return mididx;
}
return -1;
}