I think part of the problem is that you are trying to cram three dimensions of data (Day, Time, Teacher/Classroom) into two dimensions of the view.
The way around this is to only show two dimensions per view.
So for example, you can show:
- All teachers and their assigned classes for a single day, or:
- All classes for a single teacher for the whole week
So the daily and weekly views could look like this:
download bmml sourcedownload bmml source – Wireframes created with Balsamiq Mockups
Clicking in an empty slot on the calendar area would start a new "appointment" a la Google Calendar. It would be pre-populated with (for example) the teacher who you were currently viewing.
One last comment: The combo-box to select who/what you are looking at in the weekly view can be laid out like a mega drop-down:
This keeps the "Teachers/Students/Rooms" selection order consistent across daily and weekly views.
EDIT:
To account for a large number of students (as per comment below) I have updated the weekly view slightly. On clicking one of the "Teachers/Students/Rooms" buttons, a select field with search box displays: