Home > Back-end >  Why is my program only printing my last number instead of all of the input numbers?
Why is my program only printing my last number instead of all of the input numbers?

Time:11-21

The problem I was given to solve is "The number of students who will take the exam is entered from the keyboard, and then the IDs of all the students who will take the exam are entered. The program should divide the students into three groups: students with IDs ending in the digits 0, 1, and 2, students with IDs ending in the digits 3, 4, 5, and students with IDs ending in the digits 6, 7, 8, 9 .The program should print the IDs for each group, in the same order as they were entered. The maximum number of students that can be entered is 1000.".

The code that I can come up with is

#include <stdio.h>

int main() {
int n,br,gr1,gr2,gr3;
    scanf("%d",&n);
    for (int i = 0; i < n;   i) {
        scanf("%d", &br);

        if (br % 10 == 0 || br % 10 == 1 || br % 10 == 2) 
{
            gr1 = br;
        } 
else if (br % 10 == 3 || br % 10 == 4 || br % 10 == 5) 
{
            gr2 = br;
        } 
else if (br % 10 == 6 || br % 10 == 7 || br % 10 == 8 || br % 10 == 9) 
{
            gr3 = br;
        }
    }
    printf("Grupa 1\n%d\n",gr1);
    printf("Grupa 2\n%d\n",gr2);
    printf("Grupa 1\n%d\n",gr3);

return 0;
}

Instead of printing all the IDs and sorting them into groups it is only printing the last input number and group number. I am in no way an experienced programmer so I can't really tell what is wrong with the way I have written this or how to solve it. I would appreciate it if you can guide me through

The output I am expecting is:

Grupa 1
20010 20581 19452
Grupa 2
20145 19873 19825 20653
Grupa 3
20147 20139 19458

The output I am getting is

Grupa 1
19452
Grupa 2
20653
Grupa 3
19458

CodePudding user response:

Your gr1,gr2,gr3 int variables can only store one values at a time (here, the last value that was assigned to it so its showing only one result.) Make them something like an array eg gr1[],gr2[],gr3[], which will be able to hold multiple values at a time and will be able to print them out at the end.

CodePudding user response:

The way you format you code makes it harder for yourself to figure out what is going on. You need to stash in a data in an ordered data structure (array, linked list etc):

#include <stdio.h>
#include <stdlib.h>

#define MAX_STUDENTS 1000
typedef size_t student_id;

enum group {
    GROUP_1 = 1,
    GROUP_2,
    GROUP_3
};

enum group group_student(student_id id) {
    switch(id % 10) {
        case 0: case 1: case 2:
            return GROUP_1;
        case 3: case 4: case 5:
            return GROUP_2;
        default:
            return GROUP_3;
    }
}

int main(void) {
    student_id ids[MAX_STUDENTS];
    size_t n = 0; // required below
    for(; n < sizeof ids / sizeof *ids; n  ) {
        if(scanf("%zu", ids   n) != 1) {
            break;
        }
    }
    for(enum group group = GROUP_1; group <= GROUP_3; group  ) {
        printf("Grupa %d\n", group);
        for(size_t j = 0; j < n; j  ) {
            if(group == group_student(ids[j]))
                printf("%zu ", ids[j]);
        }
        printf("\n");
    }
}

and here is an example run:

$ echo '20010 20581 19452 20145 19873 19825 20653 20147 20139 19458' | ./a.out
Grupa 1
20010 20581 19452 
Grupa 2
20145 19873 19825 20653 
Grupa 3
20147 20139 19458 

When you type this in, end input with ctrl-D. I used a enum group here as it's an identifier (not a number) and documents by virtue of the return type that you change the enum you want to change the function group_student(), too.

  • Related