c - ANSI C : Creating an Array of Jobs

标签 c

所以,我们有这个基于上周的家庭作业。我们应该创建单独的数组来保存指向特定工作类型的所有人的指针。这是我到目前为止的代码。我想知道是否有人可以帮助我。谢谢!

#include <stdio.h>
#include <stdlib.h>
#include "Person.h"
#include "data.h"
#define new

char * randomVal(char * arr[], int elements)
{
    int value = (int)(rand() % elements);
    char * name = arr[value];
    return name;
}

int main (int argc, const char * argv[]) 
{
    Person * Population[100];
    int i;
    for (i = 0; i < 100; i++)
    {
        Population[i] = new person(randomVal(Names, 10), randomVal(Vehicles, 5), randomVal(Jobs, 5), randomVal(Job_Pace, 3), randomVal(Education, 4), randomVal(Work_Ethic, 3), randomVal(Sleep_Habits, 3));
        Population[i]->print(Population[i]);
    }
    for (i=0; i<100; i++) {
        destroy(Population[i]);
    }
    //Person * p1 = new person(randomName(), "Camero", "Lawyer", "Fast", "Doctorate", "Poor", "Poor");
    //p1->print(p1);


    return 0;
}


/*
 *  Person.h
 *  Person2
 *
 *  Created by Tracie Marshall on 10/15/09.
 *  Copyright 2009 Me. All rights reserved.
 *
 */

typedef struct
{
    //data
    //dynamic sized vars
    char * name;
    char * vehicle;
    char * job;
    char * job_pace;
    char * education;
    char * work_ethic;
    char * sleep_habits;

    //static-sized vars
    double bank_account;
    int leadership;
    int IQ;
    int aggro;
    int outfit;
    int alertness;

    //methods
    void (*print)(void *);
} Person;

Person * person(char * n, char * v, char * j, char * jp, char * ed, char * w, char * s);
void printPerson(Person* p);
void destroy(Person * p);

/*
 *  Person.c
 *  Person2
 *
 *  Created by Tracie Marshall on 10/15/09.
 *  Copyright 2009 Me. All rights reserved.
 *
 */

#include <string.h>
#include <stdlib.h>
#include "Person.h"
#include <stdio.h>

char * newString(char * dest, char * source)
{
    dest = (char *)malloc((strlen(source) + 1) * sizeof(char));
    strcpy(dest, source);
    return dest;
}

void printPerson(Person* p)
{
    printf("\n%s:\n\tvehicle:\t%s\n\tjob:\t\t%s\n\tjob pace:\t%s\n\teducation:\t%s\n\twork ethic:\t%s\n\tsleep habit:\t%s", p->name, p->vehicle, p->job, p->job_pace, p->education, p->work_ethic, p->sleep_habits);//, p->age, p->job, p->spouse);
}

Person * person(char * n, char * v, char * j, char * jp, char * ed, char * w, char * s)
{
    //allocate self
    Person * p = (Person *) malloc(sizeof(Person));

    //allocate dynamic variables on stack
    p->name = newString(p->name, n);
    p->vehicle = newString(p->vehicle, v);
    p->job = newString(p->job, j);
    p->job_pace = newString(p->job_pace, jp);
    p->education = newString(p->education, ed);
    p->work_ethic = newString(p->work_ethic, w);
    p->sleep_habits = newString(p->sleep_habits, s);

    //initalize static-size variables
    p->bank_account; // = ba;
    p->IQ;
    p->aggro;
    p->outfit;
    p->alertness;

    //initialize function pointers
    p->print = &printPerson;

    return p;
}
void destroy(Person * p)
{
    free(p->name);
    free(p->vehicle);
    free(p->job);
    free(p->job_pace);
    free(p->education);
    free(p->work_ethic);
    free(p->sleep_habits);

    free(p);
}

/*
 *  data.h
 *  Person2
 *
 *  Created by Tracie Marshall on 10/15/09.
 *  Copyright 2009 Me. All rights reserved.
 *
 */

char * Names[10] = {"Lisa", "Pamela", "Amanda", "Gerard", "Dan", "Patrick", "Peter", "Michael", "Sally", "Tracie"};
char * Vehicles[5] = {"Feet", " Old Bike","New Bike", "Cheap Car", "Expensive Car"};
char * Jobs[5] = {"Unemployed", "Burger World", "Junior Programmer", "Senior Programmer", "Academia"};
char * Job_Pace[3] = {"Easy Going", "9-5 Grind", "Whirl Wind"};
char * Education[4] = {"Bum", "High School", "College", "Graduate School"};
char * Work_Ethic[3] = {"Drifter", "Hard Worker", "Workaholic"};
char * Sleep_Habits[3] = {"Good", "Medium", "Poor"};

最佳答案

我不确定你的问题是什么,但我会在你更新问题时尝试更新我的答案。

需要注意的一件事是您正在使用 C++(或 C99)风格的注释(//comment here)。如果您使用严格的 ANSI C90 支持进行编译,那么这将失败。另外,不要转换 malloc 的返回值(这源于一个非常古老的问题,在 C90 及更高版本的编译器中不存在)。

另外,这不是 ANSI C。你有这一行:

Population[i] = new person(randomVal(Names, 10), ... /* snipped for brevity */

ANSI C 中没有“new”关键字。这甚至不是 C++ 的正确语法(乍看之下,您似乎可以删除 newperson() 函数返回正确的东西)。

编辑

好的,这是对评论的回应。您可以通过很多方法来做到这一点。一种简单的方法是为可以从事特定工作的人数设置限制。然后,您可以创建一个与 Jobs 数组大小相同的数组,并且这个新数组中的每个索引(例如 HasJob)都可以与 Jobs 数组中的索引相匹配。因此,HasJob[0] 可以存储每个拥有“Unemployed”工作的 Person。您可以为每个 HasJob 条目保留一个单独的计数,这样当您插入时,您知道将新的 Person 对象粘贴到哪里,或者您可以将所有值初始化为 NULL,然后每次插入时,进行线性搜索。

所以你可以:

/* 5 is the number of possible Jobs and 100 is the max persons per job */
Person *HasJob[5][100];

memset(HasJob, 0, 5*100*sizeof(Person *));

现在,您可以通过执行以下操作将每个 Person 插入到 HasJob 数组中

int i, j, k;
for(i=0; i < 5; i++)
{

  for(j=0; j < 100; j++)
  {

    if(strcmp(Population[j]->job, Jobs[i]) == 0)
    {
      k = 0;
      while(((p = HasJob[i][k]) != NULL) && (k < 100) k++;
      if(k != 100) /* if k == 100, somehow too many persons have this job */
      {
        HasJob[i][k] = Population[j];
      }

    }

  }

}

所以,我还没有尝试编译它,可能会有一些问题,但这是这种方式的一般过程。从本质上讲,您要检查每份工作,然后针对每份工作检查每个人;如果那个人在那个工作中,在 HasJob 中找到一个空位并将那个人放在那里。

同样,有很多方法可以做到这一点。您可以为每个作业保留一个计数,然后您就不必进行线性扫描,但这种方法使您不必跟踪和实例化这些变量。另一种方法是使用链表。这可能会给你一个想法。当然,您应该为每个常量值使用 #define(最大值,例如 5 和 100 可以是 MAX_JOBSMAX_PERSONS 等)。

关于c - ANSI C : Creating an Array of Jobs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581041/

相关文章:

c - Gcc 使用 sqrt 而不包含 math.h

c - LPC1788 启动文件中缺少 SystemInit 函数?我在哪里可以找到它?

c - 如果 mmap 比传统文件访问更快,我们在哪里看到节省的时间?

c - 使用两个结构C编程的单链表插入函数

c - 这是C中的定义吗?

c - 是否可以找到大写字母并将其替换为小写?

c - 为结构成员生成随机字符串

arrays - 在谈论字符指针数组时,char *[] 和 char ** 之间的关系是什么

c - Queue中的node_add,只插入前3个作为前中后

c++ - bool判断这么慢?