第4周学习笔记(dwqub)

题目内容:

编写程序,去掉字符串中间的所有空格(保持两头的空格)。要求字符串用字符数组存放,不使用库函数。字符串长度不超过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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值