1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

C program -- need an explanation

  1. May 12, 2016 #1
    1. The problem statement, all variables and given/known data
    I need help with the following problem in C programming language:
    Define a quiz and add two questions in it with given possible answers. Display the questions one by one and allow the user to choose between 1, 2 or 3 (numbers that represent serial numbers of possible answers). If the user enters the character which is not 1, 2 or 3, then allow the user to choose an answer again. At the end of the quiz, print the final score in percentage.

    Use the following definitions:
    Code (Text):

    #define MAX 1000000

    typedef struct
    {
     char questionText[MAX];
     char firstAnswer[MAX];
     char secondAnswer[MAX];
     char thirdAnswer[MAX];
     int snca;//serial number of the correct answer (1, 2 or 3)
    }QUESTION;

    typedef struct
    {
     int tnq;//total number of questions
     QUESTION *questions;
    }QUIZ;

    void addNewQuestion(QUIZ *qz,QUESTION *qn);//adds new question
    void displayQuestion(QUIZ *qz,int snq);//prints question. 'snq' is the serial number of a question
    int isCorrect(QUIZ *qz,int snq,int snqa);//checks if the chosen answer with the serial number 'snqa'
     //on a question with the serial number 'snq' is correct
     
    Code (Text):

    /*Example program:

    1. In what year was the C programming language created?

    1. 1845
    2. 1832
    3. 1972

    Choose an answer: 3

    2. Who is the author of C programming language?

    1. Bill Gates
    2. Dennis Ritchie
    3. Steve Jobs

    Choose an answer: 10
    Error. Choose between 1, 2 or 3.
    Choose an answer: 2

    Final score: 100%*/
     
    2. The attempt at a solution

    I don't understand a couple of things in this problem:

    1. How to add a question using the prototype function given above?
    The function requires to only add one question, so do we need two separate functions for adding a question?

    2. In the structure quiz, variable tnq which represents total number of questions is given. Why? It is said in the problem that the total number of questions is two, so the program should end after the user gives an answer to two questions, right?

    Could someone explain this?
     
  2. jcsd
  3. May 12, 2016 #2

    Merlin3189

    User Avatar
    Gold Member

    Presumably you need to write this function. (I would very much hope so!) Then when you call this function, it adds a question. You call it every time you want to add a question. So you add any number of questions, BUT you need some questions to add. You can't add a question until you have a question to add (and until you have a quiz to add it to.) There is no indication of where these questions come from.

    Wrong. It says,
    It does not say there are two questions. There are none when you create it. Then you add two. You could add more.
    The name and type of the variable tnq is given, but its value is not given.
     
  4. May 12, 2016 #3
    Where to define the text of the questions? In the function addNewQuestion() or in main function?
     
  5. May 12, 2016 #4

    Merlin3189

    User Avatar
    Gold Member

    Yes, I wondered that.
    You could store the data in a file (text) and read them in. But you may not have done file handling yet.
    You could set them as literals in the program, though I don't know what good practice is here.
    You could ask someone to type them in ie. have a function that asks for a question, accepts text from the keyboard, asks for the first answer,accepts text, asks for the second ..... , asks which number is the correct answer, placing each answer into the QUESTION (after validation etc.) then adds the QUESTION to the QUIZ.

    My preference would be the first. The third is tedious. The second may be the simplest, but it's not my style preference.
     
  6. May 18, 2016 #5
    EDIT:

    Here is how I did it using singly linked list:
    Code (Text):

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100000

    typedef struct
    {
      char text[MAX];
      char first[MAX],second[MAX],third[MAX];
      int sn;//serial number of a question
      int snca;//serial number of the correct answer
    }QUESTION;

    typedef struct list_node
    {
      QUESTION qn;
      struct list_node *next;
    }LIST_NODE;

    void insertion(LIST_NODE **head,QUESTION *qn)
    {
      LIST_NODE *newNode=(LIST_NODE *)malloc(sizeof(LIST_NODE));
      newNode->qn=*qn;
      if(*head == 0 || (*head)->qn.sn > qn->sn)
      {
      newNode->next=*head;
      *head=newNode;
      }
      else
      {
      LIST_NODE *p;
      for(p=*head;p->next && p->next->qn.sn < qn->sn;p=p->next);
      newNode->next=p->next;
      p->next=newNode;
      }
    }

    LIST_NODE* searching(LIST_NODE *head,int sn)
    {
      while(head && head->qn.sn != sn)
      head=head->next;
      return head;
    }

    int main()
    {
      LIST_NODE *head=0;
      char option;
      int sn;
      int tnq=0;//total number of questions
      int tncq=0;//total number of correct questions
      float result;
      QUESTION q1={"In what year was the C programming language created?","1852","1872","1972",1,3};
      QUESTION q2={"Who is the author of C programming language?","Bill Gates","Dennis Ritchie","Steve Jobs",2,2};
      QUESTION qn;

      printf("Option 'A': Insert the first question.\n");
      printf("Option 'B': Insert the second question.\n");
      printf("\n");

      do
      {
      printf("Choose an option: ");
      scanf("%c",&option);
      fflush(stdin);

      if(option == 'A')
      {
      LIST_NODE *t1=searching(head,q1.sn);
      if(t1){
      t1->qn=q1;
      tnq++;}
      else{
      insertion(&head,&q1);
      tnq++;}
      }

      else if(option == 'B')
      {
      LIST_NODE *t2=searching(head,q2.sn);
      if(t2){
      t2->qn=q2;
      tnq++;}
      else{
      insertion(&head,&q2);
      tnq++;}
      }

      else if(option == 'P')
      {
      int answer;
      printf("Enter serial number of a question: ");
      scanf("%d",&sn);
      LIST_NODE *p=searching(head,sn);
      if(p)
      {
      printf("%d %s\n 1. %s\n 2. %s\n 3. %s\n",
      p->qn.sn, p->qn.text, p->qn.first, p->qn.second, p->qn.third);

      do
      {
      printf("Choose an answer: ");
      scanf("%d",&answer);
      if(answer != 1 && answer != 2 && answer != 3)
      printf("Error. Possible answer is 1,2 or 3.\n");
      }
      while(answer != 1 && answer != 2 && answer != 3);

      if(answer == p->qn.snca){
      printf("Answer to the question with serial number %d is correct.\n",sn);
      tncq++;
      fflush(stdin);
      }
      else{
      printf("Answer to the question with serial number %d is not correct.\n",sn);
      fflush(stdin);
      }
      }
      else
      {
      printf("No data about the question with serial number %d.\n",sn);
      fflush(stdin);
      }
      }

      else if(option != '0')
      {
      printf("Unknown option.\n");
      fflush(stdin);
      }

      }
      while(option != '0');

      result=((float)tncq * 100)/tnq;
      printf("Result: %.2f%%",result);

      return 0;
    }

     
    How to implement this program using arrays (as given in the original problem)?
     
  7. May 18, 2016 #6

    Mark44

    Staff: Mentor

    Your code should include the code that was given in this assignment. Your code in post #5 is missing this struct template:
    Code (C):
    typedef struct
    {
        int tnq;//total number of questions
       QUESTION *questions;
    }QUIZ;
    The questions member is a pointer to a QUESTION struct. With the tnq member, the intent seems to be that you should have an array of type QUESTION rather than a linked list of them. Remember that the name of an array is a pointer to the first element of the array.

    When the program starts, you could create a QUIZ instance where questions is the address of an array with two or three elements (your program description doesn't say how many questions the quiz should have when it's first created). To add a question use malloc() to allocate space on the heap for the existing questions (tnq of them) plus one more. Copy the existing questions to the first tnq slots in the allocated memory, and then get the information for the new question and copy it to the last memory slot.

    Update tnq to reflect the new question, and update the questions member to point to the allocated memory. The header for malloc() is stdlib.h.

    As an alternative, you could use the realloc() function (same header as above) to allocate space for the new question. It will do the copying for you, if necessary.
     
    Last edited: May 18, 2016
  8. May 19, 2016 #7

    Mark44

    Staff: Mentor

    @gruba, did any of the suggestions work for you? I've seen several of your threads where you ask a question, and get a number of responses, but never acknowledge them.
     
    Last edited: May 19, 2016
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: C program -- need an explanation
  1. Program in C (Replies: 1)

  2. C++ Program (Replies: 17)

  3. C: String arithmetic (Replies: 2)

Loading...