【问题标题】:How do I create a "twirly" in a C program task?如何在 C 程序任务中创建“扭曲”?
【发布时间】:2015-04-07 08:57:31
【问题描述】:

大家好,我用 C 语言创建了一个程序,它使用一个确定数字是否完美的函数来测试 1 到 10000 之间的所有数字,以检查它们是否完美。一旦找到这些,它就会将它们打印给用户,它们是 6、28、496 和 8128。在此之后,程序会将每个完美数字的所有因数打印给用户。这一切都很好。这是我的问题。

我任务的最后一部分要求我:

“使用“twirly”表示您的程序正在愉快地工作。“twirly”是以下字符按以下顺序打印在彼此的顶部:'|' '/' '-' '\'。这具有产生旋转轮的效果 - 即“旋转”。提示:要做到这一点,您可以在 printf 中使用 \r(而不是 \n)来只给出回车(而不是回车换行)。(注意:这在某些系统上可能不起作用 - 您不必这样做。)“

我不知道什么是 twirly 或如何实现它。我的导师说这与我也不知道如何使用的睡眠和延迟功能有关。谁能帮我完成最后一个阶段,我的所有编码都完成了,但我无法让这个“扭曲”的东西工作。

【问题讨论】:

标签: c function factors perfect-numbers


【解决方案1】:

如果要同时执行的任务

  1. 测试数字和
  2. 在屏幕上显示旋转

    在进程继续进行时,您最好考虑使用线程。使用 POSIX 线程,您可以在一个线程上启动任务,而另一个线程将在终端上向用户显示 twirly。

#include<stdlib.h>

#include<pthread.h>

int Test();

void Display();

int main(){
// create threads each for both tasks test and Display
//call threads
//wait for Test thread to finish
//terminate display thread after Test  thread completes
//exit code
}

有关线程,请参阅第 12 章 beginning linux programming ebook

【讨论】:

    【解决方案2】:

    鉴于用户正在“等待”的程序,我认为上述问题以及使用sleep() 或线程的解决方案是错误的。

    在现代个人计算机上使用 C 生成所有低于 10,000 的完美数字大约需要 1/10 秒。因此,任何显示计算机“愉快地工作”的设备要么永远不会被看到,要么会显着影响完成工作所需的时间。

    但是无论如何,让我们为完美的数字搜索做一个有效的旋转。为了简单起见,我不再打印这些因素。由于 10,000 太低而无法看到旋转的动作,因此我将限制提高到 100,000:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        const char *twirly = "|/-\\";
    
        for (unsigned x = 1; x <= 100000; x++)
        {
            unsigned sum = 0;
    
            for (unsigned i = 1; i <= x / 2; i++)
            {
                if (x % i == 0)
                {
                    sum += i;
                }
            }
    
            if (sum == x)
            {
                printf("%d\n", x);
            }
    
            printf("%c\r", twirly[x / 2500 % strlen(twirly)]);
        }
    
        return 0;
    }
    

    不需要sleep() 或线程,只需将其键入问题本身的复杂性并以合理的时间间隔进行更新。

    现在问题来了,尽管上述方法有效,但用户永远不会看到第五个完美数字出现 100,000 的限制,甚至 100,000,000 的限制,这应该会产生更多,他们可能会放弃,因为这是找到它们的糟糕(慢)算法。但他们会看到一个转折点。

    【讨论】:

      【解决方案3】:
      i as integer  
      loop i: 1 to 10000   
           loop j: 1 to i/2    
                sum as integer   
                set sum = 0  
                if i%j == 0  
                     sum+=j  
                return sum==i  
           if i%100 == 0  
                str as character pointer  
                set *str = "|/-\\"  
                set length = 4  
                print str[p] using "%c\r" as format specifier   
                Increment p and assign its modulo by len to p    
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多