菜鸟求助。一个作业题,发给老师了,至今老师没给回复。
刚学C,老师的一个作业题,要求:随机产生100~200之间的数,分别给数组a[]和数组b[],将两者排序,然后全部给数组c[],数组c[]要有序。但是我的程序有错误。后两个数不对。麻烦给找一下原因:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[10],b[10],c[20];
int A,B,aa,bb;
int i=0,j,k=0,t;
while(i<10)
{
A=rand();
if((A>=100)&&(A<=200))
{
a[i]=A;
i=i+1;
}
}
for(j=0;j<9;j++)
{
for(i=0;i<9-j;i++)
{
if(a[i]>a[i+1])
{aa=a[i];a[i]=a[i+1];a[i+1]=aa;}
}
}
while(k<10)
{
B=rand();
if(B>=100&&B<=200)
{
b[k]=B;
k=k+1;
}
}
for(t=0;t<9;t++)
{
for(k=0;k<9-t;k++)
{
if(b[k]>b[k+1])
{bb=b[k];b[k]=b[k+1];b[k+1]=bb;}
}
}
i=0;j=0;k=0;
while(k<20)
{
if(a[i]<b[j])
{c[k]=a[i];i=i+1;k=k+1;}
else
{c[k]=b[j];j=j+1;k=k+1;}
}
for(k=0;k<20;k++)
printf("%d\t",c[k]);
}
[解决办法]
for(j=0;j<9;j++)
{
for(i=0;i<9-j-1;i++)//这里有应该改成这样
{
if(a[i]>a[i+1])
{aa=a[i];a[i]=a[i+1];a[i+1]=aa;}
}
}
for(t=0;t<9;t++)
{
for(k=0;k<9-t-1;k++)//还有这里
{
if(b[k]>b[k+1])
{bb=b[k];b[k]=b[k+1];b[k+1]=bb;}
}
}
[解决办法]
程序只看了几步,由于没时间,没给你找错误了,不过就看了几步就找到你一个缺陷,你不应该让rand()的值直接赋给A,你既然要100到200之间的数,可以用rand()产生的随机数对200取模,这样得到的就是小于200的数了,然后再判断是不是大于100就可以了,照你这直接给了A后然后就判断,这样要做出多少个循环才可以产生100到200之间的数,对程序运行的时间严重增长了
[解决办法]
单步跟踪一下
[解决办法]
- C/C++ code
#include <stdio.h>#include <stdlib.h>#include <time.h>#define NUM 10void bubbleSort(int A[], int N);void merge(int *A, int *B, int *C, int N);void swap(int *a, int *b);void writedown(int *A, int N);intmain(void){ int A[NUM], B[NUM], C[2 * NUM]; srand(time(NULL)); for (int i = 0; i < NUM; i++) { A[i] = rand() % 100 + 100; B[i] = rand() % 100 + 100; } bubbleSort(A, NUM); bubbleSort(B, NUM); merge(A, B, C, NUM); writedown(A, NUM); writedown(B, NUM); writedown(C, 2 * NUM); return 0;}voidwritedown(int *A, int N){ for (int i = 0; i < N; i++) printf("%d\t", A[i]); printf("\n");}voidbubbleSort(int *A, int N){ for (int i = 0; i < N; i++) for (int j = i; j > 0; j--) if (A[j - 1] > A[j]) swap(&A[j - 1], &A[j]);}void merge(int *A, int *B, int *C, int N){ int Lpos = 0; int Rpos = 0; int k = 0; while (Lpos < N && Rpos < N) if (A[Lpos] < B[Rpos]) C[k++] = A[Lpos++]; else C[k++] = B[Rpos++]; while (Lpos < N) C[k++] = A[Lpos++]; while (Rpos < N) C[k++] = B[Rpos++];}void swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}
[解决办法]
- C/C++ code
#include "stdafx.h"#include <stdlib.h>#define RANDOM_START 100#define RANDOM_END 200#define RANDOM_MAX 10void generateRandomNumber(int* pRand, int iCount) { for (int i = 0; i < iCount; i++) { pRand[i] = int(rand() %(RANDOM_END - RANDOM_START ) )+ RANDOM_START; }}void mergerArray(int*pRand ,int* pRand1, int* pRand2){ int i = 0; int j = 0; for (; i < RANDOM_MAX; i++) { pRand[i] = pRand1[i]; } for (;i < 2 * RANDOM_MAX; i++) { pRand[i] = pRand2[j++]; }}void printResult(int* pRand, int iCount ){ for ( int i = 0 ; i < iCount; i ++){ printf("->%d\n",pRand[i]); }}void randomSort(int* pRand, int iCount){ int iTemp = 0; for ( int i = 0; i < iCount; i++) { for (int j = 0; j < iCount - i; j++) { if ( pRand[j] < pRand[j+1]) { iTemp = pRand[j]; pRand[j] = pRand[j+1]; pRand[j+1] = iTemp; } } }}int _tmain(int argc, _TCHAR* argv[]){ int arrRand1[RANDOM_MAX] = {0}; int arrRand2[RANDOM_MAX] = {0}; int arrRand3[RANDOM_MAX * 2] = {0}; generateRandomNumber(arrRand1,RANDOM_MAX); generateRandomNumber(arrRand2,RANDOM_MAX); mergerArray(arrRand3,arrRand1,arrRand2); printResult(arrRand1,RANDOM_MAX); printf("===================\n"); printResult(arrRand2,RANDOM_MAX); printf("===================\n"); printResult(arrRand3,2*RANDOM_MAX); printf("===================\n"); randomSort(arrRand3,2*RANDOM_MAX); printResult(arrRand3,2*RANDOM_MAX); return 0;}
[解决办法]
测试了一下你的程序,发现数组a和b的数据排序都很正确的。在合并的时候出现了问题,先修改如下:
- C/C++ code
#include<stdio.h>#include<stdlib.h>void main(){int a[10],b[10],c[20];int A,B,aa,bb;int i=0,j,k=0,t;while(i<10){A=rand(); if((A>=100)&&(A<=200)){a[i]=A;i=i+1;}}for(j=0;j<9;j++){for(i=0;i<9-j;i++){if(a[i]>a[i+1]){aa=a[i];a[i]=a[i+1];a[i+1]=aa;}}}while(k<10){B=rand();if(B>=100&&B<=200){b[k]=B;k=k+1;}}for(t=0;t<9;t++){for(k=0;k<9-t;k++){if(b[k]>b[k+1]){bb=b[k];b[k]=b[k+1];b[k+1]=bb;}}}i=0;j=0;k=0;while(k<20){if(a[i]<b[j] && i < 10 && j < 10){c[k]=a[i];i=i+1;k=k+1;}else if (i < 10 && j < 10){c[k]=b[j];j=j+1;k=k+1;} if (i < 10 && j >= 10) /*如果数组a中还有剩余数据*/ { c[k++] = a[i++]; } if (j < 10 && i >= 10) /* 如果数组b中还有剩余数据*/ { c[k++] = b[j++]; }} for(k=0;k<20;k++)printf("%d\t",c[k]);}