--整形二维数组,其各位数字立方和等于该数本身

整形二维数组与字符串二维数组

曾经在软通动力写过的算法题其中有一小部分是参考网上的资料,现在拿出来给大家分享!
第3章 控制语句

————————————的比较研究

/* 1、打印出所有的“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153是一水仙花数,因为153 = 13 + 53 + 33。 */
#include<iostream.h>
void main()
{
int i, a=0, b=0, c=0;
for(i=100;i<1000;i++)
{
a=i%10;
b=i/10%10;
c=i/100%10;
if(a*a*a+b*b*b+c*c*c==i)
cout<<"i="<<i<<endl;
}
}

概述:

/* 2、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6 = 1 + 2 + 3,因此6是“完数”。编程序找出1000之内的所有完数,并按下面的格式输出其因子:
6 -〉1,2,3 */
#include<iostream.h>
void main()
{
int i,j,sum=0,a[50],k,t;
for(i=1;i<=1000;i++)
{
sum=0;
        for(j=1;j<i;j++)
{
if(i%j==0)
{
sum+=j;
a[k++]=j;
}
}
t=k;
if(sum==i)
{
cout<<i<<"->";
for(k=0;k<t;k++)
{
cout<<a[k];
if(k<t-1)cout<<",";
}
cout<<endl;
}
    k=0;
}
}

研究整形二维数组与字符串二维数组在输出的时候表现为不同的情况。

/* 3、求Sn=a+aa+aaa+…+aa…a之值,其中a是一个数字。例如:2+22+222+…+22222(此时n=5),n由键盘输入。*/
#include<iostream.h>
void main()
{
double a,sn=0.0,sum=0.0;
int n,i;
cout<<"please input a number";
cin>>a;
    cout<<"please input n number";
cin>>n;
sn=a;
sum=a;
    for(i=2;i<=n;i++)
    {
sum=sum*10+a;
sn+=sum;
    }
cout<<"Sn="<<sn<<endl;
}

步骤1、整形二维数组

/* 4、一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下。求它在第10次落地时,共经过了多少米?第10次反弹多高?*/
#include<iostream.h>
void main()
{
double h1=100,h2=100,sum=0.0;
int i;
for(i=1;i<=10;i++)
{

--整形二维数组

sum+=h2;
h1=h1/2.0;
h2=h1*2;
}
cout<<"sum="<<sum<<"   "<<"h1="<<h1<<endl;
}

#include "iostream"

/* 5、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第一天共摘了多少桃子。*/
#include<iostream.h>
void main()
{
int number,i;
number=1;
for(i=10;i>1;i--)
number=(number+1)*2;
cout<<"number="<<number<<endl;
}

using namespace std;

8.++程序中使用流格式输入、输出,我们可以怎么做?
答:在程序的开头包含头文件iostream.h
     cin输入,cout输出。
例如:

int main(void)

#include<iostream.h>
void main()
{
   int a;
   cout<<"请输入a的值:";
   cin>>a;
   cout<<"a的值为:"<<a<<endl;
}

{

第4章 函数

int scar[3][6]={{1,2,3,4,5,6},{2,3,4,5,6,7},{3,4,5,6,7,8}};

/* 1、写一函数用“气泡法”对输入的10个字符按由小到大的顺序排列。*/
#include<iostream.h>
void main()
{
int i,j,temp,a[10];
cout<<"please input ten numbers:n";
for(i=0;i<10;i++)
cin>>a[i];
for(i=0;i<10;i++) //每循环一次确定数组中一个数的位置
for(j=i+1;j<10;j++) //每次循环对比一个数的大小
{
if(a[i]>a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
cout<<"resort result=";
for(i=0;i<10;i++)
cout<<a[i]<<" ";
}

for(int i=0;i<3;i++)

/* 2、用递归方法求n阶勒让得多项式的值,递归公式为
         1 (n = 0)
Pn(x) =  x (n = 1)
         ((2n-1)*x*Pn-1(x)-(n-1)*Pn-2(x))/n (n > 1) */
#include<iostream.h>
double fun (double,double);
void main()
{
double n,x,sum;
cout<<"input n and x"<<endl;
cin>>n>>x;
sum=fun(n,x);
cout<<"P"<<n<<"("<<x<<")"<<"="<<sum<<endl;
}
double fun(double n1,double x1)
{
if (n1==0)
return 1;
else if (n1==1)
return  x1;
else if (n1>1)
return ((2*n1-1)*x1*fun(n1-1,x1)-(n1-1)*fun(n1-2,x1))/n1;
}

{

/* 3、编写一函数,由实参传来一字符串,统计此字符串中字母、数字、空格、和其它字符的个数,并在主函数中输入字符串以及输出上述结果。 */
#include<iostream.h>
void judge(char a[]);
void main()
{
const int size=100;
char a[size];
cin.getline(a,size);
judge(a);
}
void judge(char a[100])//判断字符类型
{
int letter=0,number=0,others=0,i=0;
while(a[i]!='')
{
if ((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='z')) letter++;//统计字母个数
else if (a[i]>='0' && a[i]<='9') number++;//统计数字个数
else others++;//统计其他数个数
i++;
}
cout<<"letter="<<letter<<"  number="<<number<<"  others="<<others<<endl;
}

cout<<scar[i]<<endl;//这样输出的是每行的地址

/* 4、给出年、月、日,计算该日是该年的第几天。 */
#include<iostream.h>
int lead(int);
void main()
{
int ly,year,month,date,i,sum=0;
cout<<"input year、month、date: ";
cin>>year>>month>>date;
int a[12]={31,0,31,30,31,30,31,31,30,31,30,31};
ly=lead(year);
if (ly==1)
a[1]=29;//366天
else a[1]=28;//365天
for(i=0;i<month-1;i++) //当前月之前所有月天数累加和
sum+=a[i];
sum+=date; //加上当前月天数
cout<<"你输入的日期是当年的第"<<sum<<"天";
}
int lead(int y)//判断闰年
{
if((y%4==0&&y%100!=0)||(y%400==0)) return 1;//是闰年
else return 0;//不是闰年
}

for(int j=0;j<6;j++)

/* 5、写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。 */
#include<iostream.h>
int cdivisor(int,int);
int cmultiple(int,int,int);
void main()
{
int x,y,d,m;
cout<<"input two number: ";
cin>>x>>y;
d=cdivisor(x,y);
m=cmultiple(x,y,d);
cout<<"common divisor is "<<d<<endl<<"common multiple is "<<m<<endl;
}
int cdivisor(int x1,int y1)//最大公约数
{
int r,temp;
if (x1<y1)
{
temp=x1;
x1=y1;
y1=temp;
}
while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数
{
r=x1%y1;
x1=y1;
y1=r;
}
return y1;
}
int cmultiple(int x2,int y2,int d1)//最小公倍数
{
return x2*y2/d1;//两数相乘结果除以它们的最大公约数为最小公倍数
}

{

/* 6、写一函数,将两个字符串连接。 */
#include<iostream.h>
#include<string.h>
void main()
{
const int size=100;
char a[size],b[size];
cout<<"input two string:"<<endl;
cin.getline(a,size);
cin.getline(b,size);
strcat(a,b);
cout<<"a="<<a<<endl;
}

  cout<<scar[i][j]<<endl;//这里输出的是每行的元素

/* 7、写一函数,将一个字符串的元音字母复制到另一个字符串,然后输出。 */
#include<iostream.h>
#include<string.h>
void scpy(char *,char *);
void main()
{
const int size=100;
char a[size]="Hello world";
char b[size]="Net";
cout<<"a= "<<a<<"b= "<<b<<endl;
scpy(a,b);
cout<<"a= "<<a<<endl;
}
void scpy(char *p,char *q)
{
while(*q!='')
{
if (*q=='a'||*q=='A'||*q=='e'||*q=='E'||*q=='i'||*q=='I'||*q=='o'||*q=='O'||*q=='u'||*q=='U')
*p++=*q;
q++;
}
}

}

/* 8、写一函数,输入一个四位数字,要求输出这4个数字字符,但每两个数字间空一空格。如输入1990,应输出“1 9 9 0”。 */
#include<iostream.h>
#include<string.h>
void outs(char a[]);
void main()
{
const int size=10;
char a[size];
cin.getline(a,size);
outs(a);
}
void outs(char a[10])
{
int i;
if(strlen(a)<=4)
{
for(i=0;i<4;i++)
cout<<a[i]<<" ";
}
else cout<<"input error."<<endl;
}

}

第5章   数组

return 0;

/* 1、将一个数组中的值按逆序重新存放,例如,原来顺序为:a、b、c、d。要求改为:d、c、b、a。 */
#include<iostream.h>
void back(char *);
void main()
{
char a[50]="abcdefg";
cout<<"a="<<a<<endl;
back(a);
}
#include<iostream.h>
void back(char *p)
{
int i=0;
while(*p!='')
{
p++;//把指针定位到字符串末尾
i++;//统计字符个数
}
cout<<"a=";
for(;i>0;i--)//逆序输出
{
p--;
cout<<*p;
}
cout<<endl;
}

}

/* 2、打印出杨辉三角形(要求打印出前15行)。(杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。) */
#include<iostream.h>
void tri(int a[][15]);
void main()
{
int i,j,a[15][15];
tri (a);
cout<<"a= ";
for(i=0;i<15;i++)//遍历整个数组
{
for(j=0;j<=i;j++)
{
cout<<a[i][j];
if(a[i][j]>=1&&a[i][j]<=9)//当输出个位数之后输出4个空格保持整齐
cout<<"    ";
else if (a[i][j]>=10&&a[i][j]<=99)//当输出十位数之后输出3个空格保持整齐
cout<<"   ";
else if(a[i][j]>=100&&a[i][j]<=999)//当输出百位数之后输出2个空格保持整齐
  cout<<"  ";
  else cout<<" ";//当输出百位数之后输出1个空格保持整齐
}
cout<<endl<<"   ";//每行输出结束后换行
}
}
void tri(int a[15][15])
{
int i,j;
for(i=0;i<15;i++)
for(j=0;j<=i;j++)
{
if(j==0||j==i)//三角形第一列和对角线被赋值为1
a[i][j]=1;
else a[i][j]=a[i-1][j-1]+a[i-1][j];//算出其余的数组元素
}
}

以下是整形二维数组的输出显示

/* 3、编一程序,将两个字符串连接起来,不要用strcat函数。 */
#include<iostream.h>
#include<string.h>
void scat(char *,char *);
void main()
{
const int size=100;
char a[size]="Hello";
char b[size]="Bye";
cout<<"a="<<a<<"   b="<<b<<endl;
scat(a,b);
cout<<"a="<<a<<" after link a and b"<<endl;
}
void scat(char *p,char *q)
{
while(*p!='')//确定数组a的插入位置
{
p++;
}
while(*q!='')
{
*p=*q;
p++;
q++;
}
}

图片 1

/* 4、打印“魔方阵”。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵:
      8 1 6
      3 5 7
      4 9 2
要求打印由1到n2的自然数构成的所有魔方阵。 */
//方法一:输出N介魔方阵,但每介只输出一种。
#include<iostream.h>
void square(int a[][10],int k,int n);
void main()
{
int n,i,j,k,a[10][10]={0};
cout<<"input an odd number:"<<endl;
cin>>n;
k=n/2;//确定第一个数列数
square(a,k,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<"t"<<a[i][j];
cout<<endl;
}
}
void square(int a[][10],int k,int n)
{
int i,j;
for(i=1,j=0;i<=n*n;i++,j--,k++)//n为阶数,从1开始给数组赋值
{
if(j<0&&k>=n)//当数组行列都越出范围时候,确定数组正确位置
{
j+=2;k-=1;
}
else if(j<0)//当数组行越出范围时候,确定数组正确位置
j+=n;
else if(k>=n)//当数组列越出范围时候,确定数组正确位置
          k-=n;
  else if(a[j][k]!=0)//当数组原位置有数时候,确定数组位置
  {
j+=2;k-=1;
  }
a[j][k]=i;
}
}
//方法二:输出N介魔方阵所有魔方阵。
#include <string>
#include <iomanip>
#include <iostream>

可以看出每当运行到"cout<<scar[i]<<endl;"的时候输出的是一个地址,第一个地址与第二个地址相差0x18,第二个地址与第一个地址相差0x18,在这里“scar[i]”是每个一维数组的指针。

using namespace std;

猜想:

void printA(int **p,int n)//输出这个n阶魔方阵
{
cout<<endl<<"下面是一个"<<n<<"阶魔方阵:"<<endl;

上面每两个连续指针之间相差都是0x18,就是24个字节,6个整形数字,每个整形数字占用4个字节

int i,j;

尝试:直接使用“scar[i]”作为指针,输出一维数组中的元素,由于1.,2,3地址相差相同,所以所有的元素都是连续存放的,可以全部使用scar[i]作为引用完整的输出全部元素

for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
{
cout<<setw(4)<<p[i][j];
}

#include "iostream"

cout<<endl;
}

using namespace std;

cout<<endl<<endl;
}
bool Judge(int **p,int n)//判断是否为n阶魔方阵
{
int i,j,sum = 0,NowSum = 0;
bool YesOrNo = true;

int main(void)

for(j = 0;j < n;j++)//第一行总和
{
sum += p[0][j];
}

{

for(i = 1;i < n;i++)//判断每行总和是否相等
{
NowSum = 0;
for(j = 0;j < n;j++)
{
NowSum += p[i][j];
}

int *p,scar[3][6]={{1,2,3,4,5,6},{2,3,4,5,6,7},{3,4,5,6,7,8}};

if(NowSum != sum)
{
YesOrNo = false;

for(int i=0;i<3;i++)

goto END;
}
}

{

for(i = 0;i < n;i++)//每列是否相等
{
NowSum = 0;
for(j = 0;j < n;j++)
{
NowSum += p[j][i];
}

cout<<scar[i]<<endl;//这样输出的是每行的地址

if(NowSum != sum)
{
YesOrNo = false;

p=scar[i];

goto END;
}
}

for(int j=0;j<6;j++)

NowSum = 0;
for(i = 0,j = 0;i < n,j < n;i++,j++)//主对角线是否相等
{
NowSum += p[i][j];
}
if(NowSum != sum)
{
YesOrNo = false;

{

goto END;
}

  cout<<*p++<<endl;//这里输出的是每行的元素

NowSum = 0;
for(i = n-1,j = 0;i >= 0,j < n;i--,j++)//次对角线是否相等
{
NowSum += p[i][j];
}
if(NowSum != sum)
{
YesOrNo = false;

}

goto END;
}

}

END:
return YesOrNo;
}
void combination(int **p,int n,int *a)//求m = n*n个数(1,2,3.....m)的全排列
{
int m = n*n;
static int Num = 0;
int *b_val = new int[m];
int c = 0,k,i,j;

return 0;

b_val[c] = -1;//一维数组首地址的值赋-1 c[0]-1
while(b_val[0] < m) //-1
{
if(++b_val[c] < m) //分别从0开始累加每个元素值,并限制不超出最大阶数
                 //b[0]0 [1]0 [1]1 [2]0 [2]1 [2]2...[6]6...[7]0...[7]7 [8]0...[8]8 判断魔方 [8]9 012345678
                      //                                               [7]8 [8]0...[8]7 判断魔方 [8]8 [8]9 012345687
     //                                 [6]7...[7]0...[7]6        [8]8 012345768
                                           //         012345786
     //                                                                012345867 ...
           //      876543210
{  
for(k = 0;k < c;k++) //是否与前面数字重复,如有重复元素跳出,否则使K下标等于C下标                                 
if(b_val[k] == b_val[c])                                                    
break;
   
if(k == c)//如果没有重复元素,就可以确定当前元素值,并继续排列下一个下标的数组元素
{
if(c+1 < m) //1 2 3...7 8   如果不满足条件,则生成了一组排列方式,否则继续排列下一个元素
           //          8
{   
++c; //1 2 3...7 8
//          8
b_val[c] = -1;
//   continue;
}
else  //生成了一组排列方式
{
k = -1;
for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
{
p[i][j] = a[b_val[++k]];//a[0]-a[8]
}
}

}

//判断是否为n阶魔方阵
if(Judge(p,n))
{
printA(p,n);
}
}
}
}
else
{
c--;
}
}

输出截图:

delete []b_val;
}
void evaluate(int **p,int n)//给n阶方阵的元素赋值
{
int i;

图片 2

int *AllNum = new int[3*3];
for(i = 1;i <= n*n;i++)
{
AllNum[i - 1] = i;
}

通过以上的两次输出截图比较可知,系统分配给程序的内存是动态内存,只要首先找到的一段内存可以满足程序的需求,就有可能被分配给相应的程序。

combination(p,n,AllNum);

*******************************

delete []AllNum;
}
void main()
{
int i,n,**a;
string s;

步骤2、二维字符数组的研究

do
{
//输入n阶方阵的阶数n
cout<<"请输入n阶方阵的阶数n(退出程序按e或E键):";
cin>>s;

分为两种情况,

if(!strcmp(s.c_str(),"e") || !strcmp(s.c_str(),"E"))
{
break;
}
else if(s.find_first_not_of("0123456789") != string::npos)
{
cout<<"请输入有效的数字,不能含有非数字的字符。"<<endl;

情况一、在每一维字符数组中不使用字符串截止符 “”,

continue;
}
else
{
n = atoi(s.c_str());

#include "iostream"

if(n < 1)
{
cout<<"请输入有效的数字,必须 >= 1。"<<endl;

using namespace std;

continue;
}

int main(void)

//分配内存
a = new int*[n];
for(i = 0; i < n; i++)
{
a[i] = new int[n];
}

{

cout<<"正在运算,请等待。。。。。。"<<endl;

char scar[3][6]={{'1','2','3','4','5','6'},{'2','3','4','5','6','7'},{'3','4','5','6','7','8'}};//二维字符数组

//给n阶方阵的元素赋值
evaluate(a,n);

for(int i=0;i<3;i++)

cout<<"运算结束!"<<endl;

{

for(i = 0; i < n; i++)
{
delete []a[i];
}
delete []a;
}
}while(1);

cout<<scar[i]<<endl;

return;
}

for(int j=0;j<6;j++)

/* 5、求一个3x3矩阵对角线元素之和。*/
#include<iostream.h>
int dia(int a[][3]);
void main()
{
int i,j,sum,a[3][3]={2,3,5,6,2,3,1,9,0};
cout<<"a= ";
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
cout<<a[i][j];
cout<<endl<<"   ";
}
sum=dia(a);
cout<<"nsum="<<sum<<endl;
}
int dia(int a[3][3])
{
int i,j,sum=0;
for(i=0;i<3;i++)//主对角线之和
for(j=i;j<=i;j++)
sum+=a[i][j];
for(j=0;j<3;j++)//另一个对角线之和
for(i=2-j;i<=2-j;i++)
if(i!=j)//避免重复累加两个对焦向重合的元素
sum+=a[i][j];
return sum;//返回对角线员素之和
}

{

/* 6、编写一个程序,将字符数组s2中的全部字符拷贝到字符数组s1中。不用strcpy函数。拷贝时,‘’也要拷贝过去。 ‘’后面的字符不拷贝。*/
#include<iostream.h>
void scopy(char a[],char b[]);
void main()
{
int i;
char a[10];
char b[10]="Hello";
scopy(a,b);
for(i=0;a[i]!='';i++)
cout<<a[i];
cout<<endl;
}
void scopy(char a[],char b[])
{
int i;
for(i=0;b[i]!='';i++)
{
a[i]=b[i];
}
a[i]='';
}

  cout<<scar[i][j]<<endl;//这里输出的是每行的元素

/* 7、用筛选法求100之内的素数。(所谓素数就是除了1和它本身以外,不能再被别的整数整除,这种数称作素数(也称质数)。)*/
#include<iostream.h>
void main()
{
int i,j;
for(i=1;i<=100;i++)
{
for(j=2;j<i;j++)//判断素数
if(i%j!=0);
else break;//不是素数
if(i==j)//相等为素数
cout<<" "<<i;
}
cout<<endl;
}

}

/* 8、用选择法对10个整数排序。*/
#include<iostream.h>
void csort(int a[10]);
void main()
{
int i;
int a[10]={6,4,2,7,9,0,1,6,3,0};
for(i=0;i<10;i++)//输出原数组数据顺序
cout<<a[i];
cout<<endl;
csort(a);
for(i=0;i<10;i++)//输出排序后的顺序
cout<<a[i];
cout<<endl;
}
void csort(int a[10])//排序
{
int i,j,k,temp=0;
for(i=1;i<10;i++)
{
k=i;
for(j=k+1;j<10;j++)//找出最小数的数组下标
if(a[k]>a[j])k=j;
if(k!=i)
{
temp=a[i];//把数放到正确位置
a[i]=a[k];
a[k]=temp;
}
}
}

}

第6章   指针

return 0;

/* 1、在主函数中输入10个字符串。用另一函数对它们排序。然后在主函数输出这10个已排好序的字符串。(用指针实现)*/
#include<iostream.h>
void psort(int *p);
void main()
{
int i,a[10];
cout<<"please input ten numbers:n";
for(i=0;i<10;i++)
cin>>a[i];
psort(a);
cout<<"resort result=";
for(i=0;i<10;i++)
cout<<a[i]<<" ";
}
void psort(int *p)
{
int i,j,temp;
for(i=0;i<10;i++) //每循环一次确定数组中一个数的位置
for(j=i+1;j<10;j++) //每次循环对比一个数的大小
{
if(p[i]>p[j])
{
temp=p[j];
p[j]=p[i];
p[i]=temp;
}
}

}

}

输出如下:

/* 2、输入一个字符串,内有数字和非数字字符,如A123x456 1233?8997jhlkll
将其中连续的数字作为一个整数,依次存放到一数组a中,统计共有多少个整数,并输出这些数。*/
#include<iostream.h>
#include<string.h>
#include <windows.h>
int charge(int *,char *);
void main()
{
int a[50],i,numb;
char b[50];
cout<<"please input a character string:"<<endl;
cin.getline(b,50);
system("cls");
cout<<"your character string is ";
cout.write(b,strlen(b))<<endl;
numb=charge(a,b);
for(i=0;i<numb;i++)
cout<<" a["<<i<<"]="<<a[i];
cout<<endl<<"total numbers="<<numb<<endl;
}
int charge(int *q,char *p)//*q指向新数组,*p指向初始数组
{
int numb=0;
for(;*p!='';p++)//判断每个字符
{
if(*p>='0'&&*p<='9')
{
*q=(*p)-'0';//将字符型整数转换成整型整数赋值给新数组
p++;
while(*p>='0'&&*p<='9')//判断是否有连续字符型整数
{
*q=(*q)*10+((*p)-'0');//将连续字符型整数转换成一个整型整数赋值给新数组
p++;
}
q++;
numb++;//统计整数的个数
}
}
return numb;
}

图片 3

/* 3、用指向指针的指针的方法对5个字符串排序并输出。*/
#include <iostream.h>
#include <string.h>
void sort(char **str);
void main()
{
int i;
char *string[5];
cout<<"输入5个字符串:"<<endl;
for(i=0;i<5;i++)
{
string[i] = new char[10];
cin.getline(*(string+i),50);
}
sort(string);
for(i=0;i<5;i++)
delete [] string[i];
}
void sort(char **str)
{
int i=0,j;
char *p=0;
for(i=0;i<4;i++)
{
for(j=i+1;j<5;j++)
{
if(strcmp(*(str+i),*(str+j))<0)
{
p=*(str+i);
*(str+i)=*(str+j);
*(str+j)=p;
}
}
}
cout<<"after sort the chars :"<<endl;
for(i=0;i<5;i++)
{
cout<<*(str+i)<<endl;
}
}

可以看出,第一次运行语句"cout<<scar[i]<<endl;"的时候输出的是全部的字符,直到最后遇见截止符“”才停止输出,在这里每个“scar[i]”,是相应的一维数组的指针。

/* 4、统计一字符串在另一个字符串中出现的次数。*/
#include<iostream.h>
#include<string.h>
int change(char *,char *);
void main()
{
int sum;
char a[10]="dog";
char b[20]="sdlkdogsddydodog";
cout.write(a,10)<<endl;
cout.write(b,20)<<endl;
sum=change(a,b);
cout<<"sum="<<sum<<endl;
}
int change(char *p,char *q)
{
    int sum=0,i=0;
while(*q!='')
{
while(*p==*q&&*p!='')//对比是否含有相等字符串
{
*p++;
*q++;
i++;
}
if(*p=='')
{
sum+=1;//含有字符串个数
}
p=p-i;//第一个字符串重新定位
q=q-i;//第二个字符串重新定位
i=0;//重新累加移动次数
q++;
}
return sum;
}

情况二,在每个一维数组中使用字符串截止符“”

/* 5、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数.n和m从键盘输入。*/
#include<iostream.h>
#include<string.h>
void charge(int a[],int,int);
void main()
{
int i,n,m,a[50];
cout<<"请输入n的值:";
cin>>n;
cout<<"请输入移动位数:";
cin>>m;
cout<<"请输入整数:";
for(i=0;i<n;i++)
{
cin>>a[i];
}
cout<<"您输入的整数为:";
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
charge(a,n,m);
cout<<"移动后的整数为:";
for(i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
void charge(int a[],int n, int m)//n为整数个数,向右移动m个位置
{
int i,j;
for(j=0;j<m;j++)//移动m个位置
{
for(i=n-1;i>=0;i--)//移动一个位置就要移动每一个数组元素
{
a[i+1]=a[i];
}
a[0]=a[n];
}
}

#include "iostream"

/* 6、有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。*/
#include<iostream.h>
void change(int a[],int n);
void main()
{
int i,a[50],n;
cout<<"输入人数:";
cin>>n;
for(i=0;i<n;i++)
a[i]=i+1;
change(a,n);
}
void change(int a[],int n)
{
int qnumber=0,i=0,k=0;
while(n-qnumber>1)//直到只剩下1人时
{
if(a[i]!=0)k++; //报数
if(k==3)
{
a[i]=0; //退出圈子的人
qnumber++; //退出的总人数
k=0; //重新开始报数
}
i++;
if(i==n)i=0; //当所有人都报过数之后重新每人再次报数
}
for(i=0;i<n;i++)
if(a[i]!=0)cout<<a[i]<<" ";
}

using namespace std;

/* 7、写一函数,实现两个字符串的比较。即自己写一个strcmp函数。*/
#include<iostream.h>
#include<string.h>
int change(char *,char *);
void main()
{
int result;
char a[10]="dog";
char b[20]="sdlkdogsddydodog";
cout.write(a,10)<<endl;
cout.write(b,20)<<endl;
result=change(a,b);
cout<<"result="<<result<<endl;
}
int change(char *p,char *q)
{
    int sum=0,i=0,flag=0;
while(*p!=''&&*q!='')
{
if(*p>*q)
{
flag=1;//第一个字符串大于第二个字符串返回1
break;
}
if(*p<*q)
{
flag=-1;//第二一个字符串大于第一个字符串返回-1
break;
}
if((*p==*q)&&*(p+1)==''&&*(q+1)!='')
{
flag=-1;//第二一个字符串大于第一个字符串返回-1
break;
}
*p++;
*q++;
}
return flag;
}

int main(void)

/* 8、将一个5 x 5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。*/
#include<iostream.h>
void psort(int a[]);
void main()
{
int i;
int a[25]={5,3,52,6,2,1,8,0,23,56,7,21,23,4,57,62,15,31,45,6,43,78,12,53,41};
for(i=0;i<25;i++)
{
cout<<" "<<a[i];
}
cout<<endl;
psort(a);
}
void psort(int a[])
{
int i,j,k=0,temp,b[5][5];
for(i=0;i<25;i++) //每循环一次确定数组中一个数的位置
for(j=i+1;j<25;j++) //每次循环对比一个数的大小
{
if(a[i]>a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
b[i][j]=a[k++];
}
temp=b[4][4]; //确定5个位置的数值
b[4][4]=b[2][2];
b[2][2]=temp;
temp=b[0][1];
b[0][1]=b[0][4];
b[0][4]=temp;
temp=b[0][2];
b[0][2]=b[4][0];
b[4][0]=temp;
temp=b[0][3];
b[0][3]=b[4][4];
b[4][4]=temp;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
cout<<"t"<<b[i][j];
}
cout<<endl;
}
}

{

第7章 结构体与共用体

char scar[3][7]={{'1','2','3','4','5','6',''},{'2','3','4','5','6','7',''},{'3','4','5','6','7','8',''}};//二维字符数组

/* 1、用指针和结构体实现一双向链表,并实现其相应的增、删、遍历功能,并在实例中应用它。*/
#include <iostream.h>

for(int i=0;i<3;i++)

typedef struct node
{
int number;

{

struct node *next;
struct node *parent;
}Node,*LinkNode;

cout<<scar[i]<<endl;

class LinkClass
{
public:
LinkNode first,current;//头指针,当前指针
void init();//初始化函数
LinkNode Insert(int data,LinkNode cur);//插入函数
void Remove(LinkNode p);//删除函数
void Prior(LinkNode head);//遍历函数
};

for(int j=0;j<6;j++)

void LinkClass::init()
{
struct node *head=new struct node;
struct node *tail=new struct node;

{

head->parent=NULL;
head->next=tail;
tail->parent=head;
tail->next=NULL;
first=current=head;
}

  cout<<scar[i][j]<<endl;//这里输出的是每行的元素

LinkNode LinkClass::Insert(int data,LinkNode cur)
{
struct node *newNode=new struct node;
newNode->number = data;
newNode->next = cur->next;
cur->next = newNode;
newNode->parent = cur;
newNode->next->parent = newNode;
cur=newNode;
return cur;
}

}

void LinkClass::Prior(LinkNode head)
{
LinkNode cur=head->next;
while(cur->next!=NULL)
{
cout<<cur->number<<" ";
cur=cur->next;
}
cout<<""<<endl;
}

}

void LinkClass::Remove(LinkNode cur)
{
LinkNode temp=cur;
temp->parent->next=temp->next;
temp->next->parent=temp->parent;
delete(temp);
}

return 0;

void main()
{
LinkClass lc;
lc.init();
LinkNode cur=lc.current;
for(int i=0;i<=10;i++)//用循环来初始化结构体内的number
{
cur=lc.Insert(i,cur);//调用插入函数
}
LinkNode head=lc.first;
cout<<"没调用删除函数的遍历:"<<endl;
lc.Prior(head);//遍历函数
for(int j=0;j<=3;j++)//删除元素6
{
cur=cur->parent;
}
lc.Remove(cur);//执行删除函数
cout<<"调用删除函数后的遍历:"<<endl;
lc.Prior(head);
}

}

/* 2、用指针和结构体实现栈及其方法,并在实例中应用它。*/
#include <stdlib.h>
#include <iostream.h>

输出截图

#define STACK_INIT_SIZE 100
#define STACKIN 10

图片 4

struct stack
{
int *top;
int *base;
int stacksize;
    int initstack(stack &s)
{
s.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!s.base) return 0;
s.top=s.base;
s.stacksize =STACK_INIT_SIZE;
return 1;

通过与第一种情况截图比较,第二种情况更能准确的输出字符串,

}
int gettop(stack s,int &e)
{
if(s.top ==s.base) return 0;
e=*(s.top-1);
return 1;
}
int push(stack &s,int e)
{
if(s.top -s.base>=s.stacksize)
{
s.base=(int *)realloc(s.base,(s.stacksize + STACKIN)*sizeof(int));
if(!s.base) return 0;
s.top =s.base+s.stacksize;
s.stacksize +=STACKIN;
}
*s.top++=e;
return 1;
}
int pop(stack &s,int &e)
{
if (s.top ==s.base)return 0;
e=*--s.top;
return 1;
}
};

结论:

void main()
{
stack s;
int result,e=0;
result=s.initstack(s);
if(result==1)
cout<<"建栈成功!"<<endl;
else
cout<<"建栈失败!"<<endl;
for(int i=0;i<5;i++)
result=s.push(s,i);
if(result==1)
cout<<"初始化栈成功!"<<endl;
else
cout<<"初始化栈失败!"<<endl;
s.gettop(s,e);
cout<<"栈顶元素为:"<<e<<endl;
result=s.pop(s,e);
if(result==1)
cout<<"删除栈顶元素成功!"<<endl;
else
cout<<"删除栈顶元素失败!"<<endl;
s.pop(s,e);
cout<<"删除的栈顶元素为:"<<e<<endl;
}

第一条:通过整形二维数组和字符二维数组的输出结果截图比较可知,二维数组在内存中是连续存放的,每次"scar[i]"指向的是每个一维数组的起始。

/* 3、编写一函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num、name、score[3],用主函数输入这些记录,用print函数输出这些记录。
   4、在上题的基础上,编写一个函数input,用来输入5个学生的数据记录。*/
#include <string.h>
#include <iostream.h>

第二条:在整形数组输出的时候“scar[i]”输出的是一个内存地址,而在二维字符数组输出的是从“scar[i]”开始往后一直到遇到字符串截止符“”为止,这样输出的时候不安全,会出现乱码,有可能形成软件漏洞。

struct student
{
public:
int num;
char name[20];
int score[3];
};

第三条:通过两种二维字符数组的输出比较,在使用多维字符数组的时候最好在一维数组中使用字符串截止符“”,这样的话会比较安全。输出的时候也比较准确。

class contral
{
public:
void print(struct student *p,int count);
int input(struct student *p,int count);
};

void contral::print(struct student *p,int count)
{
for(int i=0;i<=count;i++)
{
cout<<"Num:"<<p->num<<endl;
cout<<"Name:"<<p->name<<endl;
cout<<"JAVA:"<<p->score[0]<<endl;
cout<<"C++:"<<p->score[1]<<endl;
cout<<"English:"<<p->score[2]<<endl;
p++;
}
}

int contral::input(struct student *p,int count)
{
while(true)
{
cout<<"请输入学号:"<<endl;
cin>>p->num;
cout<<"请输入姓名:"<<endl;
cin>>p->name;
cout<<"请输入JAVA分数:"<<endl;
cin>>p->score[0];
cout<<"请输入C++分数:"<<endl;
cin>>p->score[1];
cout<<"请输入English分数:"<<endl;
cin>>p->score[2];
p++;
count++;
cout<<"输入Q退出,输入其它继续"<<endl;
char str[8];
cin>>str;
if(strcmp(str, "q")==0)
{
break;
}
}
return count;
}

void main()
{
int count=0;
contral con;
student NewS[100];
student *p=NewS;
count=con.input(p,count);
cout<<count<<endl;
con.print(p,count-1);
}

/* 5、将一个链表按逆序排列,即将链头当链尾,链尾当链头。*/
#include<iostream.h>

struct num
{
int data;
struct num *next;
};

void fan(struct num  node1[])
{

for(int i=9;i>=0;i--)
{
node1[i].next=&node1[i-1];
}
}

void main()
{
     struct num  node[10];
     for(int i=0;i<10;i++)
{
       node[i].data=i;
}
     for(int j=0;j<10;j++)
cout<<node[j].data;
     fan(node);
cout<<endl;
cout<<node[9].data;
     for(int k=9;k>0;k--)
cout<<(node[k].next)->data;
}
第8章   类和对象

/*1、自定义一个字符串处理类CString,且能实现取子串、删除子串的功能。*/
#include<iostream.h>

#define MAX_LENGTH 100

class CString
{
public:
void cpystring(char *str);
void getSubstring(int beginStr,int endStr);
void delSubstring(int beginStr,int endStr);
void print();
private:
char cstr[MAX_LENGTH];
int length;
};

#include"CString.h"
#include"string.h"

void CString::cpystring(char *str)
{
int i=0;
while(*str!='')
{
cstr[i++]=*str;
str++;
}
cstr[i]='';
}

void CString::getSubstring(int beginStr,int endStr)
{
int i,j=0;
char pstr[MAX_LENGTH];
if(beginStr<0||endStr>MAX_LENGTH||beginStr>endStr)
{
cout<<"error!"<<endl;
}
for(i=beginStr;i<endStr;i++,j++)
{
pstr[j]=cstr[i];
}
pstr[j]='';
cpystring(pstr);
}

void CString::delSubstring(int beginStr,int endStr)
{
int i,j=0;
char pstr[MAX_LENGTH];
if(beginStr<0||endStr>MAX_LENGTH||beginStr>endStr)
{
cout<<"error!"<<endl;
}
for(i=0;i<beginStr;i++,j++)
{
pstr[j]=cstr[i];
}
for(i=endStr+1;i<strlen(cstr);i++,j++)
{
pstr[j]=cstr[i];
}
pstr[j]='';
cpystring(pstr);
}

void CString::print()
{
cout<<cstr<<endl;
}

#include<iostream.h>
#include"CString.h"

main ()
{
CString str1,str2,str3;
str1.cpystring("Just like before, it's yesterday once more!");//初始化str1
str2=str1;
str3=str1;
str2.getSubstring(5,9);//截取字符串
str3.delSubstring(10,16);//删除字符串
str1.print();
str2.print();
str3.print();
}

/*2、定义一个循环队列类,且实现其相关的成员操作函数,并实例化调用之。*/
CircularQueue.h文件:
*********************************************************************
#define MAX_SIZE 101

class CircularQueue
{
private:
int queue[MAX_SIZE];
int front;
int rear;

public:
CircularQueue();
virtual ~CircularQueue();
bool isEmpty();
bool isFull();
bool push(int);
int pop();
};
*********************************************************************

CircularQueue.cpp文件:
*********************************************************************
#include "CircularQueue.h"

CircularQueue::CircularQueue()
{
front = 0;
rear = 0;
}

CircularQueue::~CircularQueue()
{

}

bool CircularQueue::isFull()
{
if ((rear+1)%MAX_SIZE == front)
{
return true;
}
else
{
return false;
}
}

bool CircularQueue::isEmpty()
{
if (rear == front)
{
return true;
}
else
{
return false;
}
}

bool CircularQueue::push(int e)
{
if (isFull())
{
return false;
}

queue[rear] = e;
rear = ++rear % MAX_SIZE;
return true;
}

CircularQueue::pop()
{
if (isEmpty())
{
return 0;
}

int e = queue[front];
front = ++front % MAX_SIZE;
return e;
}
*********************************************************************

main.cpp文件
*********************************************************************
#include "CircularQueue.h"
#include <iostream>

using namespace std;

本文由网投平台官方发布于IT之家,转载请注明出处:--整形二维数组,其各位数字立方和等于该数本身

您可能还会对下面的文章感兴趣: