《计算机程序设计(C++)》第8周编程作业
1 输出数字的英文名称(20分)
题目内容:
编写一个函数,将表示数字的数值(0-12)转换成对应的英文名称(小写)。用户输入阿拉伯数字,程序输出对应数的英文单词。要求必须使用指针数组完成。
输入格式:
0-12的数
输出格式:
输入数字对应的英文单词,均为小写字母
【提示】:函数格式: char * digitName(int n);
输入样例:
1
输出样例:
one
时间限制:500ms内存限制:32000kb
#include<iostream>
using namespace std;
char* ans[13] = { "zero","one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten","eleven","twelve" };
char* digitName(int n) {
return ans[n];
}
int main(){
int n;
cin >> n;
if (0 <= n and n <= 12)
cout << digitName(n) << endl;
return 0;
}
2 去除字符串首尾多余的空格(20分)
题目内容:
用户输入一个字符串,首尾有多余的空格,编写程序来去除这些多余的空格。要求必须使用指针来完成本题。
输入格式:
一个首尾有多余空格字符串。为了便于标识出尾部的空格,在字符串尾部额外添加了个#号表示字符串结束。字符串内部保证不会出现#号。
输出格式:
去除空格后的字符串,同样在在字符串尾部额外添加了个#号表示字符串结束。
输入样例:
my score #
输出样例:
my score#
时间限制:500ms内存限制:32000kb
#include<iostream>
using namespace std;
char* deletespace(char* a) {
int i = 0;
while (a[i] == ' ') {
i++;
}
int n = i;
while (a[n] != '\0') {
n++;
}
int j = n - 2;
while (a[j] == ' ') {
j--;
}
char* ans = new char[100];
int k = 0;
for (k = 0; k < j - i + 1; k++) {
ans[k] = a[k + i];
}
ans[k] = '#';
ans[k + 1] = '\0';
return ans;
}
int main(){
char* res = new char[100];
cin.getline(res, 100);
cout << deletespace(res);
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** a;
int n, m;
int i, j;
cin >> n >> m;
a = new int* [n];
for (i = 0; i < n; i++) {
a[i] = new int[m];
}
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
cin >> *(*(a + i) + j);
}
}
int sum = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
sum += *(*(a + i) + j);
}
}
cout << sum;
for (i = 0; i < n; 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) {
int* a = new int[n];
return a;
}
void init_array(int* p, int n, int c) {
for (int i = 0; i < n; i++) {
p[i] = c;
}
return;
}
int main(){
int n, m;
cin >> n >> m;
int* a;
a = new_array(n);
init_array(a, n, m);
int i;
for (i = 0; i < n - 1; i++) {
cout << a[i] << ' ';
}
cout << a[i];
return 0;
}
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 main() {
int** a;
int n;
int i, j;
cin >> n ;
a = new int* [n];
for (i = 0; i < n; i++) {
a[i] = new int[n];
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
cin >> *(*(a + i) + j);
}
}
int sum = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
if(i==j)
sum += *(*(a + i) + j);
}
}
cout << sum;
for (i = 0; i < n; i++) {
delete[]a[i];
}
delete[]a;
return 0;
}
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 cnt = 31, i, j;
for (i = 3; i >= 0; i--) {
for (j = 0; j < 8; j++) {
s[cnt] = (char)((a[i] & 1) + '0');
cnt--;
a[i] >>= 1;
}
}
}
int main() {
int a[4];
if (scanf("%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]) == 4) {
char s[33];
s[32] = 0;
change(a, s);
cout << s << endl;
}
else {
cout << "data error" << endl;
}
return 0;
}