第8周编程作业

有的地方采用了简单的写法,会有注释

1.输出数字的英文名称(20分)

题目内容:

编写一个函数,将表示数字的数值(0-12)转换成对应的英文名称(小写)。用户输入阿拉伯数字,程序输出对应数的英文单词。要求必须使用指针数组完成。

输入格式:

0-12的数

输出格式:

输入数字对应的英文单词,均为小写字母

【提示】:函数格式: char * digitName(int n);

输入样例:

1

输出样例:

one
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
char* digitName(int n);
int main()
{
	int n;
	cin>>n;
	char *p=digitName(n);
	cout<<p<<endl;
	return 0;
}
char *digitName(int n)
{
	char *s[13]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight"	,
	"nine", "ten", "eleven", "twelve"};
	return s[n];
}

2.去除字符串首尾多余的空格(20分)

题目内容:

用户输入一个字符串,首尾有多余的空格,编写程序来去除这些多余的空格。要求必须使用指针来完成本题。

输入格式:

一个首尾有多余空格字符串。为了便于标识出尾部的空格,在字符串尾部额外添加了个#号表示字符串结束。字符串内部保证不会出现#号。

输出格式:

去除空格后的字符串,同样在在字符串尾部额外添加了个#号表示字符串结束。

输入样例:

my score #

输出样例:

my score#
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int main()
{
	char s[100];
	cin.getline(s,100,'\n');
	char *head = s;//思路是直接从字符串里截取
	char *tail = s;//并未对原字符串做大量修改
	while(*head==' ')   head++;//确定头部位置,即省略头部空格
	while(*tail!='#')   tail++;//找到末尾
	tail--;
	while(*tail==' ')   tail--;//找到不是空格的字符
	*(++tail) = '#';//后面加#
	*(++tail) = 0;//字符串结尾
	cout<<head<<endl;
	return 0;
}

3.遍历二维数组(20分)

题目内容:

用户首先输入两个整数m和n,然后输入mn个元素,建立一个mn的二维数组。要求使用 行指针 来遍历这个二维数组,输出该数组中所有元素的和。

输入格式:

首先输入两个整数m和n,然后依次输入m*n个元素

输出格式:

二维数组中所有元素的和

输入样例:

2 3

1 3 5

2 4 6

输出样例:

21
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int main()
{
	int m, n;
	cin>>m>>n;
	int **a = new int*[m];
	for(int i=0; i<m; i++)
	{
		a[i] = new int[n];
	}
	//动态申请二维数组
	int sum=0;
	for(int i=0; i<m; i++)
	{
		for(int j=0; j<n; j++)
		{
			cin>>*(*(a+i)+j);//a是二级指针,所以首次间访得到的是一级指针
			sum+=*(*(a+i)+j);//也可以说成行指针
		}
	}
	cout<<sum<<endl;
	for(int i=0; i<m; i++)
		delete []a[i];//记得释放空间
	delete []a;//二维数组也得释放
	return 0;
}

4.动态申请大数组(20分)

题目内容:

本题要求编写两个函数并测试。

第一个函数原型为 int *new_array(int n); 该函数可以根据参数n动态申请n个元素的整型数组,最后将数组指针返回。

第二个函数原型为 void init_array(int *p, int n,int c); 将指定的n个元素的数组每个元素的值均初始化为c。

用户输入数组大小n和待初始化的值c,调用new_array函数申请空间,再调用init_array初始化,最后输出这个数组的所有元素。

输入格式:

数组大小n和待初始化的值c

输出格式:

数组的所有元素,注意最后一个元素后没有空格

输入样例:

8 27

输出样例:

27 27 27 27 27 27 27 27
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int *new_array(int n);
void init_array(int *p, int n,int c);
int main()
{
	int n, c;
	cin>>n>>c;
	int *a=new_array(n);
	init_array(a,n,c);
	cout<<*a;
	for(int i=1; i<n; i++)
		cout<<" "<<*(a+i);
	return 0;
}
int *new_array(int n)
{
	int *p = new int[n];
	return p;
}
void init_array(int *p, int n, int c)
{
	for(int i=0; i<n; i++)
		*(p+i)=c;
}
//话说要不是为了练习动态内存,就直接用for循环做吧!

5.矩阵对角线元素之和(20分)

题目内容:

编写函数,求n阶方阵的对角线元素之和。编写主程序,用户输入矩阵的阶数n,动态申请n*n的存储空间,再输入n行、n列的元素,调用函数求矩阵的对角元素之和,在主函数中输出这个和。设元素均为整数。n>=1。

*函数格式:int sumDiagonal(int a,int n);

输入格式:

一个正整数n,表示矩阵的阶数。

n行、n列的矩阵元素。数据间用空格隔开。

输出格式:

一个整数

输入样例:

3

6 1 2

1 13 6

62 4 35

输出样例:

54
时间限制:1000ms内存限制:32000kb

#include <iostream>
using namespace std;
int sumDiagonal(int **a,int n);
int main()
{
	int n;
	cin>>n;
	int **a= new int*[n];
	for(int i=0; i<n; i++)
		a[i] = new int[n];
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++){
			cin>>*(*(a+i)+j);
		}
	}
	cout<<sumDiagonal(a,n)<<endl;
	for(int i=0; i<n; i++)
		delete []a[i];
	delete []a;
	return 0;
}
int sumDiagonal(int **a,int n)
{
	int sum=0;
	for(int i=0; i<n; i++)
		sum+=*(*(a+i)+i);//主对角线特点,行列数相等
	return sum;
}

6.(本题只记3分)十进制点分IP转换为32位二进制IP(3分)

题目内容:

编写程序,将十进制点分的IP转换为32位二进制IP地址。程序要能验证输入的十进制点分IP地址的合法性。用户输入的IP不和法时,输出"data error"。

请使用模块化程序设计的思想,将功能模块编写成函数。通过指针传递参数,操作数据,返回结果。在主函数中输入IP地址,调用函数进行合法性验证和转换,在主函数中输出32位二进制IP。

输入格式:

十进制点分IP地址(英文句点)

输出格式:

32位二进制数(二进制字符串)

输入样例:

202.151.96.33

输出样例:

11001010100101110110000000100001

提示:十进制转换为二进制。对整数部分,除2取余,直到商为0。例如

13/2=6…1(低位)

6/2=3…0

3/2=1…1

1/2=0…1

转换后的二进制数位1101

时间限制:2000ms内存限制:32000kb

#include <iostream>
#include <cstdio>
using namespace std;
void change(int a[], char *s);
int main()
{
	int a[4];
	if(scanf("%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3])==4)
	{//为了方便用了scanf
		char s[33];
		s[32]=0;
		change(a,s);
		cout<<s<<endl;
	}else{
		cout<<"data error"<<endl;
	}
	return 0;
}
void change(int a[], char *s)
{
	int cnt=31;//自后向前把分解的每一位写到字符数组里即可
	for(int i=3; i>=0; i--)//因为位运算读取的是最后那位
	{
		for(int j=0; j<8; j++)
		{
			s[cnt]= (char)((a[i]&1)+'0');
			cnt--;
			a[i]>>=1;
		}
	}
}
发布了28 篇原创文章 · 获赞 38 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/weixin_45543556/article/details/105225419