C++第八周mooc在线测评—第8周 按址操作(2)——指针与数组、字符串、结构体,动态数组

//利用指针输出数组中的元素(20分)
//题目内容:
//编写程序,把从1到n的n个整数赋予某个int型数组,然后用int型指针输出该数组元素的值。,
//
//输入格式:
//输入参数n
//
//输出格式:
//输出是1到n n个数组元素, 注意最后一个元素之后没有空格。
//
//输入样例:
//9
//
//输出样例:
//1 2 3 4 5 6 7 8 9
#include<iostream>

int main(int argv, char** argc)
{
	int n;
	std::cin >> n;
	int data[100];
	int *p;
	p = data;
	for (int i = 0; i < n; i++)
		data[i] = i+1;
	for (int i = 0; i < n; i++)
	{
		std::cout << *p;
		p++;
		if (i!=n-1)
		{
			std::cout << " ";
		}

	}
	system("pause");
	return 0;
}

//2输出数字的英文名称(20分)
//题目内容:
//编写一个函数,将表示数字的数值(1 - 12)转换成对应的英文名称(小写)。用户输入阿拉伯数字,程序输出对应数字的英文单词。要求必须使用指针数组完成。
//
//输入格式 :
//1 - 12的数字
//
//输出格式:
//输入数字对应的英文单词,均为小写字母
//
//输入样例:
//1
//
//输出样例:
//one
#include<iostream>

int main(int argc, char**argv)
{
	int number;
	std::cin >> number;
	char *word[] = { "one", "two", "three" ,"four","five","six","seven","eight","nine","ten","eleven","twelve"};
	std::cout << word[number-1];
	system("pause");
	return 0;
}

//3去除字符串首尾多余的空格(20分)
//题目内容:
//用户输入一个字符串,首尾有多余的空格,编写程序来去除这些多余的空格。要求必须使用指针来完成本题。
//
//输入格式 :
//一个首尾有多余空格字符串。为了便于标识出尾部的空格,在字符串尾部额外添加了个#号表示字符串结束。字符串内部保证不会出现#号。
//
//输出格式:
//去除空格后的字符串,同样在在字符串尾部额外添加了个#号表示字符串结束。
//
//输入样例:
//my score    #
//
//输出样例:
//my score#
#include<iostream>

int main(int argc, char**argv)
{
	char str[300];
	char *s = str;
	std::cin.getline(str,300,'#');

	do
	{
		if (*s !=' ')
		{
				std::cout << *s;
		}
		else
		{
			if (*(s - 1) != ' '&&*(s + 1) != ' '&&*(s + 1) != '\0')
			{
				std::cout << *s;
			}
		}
		s++;
	} while (*s !='\0');
	std::cout << '#';
	system("pause");
	return 0;
}

//4遍历二维数组(20分)
//题目内容:
//用户首先输入两个整数m和n, 然后输入m*n个元素,建立一个m*n的二维数组。要求使用 行指针 来遍历这个二维数组,输出该数组中所有元素的和。
//
//输入格式 :
//首先输入两个整数m和n, 然后依次输入m*n个元素
//
//输出格式:
//二维数组中所有元素的和
//
//输入样例:
//2 3
//1 3 5
//2 4 6
//
//输出样例:
//21

#include <iostream>
using namespace std;
int main()
{
	int **a;  //指向指针的指针 
	int n, m;//n行 m列 
	int i, j;
	int sum = 0;
	cin >> n >> m; //输入行数和列数

	//申请空间
	a = new int *[n];  //n个 int 指针 数组
	for (i = 0; i<n; i++)    //n个大小为m的一维指针数组
	{
		a[i] = new int[m]; //1个大小为m的一维数组,a[i]是int指针
	}

	//输入数据
	for (i = 0; i<n; i++)
	{
		for (j = 0; j<m; j++)
		{
			//cin>>a[i][j];//输入 
			cin >> *(*(a + i) + j);//同上a相当于行指针 
			sum = *(*(a + i) + j) + sum;

		}
	}
	cout << sum;
	//释放申请的空间!!!
	for (i = 0; i<n; i++) //释放n个大小为m的一维数组
	{
		delete[]a[i];
	}
	delete[]a;//释放int指针数组
	system("pause");
	return 0;
}

//5动态申请大数组(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
#include<iostream>
using namespace std;
int *p;
int* new_array(int n)
{	
	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;
	}
}
int main()
{
	int c, n;
	cin >> n>> c;
	int *w = new_array(n);
	init_array(w, n, c);
	for (int i = 0; i < n; i++)
	{
		cout << *w;
		w++;
		if (i != n-1)
		{
			cout << " ";
		}
	}
	system("pause");
	return 0;
}


//6(本题只记1分)矩阵对角线元素之和。(1分)
//题目内容:
//编写函数,求n阶方阵的对角线元素之和。编写主程序,用户输入矩阵的阶数n,动态申请n*n的存储空间,再输入n行、n列的元素,调用函数求矩阵的对角元素之和,在主函数中输出这个和。设元素均为整数。n >= 1。
//
//
//输入格式 :
//一个正整数n,表示矩阵的阶数。
//n行、n列的矩阵元素。数据间用空格隔开。
//
//输出格式:
//一个正整数
//
//输入样例:
//3
//6 1 2
//1 13 6
//62 4 35
//
//输出样例:
//54

#include<iostream>
using namespace std;
int main()
{
	int n;
	int **a;
	int sum = 0;
	cin >> n;
	a = new int*[n];


	for (int i = 0; i < n; i++)
	{
		a[i] = new int[n];
		for (int j = 0; j < n; j++)
			cin >> a[i][j];
	}

	for (int i = 0; i < n; i++)
	{

		sum = sum + a[i][i];
	}
	cout << sum;
	system("pause");
	return 0;
}

//7(本题只记3分)十进制点分IP转换为32位二进制IP(3分)
//题目内容:
//编写程序,将十进制点分的IP转换为32位二进制IP地址。程序要能验证输入的十进制点分IP地址的合法性。用户输入的IP不和法时,输出"data error"。
//
//请使用模块化程序设计的思想,将功能模块编写成函数。通过指针传递参数,操作数据,返回结果。在主函数中输入IP地址,调用函数进行合法性验证和转换,在主函数中输出32位二进制IP。
//
//输入格式 :
//十进制点分IP地址(英文句点)
//
//输出格式:
//32位二进制数(二进制字符串)
//
//输入样例:
//202.151.96.33
//
//输出样例:
//11001010100101110110000000100001
#include<iostream>
#include<string.h>
using namespace std;
bool correct(char *str)
{
	int num = 0;
	int length = strlen(str);
	for (int i = 0; i < length; i++)
	{
		if (str[i] == '.')
		{
			num++;
		}
	}
	return (num == 3 ? true : false);
}
void two2dec(int dec)
{
	int  Remain = 1;
	int i = 7;
	char str2[9] = "00000000";
	while (dec != 0)
	{
		Remain = dec % 2;
		dec = dec / 2;
		str2[i] = char(Remain + 48);
		i--;
	}
	cout << str2;
}
void transfer(char *str)
{
	int length = strlen(str);
	int digit = 0;
	int number = 0;
	for (int i = 0; i <= length;){

		if (str[i] != '.' && i != length )
		{
			digit++;
			i++;
		}
		else
		{
			for (int j = i - digit; j < i; j++){
				number = 10 * number + int(str[j] - 48);
			}
			two2dec(number);
			number = 0;
			i++;
			digit = 0;
		}
	}


}

int main()
{
	char str1[100];
	cin.getline(str1, 100);
	if (correct(str1))
	{
		transfer(str1);
	}
	else
	{
		cout << "data error";
	}
	system("pause");
	return 0;
}


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值