1、商品信息处理
【问题描述】
设计结构体,用于存储商品的信息,包含商品编号、商品名称、商品价格以及商品折扣信息。
设计函数input,实现商品数据的输入。
设计函数display,实现商品信息的输出。
在主函数main中定义keyboard结构体变量,用来处理商品键盘的数据。
定义一个结构体数组,用于存储3种电器商品的信息。
【输入形式】
输入商品的编号、名称、价格以及折扣信息
【输出形式】
输出商品的编号、名称、价格、折扣以及实际价格信息
【样例输入】
1010 keyboard 89.50 0.85
1021 fridge 1024.00 0.95
1022 A/C 2058.50 0.90
1023 TV 3001.88 0.95
【样例输出】
No:1010 name:keyboard price:89.50 discount:0.85 real price:76.08
No:1021 name:fridge price:1024.00 discount:0.95 real price:972.80
No:1022 name:A/C price:2058.50 discount:0.90 real price:1852.65
No:1023 name:TV price:3001.88 discount:0.95 real price:2851.79
#include <stdio.h>
typedef struct _PRODUCR
{
int number;
char name[20];
double price;
double discount;
} PRODUCT, *PPRODUCT;
void input(PRODUCT *p);
void input(PRODUCT *p)
{
scanf("%d", &p->number);
scanf("%s", p->name);
scanf("%lf", &p->price);
scanf("%lf", &p->discount);
}
void display(PRODUCT *p)
{
printf("No:%d ", p->number);
printf("name:%s ", p->name);
printf("price:%.2lf ", p->price);
printf("discount:%.2lf ", p->discount);
printf("real price:%.2lf\n", p->discount * p->price);
}
int main() //主函数
{
int i;
PRODUCT kyeboard; //请定义结构体类型 PRODUCT
PRODUCT ElecDevice[3];
input(&kyeboard); //请定义函数 input
for (i = 0; i < 3; i++)
{
input(&ElecDevice[i]);
}
display(&kyeboard); //请定义函数 display
for (i = 0; i < 3; i++)
{
display(&ElecDevice[i]);
}
return 0;
}
2、利用链表实现歌曲播放列表
【问题描述】
(1)利用链表结构(PLAY_LIST),为某媒体播放器建立一个播放列表(playList),该链表的每一个节点包括:歌曲编号(number)、歌曲名称(name)、歌手姓名(artist)。
(2)建立4个函数,以实现对播放列表操作。函数的原型如下:
PLAY_LIST* createList(); /*创建播放列表*/
PLAY_LIST* insertItem(PLAY_LIST* pPlayList,
PLAY_LIST* pNewPlayList);
/*在播放列表中添加一首歌曲*/
PLAY_LIST* deleteItem(PLAY_LIST* pPlayList,
int iItemNumber);
/*在播放列表中删除编号为iItemNumber的歌曲*/
void displayList(PLAY_LIST* pPlayList); /*显示整个播放列表中的所有信息*/
(3)在主函数中定义一个链表playList。
A)利用函数createList创建播放列表playList,并在其节点上依次存储编号为1100、1101、1103的3首歌曲,并调用displayList函数显示此时整个播放列表中的所有信息。
B)调用insertItem函数将编号为1102的歌曲添加到playList中,并显示整个播放列表中的所有信息。
C) 调用deleteItem函数将编号为1101的歌曲从playList中删除,并显示整个播放列表中的所有信息。
【输入形式】输入歌曲的信息
【输出形式】输出链表中所有歌曲的信息
显示列表信息时,每一个成员占10列,并左对齐。
即:
No name singer
1100 ABC Jack
【样例输入】
1100
ABC
Jack
1101
Wind
Li
1103
Sky
Wang
-1
1102
OldStory
Qi
-1
【样例输出】
Create new playlist:
Please input song No, if No<0 end input:
Please input song name:
Please input singer name:
Please input song No, if No<0 end input:
Please input song name:
Please input singer name:
Please input song No, if No<0 end input:
Please input song name:
Please input singer name:
Please input song No, if No<0 end input:
playlist:
No name singer
1100 ABC Jack
1101 Wind Li
1103 Sky Wang
Insert item to playlist:
Please input song No, if No<0 end input:
Please input song name:
Please input singer name:
Please input song No, if No<0 end input:
playlist:
No name singer
1100 ABC Jack
1101 Wind Li
1102 OldStory Qi
1103 Sky Wang
Delete item from playlist:
playlist:
No name singer
1100 ABC Jack
1102 OldStory Qi
1103 Sky Wang
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct PLAY_LIST
{
int iNumber;
char strName[20];
char strArtist[20];
struct PLAY_LIST *pNext;
int pTemp;
};
int inputItem(struct PLAY_LIST* pPlayList)
{
printf("Please input song No, if No<0 end input: \n");
scanf("%d",&pPlayList->iNumber);
if(pPlayList->iNumber<0)
return 0;
printf("Please input song name:\n");
scanf("%s",pPlayList->strName);
printf("Please input singer name:\n");
scanf("%s",pPlayList->strArtist);
return 1;
}
struct PLAY_LIST* createList()
{
int iResult=0;
struct PLAY_LIST *pListHead,*pTemp,*pNewList;
pTemp=pNewList=(struct PLAY_LIST*)malloc(sizeof(struct PLAY_LIST));
pNewList->pNext=NULL;
pListHead=NULL;
iResult=inputItem(pNewList);
if(iResult) { pListHead=pNewList; }
while(iResult) {
pNewList=(struct PLAY_LIST*)malloc(sizeof(struct PLAY_LIST));
pNewList->pNext=NULL;
iResult=inputItem(pNewList);
if(iResult) {
pTemp->pNext=pNewList;
pTemp=pNewList;
}
}
return pListHead;
}
struct PLAY_LIST* insertItem(struct PLAY_LIST* pPlayList,struct PLAY_LIST* pNewPlayList)
{
struct PLAY_LIST *p1,*p2;
p1=p2=pPlayList;
if(pPlayList==NULL)
{
pPlayList=pNewPlayList;
pNewPlayList->pNext=NULL;
}
else
{
while((pNewPlayList->iNumber>p1->iNumber)&&(p1->pNext!=NULL))
{
p2=p1;
p1=p1->pNext;
}
if(pNewPlayList->iNumber<=p1->iNumber)
{
if(pPlayList==p1)pPlayList=pNewPlayList;
else p2->pNext=pNewPlayList;
pNewPlayList->pNext=p1;
}
else
{
p1->pNext=pNewPlayList;
pNewPlayList->pNext=NULL;
}
}
return pPlayList;
}
struct PLAY_LIST* deleteItem(struct PLAY_LIST* pPlayList,int iItemNumber)
{
struct PLAY_LIST *p1,*p2;
if (pPlayList == NULL)return(pPlayList);
p1=p2=pPlayList;
while(iItemNumber!=p1->iNumber&&p1->pNext!=NULL)
{
p2=p1;p1=p1->pNext;
}
if(iItemNumber==p1->iNumber)
{
if(p1==pPlayList)
pPlayList=p1->pNext;
else p2->pNext=p1->pNext;
}
return pPlayList;
}
void print(struct PLAY_LIST *head)
{
struct PLAY_LIST *p;
printf("playlist:\n");
printf("No name singer\n");
p=head;
if(head!=NULL)
do
{
printf("%-10d%-10s%-10s\n",p->iNumber,p->strName,p->strArtist);
p=p->pNext;
}while(p!=NULL);
}
int main()
{
struct PLAY_LIST *head;
int i;
printf("Create new playlist:\n");
head=createList();
print(head);
printf("Insert item to playlist:\n");
insertItem(head,createList());
print(head);
printf("Delete item from playlist:\n");
scanf("%d",&i);
head=deleteItem(head,1101);
print(head);
return 0;
}
3、位段的使用
【问题描述】
(1)在一个显示系统中,需要在任意位置显示1个或者2个字符,为此请根据表9-3设计一种数据结构。其中当label=0时,content的16位数据中低8位为英文字符,高8位的数据丢弃。当label=1时, content的16位数据为2个英文字符。
表9-3 位段的结构
(2)建立2个函数,函数的原型如下:
PACK_DATA packData(unsigned uRow,unsigned uCol, unsigned uLabel,
char * pContent); /*封装数据,即将数据按照表9-4方式存储*/
void unpackData(PACK_DATA data); /*将封装的数据提取出来,并安装要求显示在屏幕上。*/
(3)考虑数据(content)可能是1个或者2个英文字符的情况。在主函数中,2次调用函数packData(),将信息1(在第2行第3列显示英文字符X)和信息2(在第3行第4列显示2个字符OK)封装好;然后2次调用函数unpackData() 将上一步封装好的数据提取并显示出来。
【输入形式】
输入显示数据的信息。第一个数据为行号,第二个数据为列号,第三个数据为1个或2个字符标志,第4部分数据为显示的数据。
【输出形式】正确的地方显示数据
【样例输入】1 2 1 OK
【样例输出】(一个空格,从第2列开始显示)OK
#include <stdio.h>
typedef struct _PACK_DATA
{
unsigned int uRow : 3;
int uCol : 3;
unsigned char uLabel : 2;
unsigned short uContent : 16;
} PACK_DATA, *PPACK_DATA;
PACK_DATA packData(unsigned uRow, unsigned uCol, unsigned uLabel, char *pContent)
{
PACK_DATA pack_data;
pack_data.uRow = uRow;
pack_data.uCol = uCol;
pack_data.uLabel = uLabel;
pack_data.uContent = *(unsigned short *)pContent;
return (pack_data);
}
void unpackData(PACK_DATA data)
{
int i;
char temp[3];
for (i = 0; i < data.uRow; i++)
printf("\n");
for (i = 0; i < data.uCol; i++)
printf(" ");
if (data.uLabel == 1)
{
temp[0] = data.uContent & 0xff;
temp[1] = (data.uContent >> 8) & 0xff;
temp[2] = '\0';
printf("%s\n", temp);
}
else
printf("%c\n", (char)data.uContent);
}
int main()
{
unsigned a, b, c;
char A[10];
PACK_DATA data;
scanf("%d %d %d %s", &a, &b, &c, A);
data = packData(a, b, c, A);
unpackData(data);
return 0;
}
4、根据数字输出对应的月份名
【问题描述】
编写程序,根据用户输入的数字(1~12),输出相应的月份名;输入不在范围,则输出“Error!”。要求:用枚举类型实现。
【输入形式】输入1~12
【输出形式】输出January~December
【样例输入】2
【样例输出】February
测试用例2
【样例输入】15
【样例输出】Error!
#include <stdio.h>
enum Mouths
{
Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
};
int main()
{
int i;
scanf("%d",&i);
if (i<1||i>12)
{
printf("Error!");
}
else
{
switch (i)
{
case Jan:
printf("January\n");
break;
case Feb:
printf("February\n");
break;
case Mar:
printf("March\n");
break;
case Apr:
printf("April\n");
break;
case May:
printf("May\n");
break;
case Jun:
printf("June\n");
break;
case Jul:
printf("July\n");
break;
case Aug:
printf("August\n");
break;
case Sep:
printf("September\n");
break;
case Oct:
printf("October\n");
break;
case Nov:
printf("November\n");
break;
case Dec:
printf("December\n");
break;
}
}
return 0;
}