hi
Im trying to create a program that would be able to carry out a certain number of tasks any number of times undefined by the user! I was told to use linked list or dynamic arrays but i dont know how to use them propers
any ideas?
help please!
Printable View
hi
Im trying to create a program that would be able to carry out a certain number of tasks any number of times undefined by the user! I was told to use linked list or dynamic arrays but i dont know how to use them propers
any ideas?
help please!
Can you give us some more information about what you are trying to do?
Its basically a database for a sports day! I start with a menu to either, as mentioned before, input, output, sort and searching. I have just started and i only know the basics! So i tried to put some of my knowledge together.
It's not advanced.Code:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char name[50];
char fname[50];
char lname[70];
int age;
char gender[6];
int group;
int position;
} Individual;
int main()
{
Individual I[1];
void menu(Individual I[]);
menu(I);
void input(Individual I[]);
void output(Individual I[]);
void sort(Individual I[]);
void s_age(Individual I[]);
void search();
}
int count =0;
int *in
void menu(Individual I[])
{
int opt;
do{
printf("Choose what you want to do\n\n");
printf("1.) Enter information\n2.) View information\n");
printf("3.) Sort information\n4.) Search information\n");
printf("5.) Exit Program\n\n\n");
printf("Enter option: ");
scanf("%d", &opt);
system("CLS");
switch(opt)
{
case 1:
input(I);
break;
case 2:
output(I);
break;
case 3:
sort(I);
break;
case 4:
search();
break;
case 5:
exit(0);
break;
default:
printf("INVALID OPTION...PLEASE RE-ENTER...");
printf("\n\n");
printf("Press any key to re-enter...");
getch();
system("CLS");
}
}while(opt !=5);
}
int input(Individual I[])
{
int x, i, choice;
for(x=0; x<1; x++)
{
printf("Enter FIRST name: ");
scanf("%s", I[x].fname);
printf("\nEnter LAST name: ");
scanf("%s", I[x].lname);
printf("\nEnter age: ");
scanf("%d", &I[x].age);
printf("\nEnter gender[male/female]: ");
scanf("%s", I[x].gender);
printf("\nEnter group[1,2,3,4]: ");
scanf("%d", &I[x].group);
printf("\nEnter position[1,2,3]: ");
scanf("%d", &I[x].position);
system("PAUSE");
system("CLS");
for (x=0;x<1;x++)
{
printf("Name: %s %s\n\n",I[x].fname,I[x].lname);
printf("Age: %d\n\n", I[x].age);
printf("Gender: %s\n\n", I[x].gender);
printf("Group: %d\n\n", I[x].group);
printf("Position: %d\n\n\n",I[x].position);
}
printf("\nIs the data correct?\n\n");
printf("1.]Yes\n2.]No\n\nChoice: ");
scanf("%d", &choice);
system("CLS");
if(choice == 1){
count++;
printf("%d", count);
in = &count
void files(Individual I[]);
files(I);
}
else{
printf("Please re-enter data, correctly...\n\n");
input(I);
}
}
void files(Individual I[])
{
int x;
FILE*ptr=fopen("Reg.txt", "a");
for(x=0;x<1;x++)
{
fprintf(ptr, "%s\n", I[x].fname);
fprintf(ptr, "%s\n", I[x].lname);
fprintf(ptr, "%d\n", I[x].age);
fprintf(ptr, "%s\n", I[x].gender);
fprintf(ptr, "%d\n", I[x].group);
fprintf(ptr, "%d\n\n", I[x].position);
}
fclose(ptr);
}
int output(Individual I[])
{
FILE*ptr=fopen("Reg.txt", "r");
int a;
for(a=0;a<*in; a++)
{
fscanf(ptr,"%s",I[a].fname);
fscanf(ptr,"%s",I[a].lname);
fscanf(ptr,"%d",&I[a].age);
fscanf(ptr,"%s",I[a].gender);
fscanf(ptr,"%d",&I[a].group);
fscanf(ptr,"%d",&I[a].position);
}
for (a=0; a<*in; a++)
{
printf("%s %s\n\n", I[a].fname, I[a].lname);
printf("%d\n\n",I[a].age);
printf("%s\n\n", I[a].gender);
printf("%d\n\n",I[a].group);
printf("%d\n",I[a].position);
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
}
system("PAUSE");
system("CLS");
}
I want the user to be able to do anything at any time.
Im writing to a file and reading as well. Im not very good in pointers. i tried to use them!
its only allowing me to view 2 sets of entered data, if i add more than 2, the output function crashes.
My friend advised me to use linked lists but im unsure as to how!
any ideas?
i just put the input output and files functions
Your function prototypes should be above main.Code:
void menu(Individual I[]);
void input(Individual I[]);
void output(Individual I[]);
void sort(Individual I[]);
void s_age(Individual I[]);
void search();
int main()
{
Individual I[1];
menu(I);
}
On line 28, you have forgotten a semicolon
Firstly, do not use system calls like clr or pause as they can introduce security concerns and make your code not interchangeable between OS's. Why system() is evil - C++ Forum That link is from a C++ website, but the ideas are the same, so don't hold the language against them! (I kid). Secondly, all you need is a while loop inside your main that prompts the user with your menu of options and loops until the user inputs the "exit" option.
Code:#define EXIT '?'
while( ( option = getoption() ) != EXIT )
{
//do stuff here
}
You have written 162 lines but the program doesn't compile because of several errors. That's not a good method to develop a program. You should work step by step and compile/test often to catch errors as soon as possible.
Bye, Andreas
the menu function i am using works fine..ok its like this. When i enter 2 sets of info (input function) the outputs works fine show the 2 sets of info! however if and add another set of info (now 3 sets) the output function crashes! I have no idea why! do i need my struct count to keep incrementing and how?
And I have no idea how you are even able to run the program because your compiler shouldn't accept it:
I think it's time to think about getting better tools.Code:$ make foo
cc -ggdb3 -Wall -Wextra -c -o foo.o foo.c
foo.c:29:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘void’
foo.c:73:5: error: conflicting types for ‘input’
foo.c:20:10: note: previous declaration of ‘input’ was here
foo.c: In function ‘input’:
foo.c:109:18: error: ‘in’ undeclared (first use in this function)
foo.c:109:18: note: each undeclared identifier is reported only once for each function it appears in
foo.c:110:17: error: expected ‘;’ before ‘void’
foo.c:111:17: warning: implicit declaration of function ‘files’ [-Wimplicit-function-declaration]
foo.c: In function ‘output’:
foo.c:162:1: warning: no return statement in function returning non-void [-Wreturn-type]
foo.c: In function ‘input’:
foo.c:162:1: error: expected declaration or statement at end of input
foo.c:75:12: warning: unused variable ‘i’ [-Wunused-variable]
foo.c:162:1: warning: control reaches end of non-void function [-Wreturn-type]
foo.c: In function ‘main’:
foo.c:25:1: warning: control reaches end of non-void function [-Wreturn-type]
make: *** [foo.o] Error 1
Bye, Andreas
You have your function prototypes inside of your main. Incorrect, just like Click_here stated above. And when they are pulled out and placed in the correct position, you have nothing in your main. Then, according to my previous post, you need a while loop, continually getting options from the user, manipulating the data as needed, until the option accepted is the one that signals a program exit.
Post your revised code for us to help further.
ok i put the function prototypes outside! and it seem to be running properly for 2 sets of data ONLY :/ not more!
Code:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char name[50];
char fname[50];
char lname[70];
int age;
char gender[6];
int group;
int position;
} Individual;
void menu(Individual I[]);
void input(Individual I[]);
void output(Individual I[]);
int main()
{
Individual I[1];
menu(I);
}
int count =0;
void menu(Individual I[])
{
int opt;
do{
printf("Choose what you want to do\n\n");
printf("1.) Enter information\n2.) View information\n");;
printf("3.) Exit Program\n\n\n");
printf("Enter option: ");
scanf("%d", &opt);
system("CLS");
switch(opt)
{
case 1:
input(I);
break;
case 2:
output(I);
break;
case 3:
exit(0);
break;
default:
printf("INVALID OPTION...PLEASE RE-ENTER...");
printf("\n\n");
printf("Press any key to re-enter...");
getch();
}
}while(opt !=3);
}
void input(Individual I[])
{
int x, i, choice;
for(x=0; x<1; x++)
{
printf("Enter FIRST name: ");
scanf("%s", I[x].fname);
printf("\nEnter LAST name: ");
scanf("%s", I[x].lname);
printf("\nEnter age: ");
scanf("%d", &I[x].age);
printf("\nEnter gender[male/female]: ");
scanf("%s", I[x].gender);
printf("\nEnter group[1,2,3,4]: ");
scanf("%d", &I[x].group);
printf("\nEnter position[1,2,3]: ");
scanf("%d", &I[x].position);
printf("DONE Press Enter\n\n");
getch();
}
for (x=0;x<1;x++)
{
printf("Name: %s %s\n\n",I[x].fname,I[x].lname);
printf("Age: %d\n\n", I[x].age);
printf("Gender: %s\n\n", I[x].gender);
printf("Group: %d\n\n", I[x].group);
printf("Position: %d\n\n\n",I[x].position);
}
printf("\nIs the data correct?\n\n");
printf("1.]Yes\n2.]No\n\nChoice: ");
scanf("%d", &choice);
system("CLS");
if(choice == 1){
count++;
printf("%d", count);
void files(Individual I[]);
files(I);
}
else{
printf("Please re-enter data, correctly...\n\n");
input(I);
}
}
void files(Individual I[])
{
int x;
FILE*ptr=fopen("Reg.txt", "a");
for(x=0;x<1;x++)
{
fprintf(ptr, "%s\n", I[x].fname);
fprintf(ptr, "%s\n", I[x].lname);
fprintf(ptr, "%d\n", I[x].age);
fprintf(ptr, "%s\n", I[x].gender);
fprintf(ptr, "%d\n", I[x].group);
fprintf(ptr, "%d\n\n", I[x].position);
}
fclose(ptr);
}
void output(Individual I[])
{
FILE*ptr=fopen("Reg.txt", "r");
int a;
for(a=0;a<count; a++)
{
fscanf(ptr,"%s",I[a].fname);
fscanf(ptr,"%s",I[a].lname);
fscanf(ptr,"%d",&I[a].age);
fscanf(ptr,"%s",I[a].gender);
fscanf(ptr,"%d",&I[a].group);
fscanf(ptr,"%d",&I[a].position);
}
for (a=0; a<count; a++)
{
printf("%s %s\n\n", I[a].fname, I[a].lname);
printf("%d\n\n",I[a].age);
printf("%s\n\n", I[a].gender);
printf("%d\n\n",I[a].group);
printf("%d\n",I[a].position);
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
}
getch();
}
You have a loop inside your menu function that only accepts valid options, which is good. But your menu function should not contain calls to your input or output functions. Your menu function should return the option entered by the user, which is then used inside your main function. It should contain the menu portion, and nothing else. This way will be less misleading as per the names of the functions and what they actually do. On a side note, I am still unable to compile your code. How are you running it?
You also still have system calls inside your code.
What I would do is, (yep!) start over. Like AndiPersti said, focus on individual segments of the program like inputting the data into the data structure and successfully reading it back out to stdout instead of a file. You said you would like to be able to enter an undefined amount of "records", this implies the use of linked lists. This seems a little out of your reach at this time, so focus on using your static sized array. Most importantly, you need to think about code stability. As in, not writing out of bounds in arrays, valid type of data, so on...
Avoid global variables unless absolutely necessary. http://c2.com/cgi/wiki?GlobalVariablesAreBad
Line 98 is a function prototype, not a function call.
Quote:
ok i put the function prototypes outside! and it seem to be running properly for 2 sets of data ONLY :/ not more!
Can you see why you can't put more than two instances of Individual into the array named "I"?Quote:
Code:int main()
{
Individual I[1];
menu(I);
}
Gah! The program is full of hidden Windows characters that I'm having trouble getting rid of. Anyone having more success?
if i put more it crashes just like it did before!
hey i did as you asked and it seems to be working!...btw what type of compiler do you recommend jweoblewski44?
Code:#include <stdio.h>
typedef struct{
char name[50];
int age;
char gender[50];
int position;
}ind; //Individual
void input(ind I[], int n);
void output(ind I[], int n);
void input(ind I[], int n)
{
int x;
for(x=0; x<n; x++)
{
printf("Enter name: ");
scanf("%s", I[x].name);
printf("Enter age: ");
scanf("%d", &I[x].age);
printf("Enter gender: ");
scanf("%s", I[x].gender);
printf("Enter position: ");
scanf("%d", &I[x].position);
}
}
void output(ind I[], int n)
{
int x;
for(x=0; x<n; x++)
{
printf("NAME: %s\n", I[x].name);
printf("AGE: %d\n", I[x].age);
printf("GENDER: %s\n", I[x].gender);
printf("POSITION: %d\n\n", I[x].position);
}
}
int main()
{
int n;
printf("Enter number of registered individuals: ");
scanf("%d", &n);
ind I[n];
int opt;
do{
printf("1. Add\n2. View\n3. Exit\n\n");
printf("Option: ");
scanf("%d", &opt);
switch(opt)
{
case 1:
input(I, n);
break;
case 2:
output(I, n);
break;
case 3:
break;
default:
printf("INVALID\n\n");
break;
}
}while(opt!=3);
}
Well I recommend you to use Linux instead of Windows. It simplifies the development process if you're not dead tied to Visual Studios, with a very easy-to-use compiler and more text editors to develop in than you could shake a stick at.
The compiler I use, much like I assume most people here, is gcc. It is a very simple command line tool.
Disclaimer: I truly enjoy Linux much more than Windows, but as some will undoubtedly be quick to tell you, it is not better. It is just a different method of accomplishing the same task. It's just my preferred method.
Edit: Kudos for following everyone's advice to the bitter end.
i have tried a different approach to the program. im using the stuct method rather than typdef struct! this way i'm not using an array to enter information. And it seems to be writing to the file quite well...so far! However i have a problem with output! How do you read from a file from which you dont know how much data is stored? can you use "EOF"?
and i tried linux ubuntu but ut seemed to be running slow on my laptop :/ i shall try it again!
You can now start working on your linked list :)
I use Windows XP, programming on Code::Blocks (which uses the compiler mingw)
If you wanted to start a new question, it might be a good idea to start a new thread :)
[edit]
I see your new thread - Ignore this post :)
[/edit]
Code::Blocks is a good IDE that I also have used before. It works well, except for the debugger (at least in my scenario)! gdb never fails.
Also, I would recommend Debian over Ubuntu. Ubuntu is just a system built up over Debian and tends to be too "cutting-edge" for me. Debian Squeeze will run well on your laptop, especially if you install a fast desktop environment like XFCE (that is the one I run).