南京理工大学 程序设计基础(Ⅰ) SPOC | 学校专有课程 编程作业 第8章作业1

第一题:求峰值(100分) 题目内容:

编写程序求峰值个数。有一个数组A,找出A中满足大于或小于左右两个元素的元素,首尾两个元素忽略,例如A={12,45,32,0,14,25,62,48,51},则峰值有45,0,62,48,峰值个数为4。

要求:编写函数int peak(int *a, int *p, int
n)实现在a为首地址的n个大小的数组中发现峰值,并将峰值依次保存在p指向的单元中,返回峰值个数。在main函数中实现数组的定义和输入,调用peak函数后将峰值及其个数输出。

输入格式:

先输入一个正整数(不大于600),代表数组中元素的个数,然后依次输入数组A中的元素

输出格式:

依次输出A中峰值,如果没有则不输出。最后输出满足条件的元素的个数。不要有多余的输出

输入样例:

9 12 45 32 0 14 25 62 48 51

输出样例:

45 0 62 48 4

注:这里使用的是void Peak()函数,题目中要求的是int Peak()函数。

#include<iostream>
using namespace std;

int res_index = 0;

//用于查找峰值数的函数
bool FindNum(int front_num, int middle_num, int end_num) {
	if ((middle_num > front_num && middle_num > end_num) || (middle_num < front_num && middle_num < end_num)) return true;
	return false;
}

void Peak(int* arr, int* p, int n) {
	
	for (int i = 1; i < n - 1; i++) {
		if (FindNum(arr[i - 1], arr[i], arr[i + 1])) p[res_index++] = arr[i];
	}
}


int main() {
	int arr_size = 0, arr[600], res[600];//数组res用于记录峰值
	cin >> arr_size;

	for (int i = 0; i < arr_size; i++) {
		cin >> arr[i];
	}

	Peak(arr, res, arr_size);

	for (int i = 0; i < res_index; i++) {
		cout << res[i] << endl;
	}
	cout << res_index;

	return 0;
}

第二题:IP地址转换输出(100分)

题目内容:

编写函数void printIP(char
*s),利用指针访问方式,将s指向的32位二进制字符串,转换成十进制格式的IP地址输出,其中十进制IP地址由4个十进制数组成(分别对应4个8位的二进制数),中间用.分割开。在main函数中输入二进制串,调用printIP函数输出结果。

输入格式:

输入32位二进制字符串

输出格式:

输出转换后的IP地址,中间用.分割开。

输入样例:

00000000000000000000000000000000

输出样例:

0.0.0.0

#include<iostream>
using namespace std;

//用于计算2的n次方
int calc(int n) {
	if (n == 0) return 1;
	int res = 1;
	for (int i = 0; i < n; i++) res *= 2;
	return res;
}

void Print(char* s) {
	int ip[4] = { 0 };
	//数值转换
	for (int i = 0; i < 32; i++) ip[i / 8] += (s[i] - '0') * calc(7 + (i / 8) * 8 - i);
	//打印结果
	for (int i = 0; i < 3; i++) cout << ip[i] << ".";
	cout << ip[3];
}

int main() {
	char ch[33];
	cin >> ch;
	Print(ch);
	return 0;
}

第三题:整数个数(100分)

题目内容:

输入一个字符串,串内有数字和非数字字符,如:abc2345 345rrf678 jfkld945将其中连续的数字作为一个整数,依次存放到另一个整型数组b中。如对于以上的输入,将2345存放到b[0],345放入b[1],…。统计出字符串中的整数个数,并输出这些整数。要求在主函数中完成输入和输出,设计一个函数StrToInt(char
*str, int * b),把指向字符串的指针和指向整数的指针作为函数形参。

输入格式:

输入一个含有数字和非数字字符的字符串,长度不超过1000,且其中的整数都不超过整型的取值范围

输出格式:

依次输出字符串中包含的整数

输入样例:

abc2345 345rrf678 jfkld945

输出样例:

2345 345 678 945

#include<iostream>
using namespace std;

void StrToInt(char *str, int * arr) {
	int index_of_arr = 0;
	//核心转换
	for (int i = 0; str[i] !=  0; i++) {
		if (str[i] >= '0' && str[i] <= '9') {
			int j = i;
			while (str[j] <= '9' && str[j] >= '0') {
				arr[index_of_arr] *= 10;
				arr[index_of_arr] += str[j] - '0';
				j++;
			}
			index_of_arr++;
			i = j;
		}
	}

	//打印结果
	for (int i = 0; i < index_of_arr; i++) cout << arr[i] << endl;
}

int main() {
	char str[1000];
	int arr[1000] = { 0 };
	cin.getline(str, 1000);
	StrToInt(str, arr);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值