Per il punto uno, non e' troppo complicato. C'e' la via performante, ma noiosa (quella di usare JNI) o una immediata che per operazioni semplici come la tua va benissimo. Consiste nel creare un processo esterno (il tuo eseguibile scritto in c) e prendere gli stream di I/O di questo per eseguire operazioni di lettura scrittura. La parte java d'esempio e' in grassetto. Il resto mi serviva per costruire la grafica del pannello. Per la grafica, usa swing. Ricorda che swing si basa su awt, e per usare bene il primo, sarebbe consigliato conoscere bene il secondo.
Se vuoi provare l'esempio, fatti una classe main in java, crea un JFrame e aggiungici una istanza della classe TalkWithC. Compila il file c e mettilo nella stessa directory del class.
codice:
***********PROGRAMMA C*********
#include <stdio.h>

main ()
{
   char stringa[100];
   scanf("%s", stringa);
   printf("Hello %s", stringa);
}

********PROGRAMMA JAVA*********
import java.awt.BorderLayout;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class TalkWithC extends JPanel implements ActionListener {
    private JTextField testo;
    private JButton bottone;
    private JTextArea output;
    private JPanel up;
    
    /** Creates a new instance of TalkWithC */
    public TalkWithC() {
        super();
        this.setLayout(new BorderLayout());
        up = new JPanel();
        testo = new JTextField(10);
        bottone = new JButton("Test");
        bottone.addActionListener(this);
        output = new JTextArea("Output: \n");
        output.setEditable(false);
        output.setRows(10);
        up.add(testo);
        up.add(bottone);
        this.add(up, BorderLayout.NORTH);
        this.add(output, BorderLayout.CENTER);
    }
    
    public void actionPerformed(ActionEvent e) {
        ProcessBuilder builder = new ProcessBuilder("C:\\Documents and Settings\\Simone\\classes\\a.exe"); //CI vuole il percorso assoluto.
        Process p;
        try {
            p = builder.start();
            BufferedReader reader=new BufferedReader(new InputStreamReader(p.getInputStream()));
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(p.getOutputStream()));
            writer.write(testo.getText()+"\n");
            writer.flush();
            String line;
            while((line = reader.readLine()) != null) {
                output.append(line+"\n");
            }
            reader.close();
            int status = p.exitValue();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
}