0

Just to have a look a name in a list, when match, the value is discounted.

I tried to code, but the matching technique is fail. Like I try to find "John", but it match with "John" and "Johnny", whether the expected match is just "John" (case is not sensitive)

Just want to help my mom's store. What I want is something like: I have 3 set of flat file (list1.txt, list2.txt, list3.txt). Each file has its name, for example:

John
Rudy
Barrack Obama
John Travolta

List2.txt contained:

Jeddi Sarah
Mute Sand

List3.txt contained:

Greedy Black
Nevada Blue

The program when executed, ask:

Enter name: Greedy Black
Enter price: 1000

If the name is listed in list1.txt, he gets discount price 10%, list2.txt for 20%, and list3.txt for 30%. example output:

Enter name: Greedy Black
Enter price: 1000    
Greedy Black is found in list3.txt, got discount for 10%
price after discount: 900

But if he does not in any list, he gets normal price, which is 1000. How could I do that in C? Thank you for the help...

1 Answers1

0

This Works Fine

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

#define MAX_C 111
char *trim(char *str);
int countlines(const char *filename);
char ** names(const char *filename);

int contains(const char* a)
{
    int l1 = countlines("list1.txt");
    int l2 = countlines("list2.txt");
    int l3 = countlines("list3.txt");

    char** c1 = names("list1.txt");
    char** c2 = names("list2.txt");
    char** c3 = names("list3.txt");



    for (int i = 0; i < l1; ++i) {
        if (strcmp(a,c1[i])== 0 )
            return 1;
    }
    for (int i = 0; i < l2; ++i) {
        if (strcmp(a,c2[i])== 0 )
            return 2;
    }
    for (int i = 0; i < l3; ++i) {
        if (strcmp(a,c3[i])== 0 )
            return 3;
    }
    for (int j = 0; j < l1; ++j) {
        printf("%s\t%s",a,c1[j]);
    }
    return 0;
}

int main()
{
    char  * a = (char * ) malloc(MAX_C);

    printf("Enter Name:\n");
    scanf("%[^\n]",a);
    int p;
    printf("Enter Price:\n");
    scanf("%d",&p);

    int c = contains(a);
    if(c)
    {
        printf("Greedy Black is found in list%d.txt, got discount for 10%%\nprice after discount: %f",c,p-p/10.0);
    }
else
    {
        printf("Greedy Black is found in list%d.txt, got discount for 10%%\nprice Without discount: %f",c,p);
    }


}


int countlines(const char *filename) {
    // count the number of lines in the file called filename
    FILE *fp = fopen(filename, "r");
    int ch = 0;
    int lines = 0;

    if (fp == NULL)
        return 0;

    lines++;
    while ((ch = fgetc(fp)) != EOF) {
        if (ch == '\n')
            lines++;
    }
    fclose(fp);
    return lines;
}
char ** names(const char *filename)
{
    int line = countlines(filename);
    char ** arr = (char **)malloc(line * sizeof(char *));
    for (int i=0; i<line; i++)
        arr[i] = (char *)malloc(MAX_C * sizeof(char));
    FILE * fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("Could not open file %s", filename);
        return NULL;
    }
    for (int i = 0; i < line; ++i) {
        if(fgets(arr[i], MAX_C, fp)!=NULL)
        {
            trim(arr[i]);
        }
    }

    return arr;
}
char *trim(char *str)
{
    size_t len = 0;
    char *frontp = str;
    char *endp = NULL;

    if( str == NULL ) { return NULL; }
    if( str[0] == '\0' ) { return str; }

    len = strlen(str);
    endp = str + len;

    /* Move the front and back pointers to address the first non-whitespace
     * characters from each end.
     */
    while( isspace((unsigned char) *frontp) ) { ++frontp; }
    if( endp != frontp )
    {
        while( isspace((unsigned char) *(--endp)) && endp != frontp ) {}
    }

    if( frontp != str && endp == frontp )
        *str = '\0';
    else if( str + len - 1 != endp )
        *(endp + 1) = '\0';

    /* Shift the string so that it starts at str so that if it's dynamically
     * allocated, we can still free it on the returned pointer.  Note the reuse
     * of endp to mean the front of the string buffer now.
     */
    endp = str;
    if( frontp != str )
    {
        while( *frontp ) { *endp++ = *frontp++; }
        *endp = '\0';
    }

    return str;
}


  • Well, it compiled. But when I tried, it made wrong result/output. Like when I type the name listed in list2.txt, it does not recognized it, then the calculation was wrong. But nice try Sir, it was close.... – Agung Sudrajat Oct 27 '19 at 08:20