实验5-1(A)
【题目描述】
在进行文章重复度检查时,经常需要统计一段英文中的单词数量,并找出长度最长的单词。
设有如下定义:char str[500];
编写程序,通过利用cin.getline(str,500);实现从键盘输入一小段英文(其中可以包含空格,但在同一行),利用函数统计该段英文中包含几个单词,输出统计出的单词数量、最长单词的长度以及长度最长的单词,空格隔开。
注意:函数声明使用void split(char *str);如果有最长的单词不只一个,输出最先找到的那个。
【输入形式】
一小段英文,不要超过500个字符
【输出形式】
单词数量、最长单词的长度以及长度最长的单词,空格隔开。
【样例输入】
welcome to china university of mining and technology
【样例输出】
8 10 university
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
void words(char s[])
{
int t,s_length=strlen(s),i=-1,res=0,max_a=0;
char ans[500],j[500];
while (++i<s_length)
{
t=0;
while (s[i]!=' '&&i<s_length) //通过空格确定单词
{
t++;
j[t-1]=s[i];
i++;
}
res++;
if (t>max_a) { //记录最长单词
max_a=t;
strcpy(ans,j);
}
}
cout<<res<<" "<<max_a<<" ";
for (int i=0;i<max_a;i++) cout<<ans[i];
//cout<<endl;
}
int main()
{
char str[500];
cin.getline(str,500);
words(str);
}
实验5-2(B)
【题目描述】
编程序,按如下方法求A矩阵的转置矩阵B:输入两个正整数m和n,而后通过使用指针配合new运算符生成一个m行n列的二维动态数组A以及另一个n行m列的二维动态数组B,之后为A输入数据(A矩阵数据),逐行逐列输入,进而求出其转置矩阵B(即将A中的行存放成B中的列)并输出结果,逐行逐列输出,每一行数字占一行,同一行的数空格隔开。
注意:输入保证全是整数。
【输入形式】
输入m和n,逐行逐列输入数组A的数据
【输出形式】
逐行逐列输出矩阵B
【样例输入】
3 2
119 65
629 679
721 564
【样例输出】
119 629 721
65 679 564
- 正常方法(二维指针)
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main()
{
int m,n;
cin>>m>>n;
int **A = 0,**B = 0; //开辟二维指针数组空间
A = new int *[m];
B = new int *[n];
for (int i=0;i<m;i++) A[i]=new int[n];
for (int i=0;i<n;i++) B[i]=new int[m];
for (int i=0;i<m;i++) //读入并转换
for (int j=0;j<n;j++)
{
cin>>A[i][j];
B[j][i]=A[i][j];
}
for (int i=0;i<n;i++) //输出
{
for (int j=0;j<m;j++)
cout<<B[i][j]<<" ";
cout<<endl;
}
for (int i=0;i<m;i++) delete []A[i]; //释放
for (int i=0;i<n;i++) delete []B[i];
}
- 邪道做法(
不用指针一样能过)
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
int a[100][100],b[100][100];
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
{
cin>>a[i][j];
b[j][i]=a[i][j];
}
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
}
实验5-3(C)
【题目描述】
编写如下原型的函数:
void split(double x,intiPart,doublefPart);
提取出数据x的整数部分与小数部分,分别放于iPart与fPart处,由于形参iPart与fPart都是指针,从而可实现将这两个结果“带回”到主函数中。
在主函数中输入一个数,输出它的整数部分和小数部分,用空格隔开。
提示:一个double类型数,强制类型转换后就是int,也就是整数部分,差为小数部分。这两个值用指针iPart和指针fPart带回(通过修改指针的目标变量值。)
【输入形式】
一个数
【输出形式】
整数部分 小数部分,用空格隔开
【样例输入】
12.3
【样例输出】
12 0.3
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
void split(double x,int*iPart,double*fPart)
{
*iPart=int(x);
*fPart=x-int(x);
}
int main()
{
int ipart;
double n,fpart;
cin>>n;
split(n,&ipart,&fpart);
cout<<ipart<<" "<<fpart<<endl;
}
实验5-4(D)
【题目描述】
编制具有如下原型的函数findLast:
c
h
a
r
∗
f
i
n
d
L
a
s
t
(
c
h
a
r
∗
s
o
u
r
c
e
S
t
r
,
c
h
a
r
∗
s
u
b
S
t
r
)
;
char*findLast(char*sourceStr,char*subStr);
char∗findLast(char∗sourceStr,char∗subStr);
findLast函数则要返回源串sourceStr中最后一次出现subStr子字符串的头字符位置。
而后编制主函数,输入两个字符串,将它们用作实参来调用这两个函数,如果返回NULL输出-1,否则输出子字符串出现时头字符在原字符串的下标,每个结果占一行。
要求实现程序中不可使用“string.h”头文件内有关寻找子串的标准库函数。
【输入形式】
输入源串sourceStr,子字符串subStr。
【输出形式】
子字符串subStr最后一次在源串sourceStr中出现的位置
【样例输入】
welcometochinauniversityofminingandtechnology
in
【样例输出】
30
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
char*findLast(char*sourceStr,char*subStr)
{
int res=-1,i=-1,j=0;
while (*(sourceStr+(++i))!='\0')
{
while(*(sourceStr+i)!=*(subStr+j)&&*(sourceStr+i)!='\0') i++; //寻找与subStr[0]相等的位置
while (*(sourceStr+i)==*(subStr+j)&&*(subStr+j)!='\0') {j++;i++;} //确定是否与subStr完全一致
i--; //避免一致情况下的判断后,i的过度后移
if (*(subStr+j)=='\0') res=i-j+1;
j=0;
}
cout<<res<<endl;
}
int main()
{
char str[500],sub[500];
cin.getline(str,500);
cin.getline(sub,500);
findLast(str,sub);
}
实验5-5(E)
【题目描述】
编写具有如下原型的函数:
int f(unsigned long x, int n,int & Lxn);
它负责将整数x的第n位(从左边数第n位,n>0)的数值放到引用Lxn中(将作为结果返回到主调函数的对应实参变量中),并将倒数第n位(从右边数第n位,n>0)的数值作为函数结果返回去。
例如当x=123456789,n=7时,执行语句Rxn=f(x,n, Lxn);将使返回的Lxn为7,并使Rxn变为3;而执行语句 Rxn=f(12345,6,Lxn);将使Lxn与Rxn都变为0(超出数的“长度”即总位数时返回0)
【输入形式】
输入x,输入n
【输出形式】
输出Rxn,Lxn
【样例输入】
1234567 5
【样例输出】
3 5
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int f(unsigned long x, int n,int &Lxn)
{
int a=x,i,Rxn;
for (i=0;a>0;i++,a/=10); //求位数
if (n>i) return 0;
Lxn=(int(x/pow(10,i-n)))%10; //从左向右截取
Rxn=(int(x/pow(10,n-1)))%10; //从右向左截取
return Rxn;
}
int main()
{
int x,n,Lxn=0,Rxn=0;
cin>>x>>n;
Rxn=f(x,n,Lxn);
cout<<Rxn<<" "<<Lxn<<endl;
}