Phil,
Normalization is good. :D
Here's my first iteration -- I don't know your business models nor am I familliar with UK vending machines (from the sounds of it they are a lot different than ones I've used here in the USA), but here's a stab and 'most normalized' which could be overkill if you don't have it in several buildings/locations/etc.:
syntax is table_name( primary_key, fk_foreign_key, some, other, columns )
The following location info is useful if you (or the business users, who I suspect will at some point) wish to run reports such as "Show me sales figures for all machines in the US" or "How many machines are running low on stock in the 3 buildings furthest away from their supplier?" or "We wish to add a new machine to building XYZ. Where should it go?" -- so you can extract some business intelligence out of the system. Cross referencing selling iformation with building/floor data could indicate that machines on floors 1 and 2 of building XYZ sell out quickly whereas floors 3 and up never sell out, perhaps necesitating the need for more machines on floors 1 and 2.
country stores country information, such as 'UK', United Kingdom; 'USA', United States of America; 'DE', Germany; etc.
country( country_code, full_name )
state/province/etc. -- whatever the next logical subdivision of your country could be, before city. Perhaps Zone?
zone( zone_code, fk_country_code, full_name )
city stores city information -- most cities in the US are abbreviated with 3 character airport codes, e.g. Columbus, OH is CMH, could easily be a integer ID instead of code
city( city_code, fk_zone_code, full_name )
building stores the building information your machines live in (if they are spread out over several buildings/locations, not sure about your set-up).
building( building_id, fk_zone_code, street_address, name, ... )
floor -- stores floor information for each building
floor( floor_number, fk_building_id, other_information, ... )
//room -- are your vending machines stored in rooms or just sitting around outside floors?
vending_machine -- holds the name (or some other unique identifier) and location of the vending machine
vending_machine( vending_machine_name, fk_floor_number, name, serial_number, model_number, etc.. )
Column in the machine, capcity in number of stock units (I assume they are interchangeable)
vending_column( vending_column_id, capacity, ... )
vending cup would store how much $$ it can store, I suppose, or other info you might want to know (I assume there would be vendor info stored in another table so that if the vending cup breaks you know who to call).
vending_cup( vending_cup_id, capacity, ... )
stock stores type of stock, creame cake, pretzels, etc.
stock( stock_code, name, unit_price, etc. )
Which machines have which columns?
machine_column( vending_machine_name, fk_vending_column_id )
Which columns have which stock and how many units?
column_stock( fk_vending_column_id, stock_code, amount_left )
Which columns have cups?
column_cup( fk_vending_column_id, fk_vending_cup_id )
Which machines have cups?
machine_cup( fk_vending_machine_name, fk_vending_cup_id )