{ x = rand();
if ( x<10 || x>=100 )
continue; j=0;
//舍弃相同元素 //不同元素送入数组
j++;
//取两位数的随机值
while(j<=i && a[j]!=x ) if (j>i) a[i++]=x; } }
void outAry(const int a[], int n) { cout<<\数组元素:\ for( int i=0; i int isPrime(int k) { int i; int m=int(sqrt(k)); for(i=2; i<=m; i++) if (k%i==0) return 0; return 1; } //输出数组元素 //判断k是否为素数 3.将一组数据从大到小排列后输出,要求显示每个元素及它们在原数组中的下标。 解答:略。 4.从键盘上输入一个正整数,判别它是否为回文数。所谓回文数是指正读和反读都一样的数。例如,123321是回文数。 解答: 本程序首先拆分整数的每位数字按顺序存放一个数组中。然后用两个变量记录数组元素最大和最小的下标值,它们是两个高端和低端指针。在循环中,比较这两个下标指示对称位置的元素,并使两个指针同时向中间移动(i++, j--)。只要发现一个不相等的元素,表示不是回文。直至i==j,若没有出现不相等元素,则该整数是回文。 #include { int b[10], i, j, k, flag ; long num, n ; cout << \ k = 0; n = num; do //拆分整数,把各数字放入数组b 31 { b[k++] = n % 10; n = n/10; } while( n != 0); flag=1; while(i if( b[i++] != b[j--] ) //对称位置元素不相等 { flag = 0; break ; } if( flag ) cout << num << \是回文!\ else cout << num << \不是回文!\} //判断标志 //设置指示下标的指针 i=0; j=k-1; 本题判断一个整数是否回文,可以不用数组拆分数字,直接用高位与低位数字比较。还可以把程序写成递归方式。请读者试一试。 5.把两个已升序的整型数组合并为一个升序数组。设计好你的算法,得到较高的运行效率。 解答:把两个长度为m和n的有序数组a、b归并为长度m+n的有序数组c,可以利用原数组a、b的有序性,分别用指针i和j指示数组a和b的当前元素下标,当a[i] 程序略。 6. 输入一个星期几号,输出相应的英文单词。要求使用指针数组实现。 解答: #include { char *weekday[7] = { \ \ int d; cout << \ cin >> d; if( d>=0 && d<=6 )cout << d << \ else cout << \} 7.编写函数: (1)在一个二维数组中形成如以下形式的n阶矩阵: 32 ????????123451123411123111121??1?1??1??1? (2)去掉靠边元素,生成新的n-2阶矩阵; (3)求矩阵主对角线下元素之和; (4)以方阵形式输出数组。 由main函数中调用以上函数进行测试。 解答: 本题没有指定矩阵的阶,因此应按输入要求建立动态数组。注意,C++的new运算只能申请一维动态数组,所以要按照地址公式变换成二维数组的访问形式。 另外,new返回地址保存在指针变量中,即动态数组名是间接地址。为了使函数正确在动态数组上操作,函数使用指针引用参数。 #include void create( int *&app, int n ); void del( int *&app, int *&bpp, int n ); int maindiagonal( int *&app, int n ); void output( int *&app, int ); void main() { int *ap = NULL, *bp = NULL, n; cout << \输入矩阵的阶:\ cin >> n; create( ap,n ); cout << \形成矩阵:\\n\ output( ap, n ); cout << \去掉靠边元素生成的矩阵:\\n\ del( ap,bp,n ); output( bp,n-2 ); cout << \主对角线元素之和:\} //形成n阶矩阵函数 void create( int * &app, int n ) { app = new int[ n*n ]; int i,j,k = 0; for( i=0; i 33 k++; } } //去掉靠边元素生成n-2阶矩阵函数 void del( int *&app, int *&bpp, int n ) { int i,j,k = 0; bpp = new int[ ( n-2 )*( n-2 ) ]; for ( i=0; i if ( i && j && i } } } //求主对角线元素之和函数 int maindiagonal( int *&app, int n ) { int i,j,k = 0,sum = 0; for ( i=0; i //以方阵的形式输出数组函数 void output( int *&app, int n ) { int i,j; for ( i=0; i cout << *( app + i*n + j) << '\\t'; cout< if( i==j ) sum += *( app + i*n + j); } return sum; 8.设某一城市三个百货公司某个季度销售电视机的情况和价格由如下表格表示。编写程序,每个表格数据以数组存放,求各个百货公司的电视机营业额。 34 牌号 公司 康佳 TCL 长虹 牌号 康佳 价格 3500 3300 第一百货公司 第二百货公司 第三百货公司 300 200 280 250 240 210 150 TCL 200 180 解答:略。 9.设计函数求一整型数组的最小元素及其下标。在主函数中定义和初始化该整型数组,调用该函数,并显示最小元素值和下标值。 解答:用一辅助变量,在寻找最小值的同时,记录被更新元素的下标值。程序略。 10.假设有从小到大排列的一组数据存放在一个数组中,在主函数中键入一个在该数组的最小值和最大值之间的数,并调用一函数把键入的数插入到原有的数组中,保持从小到大的顺序,并把最大数挤出。要求在主函数中输出改变后的数组。 解答: #include void insert( int a[],int,int ); void main() { int a[] = { 10, 12, 23, 25, 48, 48, 53, 58, 60, 78 }; int x,n,i; cout << \ cin >> x; n = sizeof(a)/sizeof(int); insert( a, n, x ); for( i=0; i void insert( int a[],int n,int x ) { int i,p,j; if ( x { p=i; break; } for( j=n-1; j>=p; j-- ) a[j] = a[j-1]; a[p] = x; //插入元素 //后移元素,挤出最大值 //查找插入位置 //求数组长度 //插入元素 35