是不是调试窗口太小了,导致只能显示后面的!
我们可以将其再分开实现,先给数组赋值,然后再用冒泡排序给它排个序就欧克了。
void Print(int* br, int n)
{
for (int i = 0; i < n; ++i)
{
printf("%4d", br[i]);
if ((i + 1) % 10 == 0)
{
printf("\n");
}
}
}
int FindValue(int* br, int n, int val) //查询数组中的值,若随机值在数组中出现过了,返回-1.负责返回下标;
{
assert(br != nullptr);
int pos = -1;
for (int i = 0; i < n; ++i)
{
if (br[i] == val)
{
pos = i;
break;
}
}
return pos;
}
void Init_Ar(int* br, int n)
{
assert(br != nullptr);
int i = 0;
while (i < n)
{
int tmp = rand() % RANDSIZE + 1; // 1..100
if (FindValue(br, i, tmp) == -1)
{
br[i] = tmp;
++i;
}
}
}
int main()
{
const int n = 100;
int ar[n] = {};
Init_Ar(ar, n);
Print(ar, n);
return 0;
}
这个程序,我们一个一个查询数组中的值,看是否有过重复,在Findvalue中,for循环一直是从0开始,一个一个查询,这样时间复杂度很高,我们想,有没有一种方法使得只查询一次就好,不需要每次都从0开始,所以我们下面就用到了查表法;
也就是,我们新定义一个数组table,因为我们要1…100,所以数组大小为101,可以取到下标100,然后我们取个随机值,判断这个随机值作为table里的下标看其值否为0,为0的话,我们把这个随机值给数组br,然后让其下标里的值变为1,(我们初始化table里的值都为0),之后继续进行判断,为0的话我们继续赋值,为1的话我们进入循环再取随机值。
void Init_Ar2(int* br, int n)
{
assert(br != nullptr);
int i = 0;
int table[ARSIZE + 1] = {};
while (i < n)
{
int tmp = rand() % RANDSIZE + 1;
if (table[tmp] == 0)
{
br[i] = tmp;
++i;
table[tmp] = 1;
}
}
}
下面我们把冒泡排序加进去:
void Swap_Int(int* ap, int* bp)
{
assert(ap != nullptr && bp != nullptr);
int tmp = *ap;
*ap = *bp;
*bp = tmp;
}
void BubbleSort(int* br, int n)
{
assert(br != nullptr);
for (int i = 1; i < n; ++i)
{
bool tag = true;
for (int j = 0; j < n - i; ++j)
{
if (br[j] > br[j + 1])
{
Swap_Int(&br[j], &br[j + 1]);
tag = false;
}
}
if (tag) break;
}
}
/*我们多加了一个标记tag,这样就可以使其更完善,比如我们排序的数字中,只有第一个和第二个需要排序,后面的都是顺序的,我
们就不需要再进行循坏排序了,这会我们在循坏开始时,定义个状态bool类型的tag为true,当交换后就让其变为false,然后下面
如果tag保持true的话,说明我们这一趟都没有排序(以及排好了),所以就直接退出就好了,不需要在进行下一趟的排序检测。*/
#include<stdio.h>
#include<stdlib.h> // rand;
#include<assert.h>
#define RANDSIZE 100
#define ARSIZE 100
void Print(int* br, int n)
{
for (int i = 0; i < n; ++i)
{
printf("%4d", br[i]);
if ((i + 1) % 10 == 0)
{
printf("\n");
}
}
}
void Init_Ar2(int* br, int n)
{
assert(br != nullptr);
int i = 0;
int table[ARSIZE + 1] = {};
while (i < n)
{
int tmp = rand() % RANDSIZE + 1;
if (table[tmp] == 0)
{
br[i] = tmp;
++i;
table[tmp] = 1;
}
}
}
void Swap_Int(int* ap, int* bp)
{
assert(ap != nullptr && bp != nullptr);
int tmp = *ap;
*ap = *bp;
*bp = tmp;
}
void BubbleSort(int* br, int n)
{
assert(br != nullptr);
for (int i = 1; i < n; ++i)
{
bool tag = true;
for (int j = 0; j < n - i; ++j)
{
if (br[j] > br[j + 1])
{
Swap_Int(&br[j], &br[j + 1]);
tag = false;
}
}
if (tag) break;
}
}
int main()
{
const int n = 100;
int ar[n] = {};
Init_Ar2(ar, n);
Print(ar, n);
return 0;
}
问题:
您好,我遇到了一个问题,希望能得到您的帮助。我的程序是循环打印1到100的数字,但是在运行过程中,我发现程序会在打印到72时中断,后面的数字压根不打印了。我不理解这个问题是因为我的电脑运行不起来这个庞大的程序,还是因为程序运行太快前面就没来得及打印。请问这个问题该如何解决?谢谢!
回答:
为了提高问题的可读性,可以这样回答:
您好,根据您的描述,我猜测您的代码可能存在某些问题,导致程序仅打印出1到72的数字。为了确定问题的具体原因,我们需要进一步调试代码。可以尝试在循环内部加上打印语句,以便观察程序的执行情况。比如:
for(int i=1; i<=100; i++){ printf("%d ", i); //添加的打印语句 if(i % 10 == 0){ printf("\n"); //每10个数字换行 } }
另外,如果在循环内部进行比较复杂的计算或操作,可以考虑加入一些延时或阻塞语句,以避免程序过快完成。比如:
... for(int i=1; i<=100; i++){ printf("%d ", i); fflush(stdout); //清空输出缓存 if(i % 10 == 0){ printf("\n"); } usleep(100000); //延时100ms }
希望这些方法能够帮助您更好地调试程序。
您好,感谢您使用我的服务。如果我理解正确,您的程序可以顺利地打印1到71的数字,但在打印到72时就停止了,后面的数字就没有打印出来。请问是这样吗?
回答:
是的,您理解得非常准确。目前您所说的问题我也遇到过,并且我非常乐意为您解答。
您的问题描述中没有给出具体的编程语言和代码示例,这给我理解您的问题带来了困难。请问您的程序使用的是什么编程语言?能否提供一些程序的代码或者更多的信息,例如是否有报错信息等,这有助于更好地理解您的问题。谢谢!
回答:
抱歉,由于我并不知道您具体使用的编程语言,无法针对您的问题提出有效的解决方案。我建议您提供更多的详细信息,比如可执行代码、出现问题的错误提示等,这将更有利于我们帮助您解决问题。如果您需要更进一步的帮助,欢迎继续咨询。