Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用指针的C编程队列_C_Email - Fatal编程技术网

不使用指针的C编程队列

不使用指针的C编程队列,c,email,C,Email,大家好,我是这个网站的新手。。 我的问题如下 队列通常用于网络系统中。例如,放置电子邮件 在队列中等待发送时以及到达收件人的邮箱后 邮箱但是,如果传出邮件处理程序无法处理,则会出现问题 发送队列中的一个或多个消息。例如,一条消息可能会 无法发送,因为收件人的系统不可用。 编写一个电子邮件模拟器,平均处理40封邮件 每分钟。当收到消息时,它们被放入队列中。 对于模拟,假设消息到达的平均速率为 每分钟30条信息。记住,消息必须随机到达, 因此,您需要使用随机数生成器来确定何时发送消息 收到后,请参见

大家好,我是这个网站的新手。。 我的问题如下

队列通常用于网络系统中。例如,放置电子邮件 在队列中等待发送时以及到达收件人的邮箱后 邮箱但是,如果传出邮件处理程序无法处理,则会出现问题 发送队列中的一个或多个消息。例如,一条消息可能会 无法发送,因为收件人的系统不可用。 编写一个电子邮件模拟器,平均处理40封邮件 每分钟。当收到消息时,它们被放入队列中。 对于模拟,假设消息到达的平均速率为 每分钟30条信息。记住,消息必须随机到达, 因此,您需要使用随机数生成器来确定何时发送消息 收到后,请参见第175页开始的“队列模拟”。 每分钟,您最多可以将40条消息排出来并发送它们。 假设队列中25%的消息无法在任何处理中发送 周期同样,您需要使用一个随机数来确定 是否可以发送给定的消息。如果无法发送,请将其放回 队列的末尾将其排队。 运行模拟24小时,跟踪每次运行的次数 消息必须重新发出。在模拟结束时,打印统计信息 这表明: A.已处理的邮件总数 B平均到达率 C平均每分钟发送的邮件数 D一分钟内队列中的平均消息数 E第一次尝试发送的消息数,第一次尝试发送的消息数 第二次尝试,等等 F必须重新查询消息的平均次数不允许 在此平均值中包括首次发送的邮件

然而,由于我的C语言基础薄弱,我创建了自己的算法,我想我可以做到这一点。。。这是我的算法

//我自己的算法来做这个问题

声明40个元素用作邮件示例:等待列表中的40封邮件将发送到队列中 已发送输出电子邮件[1] 1.随机生成邮件成功发送还是nt 2.使用randomnum%4,如果余数=0,1,2成功,否则失败 如果失败,请重新查询邮件 统计资料 1.运行程序一次,及时发送所有数据,如msg,然后*24 2.获取所有消息成功发送的时间,然后获取24小时的统计数据 2.在屏幕上输出数据 资料 -及时发送消息,然后*24以获取24小时数据 -24小时内发送的消息数,每分钟更改一次

这是我现在的工作 //我的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 500

int queue_array[MAX];
int rear=-1;
int front=-1;
void insert(int add_item);
void delet(int add_item);
void display();

int main()
{
    int element[40],i,j;
    srand(time(NULL));
    for (i=0;i<40;i++)
    {       
        element[i]=rand();
        insert(element[i]);
        j=element[i]%4;
        if (j==3)
        {
        printf(" Mail failed to send. \n");
        delet(element[i]);
        insert(element[i]);
        }
        else
        printf(" Mail success to send.\n",j);
        delet(element[i]);
    }
    display();
    return 0;
}

void insert(int add_item)
{
    if(rear==MAX-1)
    {
    printf("Queue Overflow \n");
    }
    rear=rear+1;
}

void delet(int)
{
    if (front==-1 || front>rear)
    {
        printf(" There is no mail in queue now. \n");
        return;
    }
    else
    {
        front=front+1;
    }
}

void display()
{
    int i;
    if(front==-1)
    {
    printf(" All the email in queue have been sent.\n");
    }
    else
    {
        printf("Queue is : \n");
        for (i=front;i<=rear;i++)
        printf("%d",queue_array[i]);
        printf("\n");
    }
}

那里有一些奇怪的事情,可能是因为它们,程序无法运行。首先,正如Joachim Pileborg所说,我引用main函数必须像往常一样声明,并显式返回一个int。这意味着它应该至少是int main,而不仅仅是main。 第二个原因是,如果您当然希望使用传递给该函数的值,那么void insertint函数可能应该是void insertint add_item。同样的事情也适用于void deletint。 第三种方法是在初始化元素[i]之前使用它。在代码中,第一个insertelement[i]被调用,但此时整个数组元素[i]未初始化。它仅在下一行用元素[i]=rand初始化。总之,这部分代码

    insert(element[i]);
    element[i]=rand();
应该看起来像

    element[i]=rand();
    insert(element[i]);
void insert(int add_item)
{
    if(rear==MAX-1)
第四实际上来自第二和第三。void insertent函数不会对传递的值执行任何操作。相反,它将未初始化的int值添加到队列数组中。添加到队列_数组的int add_项实际上未连接到传递的值,并且在添加到队列_数组之前未对其进行初始化。我猜您想添加一个传递给函数的值,所以正如我所说的,void insertint实际上必须是与void insertint add_item类似的东西。另外,如果我先前关于insert的假设是正确的,那么您不需要int add_项;函数内部。总之,这部分代码

void insert(int)
{
    int add_item;
    if(rear==MAX-1)
应该看起来像

    element[i]=rand();
    insert(element[i]);
void insert(int add_item)
{
    if(rear==MAX-1)
ifrear==MAX-1 check也有问题-现在您的程序将输出一条关于队列溢出的警告消息,并且仍然尝试将另一个元素添加到队列数组,这将导致失败,因为队列数组没有更多的元素。简单地说,这意味着它将尝试将add_item elemet放入队列数组[500],但将失败,因为队列数组[500]不存在。所以可能这部分代码

if(rear==MAX-1)
printf("Queue Overflow \n");
应该看起来像这样

if(rear==MAX-1)
{
  printf("Queue Overflow \n");
  return;
}
目前,deletint函数根本不做任何事情。它不删除任何元素,只修改前变量。如果它应该这样做,尽管我强烈认为这有点错误,那么您不必将任何值传递给deletint,这实际上意味着它应该看起来像delet。但这是一个很大的假设

从理论上讲,void display函数似乎还不错,至少在修复所有其他问题时,它应该能够以某种方式工作

拉斯维加斯 事实上是这样的,我不确定你们是否真的需要前置变量。如果您想为您的消息构建一个FIOFFIRST in,first out队列,那么可以只使用rear变量来完成,尽管这并不简单


最后,我建议在纸上画出您希望在调用insert和delete函数时在queue_数组上发生的事情,并从头开始编写它们。该图实际上将帮助您了解插入和删除函数应该做什么,以及它们应该如何做。

我做了一些修复,其中一些是我指出的。下面的代码将编译并运行,但我仍然不知道它的输出是否是所需的

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MAX 500

int queue_array[MAX];
int rear=-1;
int front=-1;
void insert(int add_item);
void delet();
void display();

int main()
{
    int element[40],i,j;
    srand(time(NULL));
    for (i=0;i<40;i++)
    {
        element[i]=rand();
        insert(element[i]);
        j=element[i]%4;
        if (j==3)
        {
            printf(" Mail failed to send. \n");
            delet();
            insert(element[i]);
        }
        else
        {
            printf(" Mail [%d] was sent successfully\n",j);
            delet();
        }
    }
    display();
    return 0;
}

void insert(int add_item)
{
    if(rear==MAX-1)
    {
        printf("Queue Overflow \n");
        return;
    }
    rear=rear+1;
    queue_array[rear] = add_item;
}

void delet()
{
    if (front==-1 || front>rear)
    {
        printf(" There is no mail in queue now. \n");
        return;
    }
    else
    {
        front=front+1;
    }
}

void display()
{
    int i;
    if(front==-1)
    {
    printf(" All the email in queue have been sent.\n");
    }
    else
    {
        printf("Queue is : \n");
        for (i=front;i<=rear;i++)
        {
            printf("%d",queue_array[i]);
            printf("\n");
        }
    }
}

从技术上讲,这不是一个有效的C程序。。。main函数必须像往常一样声明并显式返回一个int,要么不带任何参数使用void,要么带一个int和一个char*[].hi@JoachimPileborg thx作为回复。。我是C语言的新手,基础很差。。现在我只想让这个程序工作>首先,非常感谢@Eugene Anisiutkin帮助改进我的编码。。我知道这有点混乱><我已经通过了你对第1、2和3部分的解释,包括void insert函数,我已经根据你的解释修改了它。。。然而,我仍然不清楚我应该如何修改我的delet函数以确保我的代码正常工作。。。顺便说一句,这是我修改后的代码。。我试图让一切更容易理解,并满足问题的要求…我已经编辑了我的编码,我把它张贴在上面。。。你能像我还没有改变的任何错误一样仔细检查它和c吗?感谢您的帮助..这些函数的修改实际上取决于您希望它们做什么。可以有几种可能的实现,但它们取决于您希望实现到这些函数中的逻辑。相信我,当我说一张纸和一支铅笔将有助于理清逻辑,之后的代码编写将更容易=我将发布一些修复作为一个单独的答案,这将允许它至少编译和不知何故runokok谢谢你…我将接受你的建议完成这项任务,再次谢谢…祝你有一个美好的一天=