นี่เป็นโปรแกรมเกี่ยวกับร้านค้าครับ้โดยตัวโปรแกรมสามารถทำได้ดังนี้
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
ตอนนี้ผมต้องทำ 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