| CMSC 106 | Project #7 | Spring 2001 |
In this project you will write a program using structures and structures which contain other structures as members, arrays of structures, and functions with structure parameters, using both call-by-value and call-by-reference.
For this project you will be managing a bakery. You will have a list of ingredients you have in stock and a list of recipes you make with those ingredients. When an order comes in, you must determine if you have enough of all the ingredients required in order to fill that order. If you do not have enough of all of the ingredients, you must tell which ones have insufficient quantity.
As you read this section, you may also want to refer to the ``Sample output'' section below.
There will be three input files.
flour 18.5 c
This would mean you have 18 and a half cups of flour on hand. The items on this line will be separated by white space (one or more blanks) and there could be blanks at the beginning or end of the line. Any alternative spelling of the name of an ingredient should be considered a completely different ingredient, but the name with a different pattern of capitalization should be considered to be the same item.
bread flour 3 c yeast 2 t milk 1.2 c sugar 2 T done
This would mean that in order to make 1 order of bread you need to have 3 cups of flour, 1.2 cups of milk and 2 tablespoons of sugar, and 2 teaspoons of yeast. The items on each line will be separated by whitespace (one or more blanks) and there could be spaces before or after the line.
PROCESSING STOCK INGREDIENTS to the screen.
You will need to read each ingredient and store it into your (stock) list
of ingredients
if it is valid according to the definitions that follow.
If the name is written into the
file using any uppercase characters, you should convert it so that it is
all lower case characters to make later comparisons easier.
discarded.DONE PROCESSING STOCK INGREDIENTS.
PROCESSING RECIPE LIST to the screen.
The name of the recipe needs to be read from the input file.
The list of ingredients should be read in and
put in alphabetical order like the first input file's list. All of the
same rules and error messages should be used when reading this list
of ingredients as were used when reading the stock ingredients.
The items on each line will be separated by whitespace (one or
more blanks) and there could be spaces before or after the line.
If the name of the recipe or the name of the ingredient has any
uppercase characters, convert them to their lowercase equivalent to make
later comparisons easier. After you read the recipe,
you need to be sure it is a valid recipe according to the rules below
before storing it in your (cookbook) list of recipes. The list
of recipes should just remain in the order read from the input file.
They do not need to be alphabetized.
already exists!. not available. incorrect unit for followed by
the name of the ingredient where the name of the ingredient is in quotation
marks.DONE PROCESSING RECIPE LIST
even if nothing was printed to the screen during the processing of this input
file.
PROCESSING CUSTOMER ORDER.
You must first read and store the customer's name to be printed
in the final communication to that customer.
can't fill order - don't make
followed by the name of the recipe you do not make at this bakery. The
name of the recipe requested must be contained in quotation marks.
If any of the recipes in the
list are things you do not make at your bakery, you should print this message
once and only once and only for the first
invalid recipe that appears in the order list as read from the third
input file.can't fill order - don't have enough followed by the name of the
ingredient of which you have insufficient quantity.
The name of the ingredient for which there is insufficient quantity must
be contained in quotation marks. This message should appear
for the first ingredient which causes the stock to
go below 0 (more to use than you have).
The order of the recipes requested is as determined from the order of
the lines in the third input file.
The order of the ingredients for any of those recipes is the ``alphabetical''
order in which they were placed as the recipes were read from the second input
file.
Even if more than
one ingredient goes to negative, only one error message should be printed,
and it must be the first ingredient (alphabetically) that goes negative
assuming the recipes are being made in the order of the third input file.sorry followed
by the name of the customer. You should then do no
more output.
All your C programs in this course should be written in ANSI C, which
means they must compile and run correctly with cc -std1 -trapuv
on the OIT
UNIX Class Cluster. You will lose credit if your program generates any
warning messages when it is compiled. Prototypes must appear for all
functions used, listed at the top of the program file.
You may use any ANSI C language features we have discussed in the course so far, plus anything we will discuss between now and the end of the semester, with the following exceptions:
goto nor the continue statement may be
used, and the break statement may not be used in any loop.
exit() library function may not be used at all, and at
most one return statement may be used in any function,
including main.
mem can be used
Using any of these disallowed C features will result in losing credit.
Your program must define three structure types, as described below, which must be named exactly as shown. Your structures must contain the data items specified, but can have additional data fields besides these if you want.
Your program must contain (and use) at least eight separate structure functions. A structure function either has a structure as a parameter, a structure as its return value, or has a pointer to a structure as a parameter. Your program must have at least one such function for each of the three required structures. To get more practice using functions with structures, and to make your program easier to develop and test, it is highly recommended that you write more than eight structure functions (that you write as many as possible). At least two of your structure functions must use call-by-value for their structure parameter(s) or must have a structure as their return value. At least two of the other functions must use call-by-reference for their structures, so they must have pointers to structures as parameters, and they access the structures through the pointers.
If your program doesn't contain, and call, at least eight structure functions, of the types indicated, it will be graded as if it does not work on the primary input- even if its output is correct.
You may also write functions which don't operate on structures, as you like.
Here are some suggestions for possible structure functions; feel free to use others:
Your program must have a comment near the top which contains your name, login ID, student ID, your section number, your TA's name, and an original description of the action and operation of the program. Do not put your alias in this comment! In addition, you must have a comment before each function, explaining its action and operation. Your program should be written using good programming style and formatting, as discussed in class and throughout your textbook. For this project, style is considered to consist of:
return statements in any function
You may want to skip this section at first, read the rest of the project, and come back to study it carefully when you are about to begin writing your program.
The more you write functions to perform various manipulations on structures, the easier your code becomes to test. You can use either call-by-value or call-by-reference for structure functions, but you have to have the indicated number of functions of each type. It is really recommended you use functions for each separate, discrete operation to be performed on any structure.
Do not use a global structure variable or array, like your book does in its example in Chapter 16! You will lose substantial credit if you use global variables in your project. Use the structure program to be posted as an example of one with structures and functions which doesn't use global variables.
It is extremely useful to first develop your program to work for simple cases of input. When it works perfectly for these, you can add code to handle the more complex situations one at a time. For this project, this might mean first developing your program for a simple input data file with just one valid command. You can create several such files, with one command of each type, making sure your results are correct for each. When you have thoroughly tested the different situations which can occur for the various commands and the results for all of them are fine, you can create a larger input file with several commands of different types.
This outline is a suggestion only; you do not have to follow it. There are many ways to develop any program. However, whatever steps you do choose in developing your project, you should be certain to write small parts of your program at a time and test each one to verify that it works before going on!
If you get an error from the first line of your first structure function, which identifies a syntax error right after the name of the structure type, you probably have declared the structure type after this function which uses it. All structure type definitions must precede the first use of a variable or parameter of that structure type.
Here are several other common compilation errors having to do with structures produced by the cc compiler on our class machines and what they mean:
Structure fields cannot be initialized in a structure type definition. See your class notes or text for the proper way to declare a structure variable with an initializer.
(where X is the name of a structure variable)
You are using the -> operator with something which is a
structure, not a pointer to a structure. The -> operator
only operates upon a pointer to a structure. Carefully draw a
picture of your structure variables, and look at how the statement
with the error is referencing them.
(where X is the name of a pointer variable)
This is the opposite of the above problem. You are using the . operator with something which is a pointer to a structure, not a structure.
You are using the . operator directly in front of an array
subscript (i.e., x.[y]). The . operator selects a
field of a structure, so it must be followed by a field name, not a
subscript. Perhaps you are trying to refer to an element within an
array field, but you forgot the array field name after the .
and before the subscript.
(where X is the name of an array variable)
You are trying to assign something to the name of an array.
Perhaps you are trying to copy one character string to another, but
you have to use strcpy since you cannot assign arrays.
(where X is the name of a variable being used as a function's return value)
You are probably trying to return an int from a function whose return type is a structure, not a number.
(where X is the name of a structure variable)
This is the opposite of the above problem. You are probably trying to return a structure from a function whose return type is int, not a structure.
(where X is the name of a structure variable)
You are trying to pass a structure to a call-by-reference structure function, which is expecting an argument which is a pointer to a structure.
(where X is the name of a structure variable)
This is the opposite of the above problem. You are trying to pass a pointer to a structure to a call-by-value structure function, which is expecting an argument which is a structure, not a pointer to a structure.
printf statements if your code isn't
working, to find out where! You need to know this before you can
find out why the problem is occurring.
Frequently save backup copies of your program under different names or in different subdirectories, so even if you inadvertently delete your file or change things which you realize you shouldn't have, it's easy to recover a recent version.
Any evidence of unauthorized use of computer accounts or cooperation on projects will be submitted to the Student Honor Council, which could result in an XF for the course, suspension, or expulsion from the University. Projects are to be written INDIVIDUALLY. For academic honesty purposes, projects are to be considered comparable to a take-home exam. Any cooperation or exchange of ideas which would be prohibited on an exam is also prohibited on a project assignment, and WILL BE REPORTED to the Honor Council.
VIOLATIONS OF ACADEMIC HONESTY INCLUDE:
|
IT IS THE RESPONSIBILITY, UNDER THE UNIVERSITY HONOR POLICY, OF ANY STUDENT WHO LEARNS OF AN INCIDENT OF ACADEMIC DISHONESTY TO REPORT IT TO THEIR INSTRUCTOR.
Your project must be electronically submitted by the date above, to avoid losing credit as described on the syllabus. No projects more than two days late will be accepted for credit without prior permission or a valid medical excuse, as described on your syllabus. Only the project which you electronically submit, according to the procedures provided, can be graded; it is your responsibility to test your program and verify that it works properly before submitting. Lost passwords or other system problems do not constitute valid justifications for late projects, so do not put off working on your program or wait to submit it at the last minute!
Turn in your assignment using the ``submit'' program as before, except
using ``7'' for the project number. You are to submit only the .c file
containing your source code, not the executable version of your program!
If your program is in a file named ``bakery.c'', submit would be run as
submit 7 bakery.c.
Before you submit your project, you must exactly follow the specific submission checklist in the ``Testing projects before submitting'' handout separately posted by your instructor!
Be sure to test your program against a variety of inputs, so you are sure it works in all circumstances!
The primary input and output files will be posted in your instructor's class posting account- do not try to type them in yourself! The primary output consists of all the data values in the entire output shown in the posted file. Note that this primary input does not exercise a number of conditions discussed above which your program should work for in order to earn credit for the secondary inputs.