With this approach, you write a single program that includes two user interfaces: one for character systems and one for graphical systems.The two user interfaces gather the same data, but in a fashion that is customized for the host system. After the data is collected, the remainder of the program is the same between the two systems.
This approach combines some of the advantages and disadvantages of the other two approaches. On the positive side, there is only one set of source to maintain. There is less programming than the dual code approach, but you aren't forced into the simplified user interface typically required by the single interface approach. You can customize the user interface to take advantage of features found on a graphical system without making the character-based version unmanageable.
The biggest disadvantage is that you must write two user interfaces. While this is less work than writing two separate programs, it is still a significant amount of work. In addition, you must test the user interface code more thoroughly than with the single interface approach, because only half of the interface code is exercised on any one type of system.