ตอนนี้ผมต้องทำ computer programming ครับ แต่เเกะโค้ดอาจารย์ไม่ออกครับ

กระทู้คำถาม
นี่เป็นโปรแกรมเกี่ยวกับร้านค้าครับ้โดยตัวโปรแกรมสามารถทำได้ดังนี้
1.หาชื่อสินค้า และ เพิ่ม-ลด จำนวนสินค้า
2.สามารถหาจำนวนสินค้าที่มีอยู่ทั้งหมด
3.สามารถออก&บันทึกข้อมูล
4.สามารถออกแต่ไม่บันทึกข้อมูล
โปรแกรมที่เขียนเป็น codelite ครับ แต่เครื่องผม debug ในตัวโปรแกรมไม่ได้ครับไม่ทราบว่าเป็นอะไรเหมือนกัน ==
___________________________________________________________________________
อันนี้เป็นตัวอย่างโค้ดที่อาจารย์ให้มาครับ
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define linesize 256

struct info_tag {
    char    pid[10];
    char    name[32];
    double    price;
    long    qty;
};

typedef struct info_tag INFO;


void parseRecord(char *s, INFO *r)
{
    char buf[linesize+1];
    char *b,*p;
    strcpy(buf,s);
    b=p=buf;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    strcpy(r->pid,b);
    b=++p;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    strcpy(r->name,b);
    b=++p;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    sscanf(b,"%lf",&r->price);
    b=++p;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    sscanf(b,"%ld",&r->qty);

}

void print_menu()
{
    printf("1.purchase\n2.sell\n3.list\n4.save&quit\n5.quit\n?");
}

void list_items(INFO *r,int cnt)
{
    int i;
    for(i=0; i<cnt; i++) {
        printf("%s-%s-%lf-%ld\n",r->pid,r->name,r->price,r->qty);
        r++;
    }
    printf("Total %d items\n",cnt);
}

int save_items(INFO *r, int cnt, char *fn)
{
    FILE *f;
    if(!(f=fopen(fn,"w"))) {
        perror(fn);
        return -1;
    }

    while(cnt--) {
        fprintf(f,"%s:%s:%.2f:%ld\n",r->pid,r->name,r->price,r->qty);
        r++;
    }
    fclose(f);
    return 0;
}

void item_purchase(INFO *r,int n)
{
    int i;
    char buf[linesize];

    printf("input PID=");
    fgets(buf,linesize,stdin);
    if(buf[strlen(buf)-1]=='\n')
        buf[strlen(buf)-1]='\0';
    for(i=0; i<n; i++) {
        if(strcmp(r->pid,buf)==0)
            break;
        r++;
    }
    if(i==n) {
        printf("no product found\n");
        return;
    }
    printf("input %s qty=",r->name);
    fgets(buf,linesize,stdin);
    if(buf[strlen(buf)-1]=='\n')
        buf[strlen(buf)-1]='\0';
    i=atoi(buf);
    printf("add %d to %s now %ld remaining\n", i, r->name, r->qty+i);
    r->qty+=i;

}

void item_sell(INFO *r,int n)
{
    int i;
    char buf[linesize];

    printf("input PID=");
    fgets(buf,linesize,stdin);
    if(buf[strlen(buf)-1]=='\n')
        buf[strlen(buf)-1]='\0';
    for(i=0; i<n; i++) {
        if(strcmp(r->pid,buf)==0)
            break;
        r++;
    }
    if(i==n) {
        printf("no product found\n");
        return;
    }
    printf("input %s qty=",r->name);
    fgets(buf,linesize,stdin);
    if(buf[strlen(buf)-1]=='\n')
        buf[strlen(buf)-1]='\0';
    i=atoi(buf);
    printf("sell %d of %s now %ld remaining\n", i, r->name, r->qty-i);
    r->qty-=i;

}

void read_input(char *fn,INFO *r, int *n)
{
    FILE *fp;
    char buf[linesize+1];
    char str[linesize+1];

    *n=0;
    if(!(fp=fopen(fn,"r"))) {
        perror(fn);
        return;
    }

    while(!feof(fp)) {
        if(fgets(buf,linesize,fp)==0) break;
        strcpy(str,buf);
        str[strlen(str)-1]='\0';
        if(*str=='\0') continue;
        parseRecord(str,r+*n);
        printf("%s-%s-%.2f-%ld\n",r[*n].pid,r[*n].name,r[*n].price,r[*n].qty);
        (*n)++;
    }
}

int main(int argc, char **argv)
{

    INFO    items[100];
    char ch;
    int cnt=0;
    char buf[linesize];

    read_input("stock.txt",items,&cnt);

    printf("stock has %d records\n",cnt);

    while(1) {
        print_menu();
        fgets(buf,linesize,stdin);
        sscanf(buf,"%c",&ch);
        switch(ch) {
        case '1':
            item_purchase(items,cnt);
            break;
        case '2':
            item_sell(items,cnt);
            break;
        case '3':
            list_items(items,cnt);
            break;
        case '4':

            return (save_items(items,cnt,"stock.txt"));
            break;
        case '5':
            return 0;
            break;
        }
    }


    return 0;
}
_____________________________________________________________________
อันนี้เป็นข้อมูลในไฟล์ .txt ครับ

_______________________________________________________________________
สิ่งที่อยากทราบ
1.ฟังชันนี้เป็นฟังชั่นแบบไหนครับการทำงานมันทำงานอย่างไรครับ
struct info_tag {
    char    pid[10];
    char    name[32];
    double    price;
    long    qty;
};

typedef struct info_tag INFO;
2.ฟังชั่นนี้มันทำงานอย่างไรครับ และตรง "r->" มันหมายความว่าอย่างไรครับ
void parseRecord(char *s, INFO *r)
{
    char buf[linesize+1];
    char *b,*p;
    strcpy(buf,s);
    b=p=buf;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    strcpy(r->pid,b);
    b=++p;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    strcpy(r->name,b);
    b=++p;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    sscanf(b,"%lf",&r->price);
    b=++p;
    while(*p!=0&&*p!=':')p++;
    *p='\0';
    sscanf(b,"%ld",&r->qty);

}
3.ฟังชั่นนี้ทำงานอย่างไรครับ และ ตรงตัวแปร "INFO *r,int n" ที่กำหนดมาในตัวฟังชั่นมีความหมายว่าอย่างไรครับ
void item_purchase(INFO *r,int n)
{
    int i;
    char buf[linesize];

    printf("input PID=");
    fgets(buf,linesize,stdin);
    if(buf[strlen(buf)-1]=='\n')
        buf[strlen(buf)-1]='\0';
    for(i=0; i<n; i++) {
        if(strcmp(r->pid,buf)==0)
            break;
        r++;
    }
    if(i==n) {
        printf("no product found\n");
        return;
    }
    printf("input %s qty=",r->name);
    fgets(buf,linesize,stdin);
    if(buf[strlen(buf)-1]=='\n')
        buf[strlen(buf)-1]='\0';
    i=atoi(buf);
    printf("add %d to %s now %ld remaining\n", i, r->name, r->qty+i);
    r->qty+=i;

}

4.ฟังชันนี้ตรงที่เปิดไฟล์ทำไมต้องมี return -1; ด้วยครับ
int save_items(INFO *r, int cnt, char *fn)
{
    FILE *f;
    if(!(f=fopen(fn,"w"))) {
        perror(fn);
        return -1;
    }

    while(cnt--) {
        fprintf(f,"%s:%s:%.2f:%ld\n",r->pid,r->name,r->price,r->qty);
        r++;
    }
    fclose(f);
    return 0;
}
______________________________________________________________
ขอบพระคุณมากครับบบ TT
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่