2009-10-17 65 views
0

所以,我们有这个家庭作业的任务是建立在上个星期。我们应该创建单独的数组,以保存指向某个工作类型的所有人的指针。这是我迄今为止的代码。我想知道是否有人能帮助我。谢谢!ANSI 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"}; 
+6

你的问题是什么? – bdonlan 2009-10-17 00:57:48

+0

您是否收到错误?发布问题将帮助我们给你一个答案:) – 2009-10-17 01:25:51

+0

所以我创建了一个大小为100的人口,每个人都有不同的工作。我们现在需要做的就是通过所有的人,并通过他们的工作将他们存储到阵列中。因此,举例来说,所有在汉堡世界工作的人和为他们存储指向包含所有在汉堡世界中工作的人的数组的指针。我只是不太确定如何做到这一点。 – vampgirl13 2009-10-17 01:33:41

回答

3

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

需要注意的一件事是您正在使用C++(或C99)样式注释(//comment here)。如果您正在编译严格的ANSI C90支持,那么这将会失败。此外,不要投下malloc(这源于C90及以上编译器中不存在的一个非常古老的问题)的回报。

而且,这不是ANSI C.你有这样一行:

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

有ANSI C中没有“新”的关键字,这不算对C正确的语法++(只是心眼这个一目了然的看起来像你可以放弃newperson()函数返回正确的东西)。

编辑

好吧,这是应对意见。有一个很多你可以做到这一点。一种简单的方法是设定可以从事特定工作的人员数量的限制。然后,您可以创建一个阵列,其大小与Jobs数组的大小相同,并且此新数组中的每个索引(如HasJob)都可以将索引与Jobs数组匹配。因此,HasJob [0]可以存储每个具有“失业”作业的人员。您可以为每个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 *)); 

现在,你可以做这样的事情

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阵列,我没试过编译和可能有一些问题,但这是这样做的一般过程。基本上,你要完成每项工作,然后为每项工作去完成每个人;如果那个人在那个工作中,在HasJob中找一个空白的地方并把那个人放在那里。

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

+0

由于代码中包含#define new,所以对new的反对名义上没有任何意义 - 尽管#define不是一个好主意,我不确定剩余的代码是如何工作的(我没有浏览过所有的代码 - 我是只是为了#define出席而感到困惑)。 – 2009-10-17 06:41:53

+0

@Jonathan Leffler,呃......我反对。 C中没有新的关键字。是的,这里有一个定义,但它没有意义,也没用。我不是一个编译器,我没有声称捕获每个毫无意义的#define模仿其他C *类似语言中的关键字......我认为这是一个非常合理的反对意见。最大的挑战是:不要在“ANSI C”中这样做。 – BobbyShaftoe 2009-10-17 19:20:34

+0

@BobbyShaftoe - 没有争议它是有害的C. – 2009-10-17 20:59:59