2013年6月18日 星期二

[C]Chapter 8 Homework


I.
  • 定義一個結構用來放個人通訊錄
    • name: 10 char
    • phone: 15 char
    • email: 25 char
    • age: int
  • 首先輸入一個int 代表通訊錄要設多大 (至少4人)
  • main()用 new 配置通訊錄的大小
  • 將該通訊錄傳給一function 做輸入(Call by address)
  • 將該通訊錄傳給一function 做輸出(列印通訊錄資料)
  • 最後, 不用時要delete 該通訊錄

II.
  • 寫一個function, 把副檔名”cpp”換成”c” (字串必須更改,不可以只有輸出更改)
    • 輸入字串 “d:\vc\abc.cpp” 
    • 輸出 “d:\vc\abc.c”
III.
  • Displaying a Sentence with Its Words Reversed 
    • strtok(), please google to find how to use strtok()
    • e.g. input: I will go to school
    •        Output: school to go will I

Solution Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//constants
//first_question
#define SIZE_NAME 10
#define SIZE_PHONE 15
#define SIZE_EMAIL 25
//second_question
#define SIZE_FNAME 100
//third question
#define SIZE_SENTENCE 500

//struct
struct contacts_data
{
	char name[SIZE_NAME],phone[SIZE_PHONE],email[SIZE_EMAIL];
	int age,index;
};

//type define
typedef struct contacts_data CON_DATA;

//phototype
void first_question(void);
void q1_input(CON_DATA *data, int size);
void q1_printf(CON_DATA *data, int size);
void second_question(void);
void q2_change_name(char f_name[]);
void third_question(void);
void q3_reverse(char sentence[], int size);
void q3_reverse_words(char sentence[]);

void main (void)
{
	for(;;)
	{
		int question=0;
		char again=0;
		printf("Please enter number to choose question to Demo>");
		scanf_s("%d",&question);
		switch(question)
		{
		case 1:
			first_question();
			break;
		case 2:
			second_question();
			break;
		case 3:
			third_question();
			break;
		default:
			printf("The question is not exists\n");
		}
		printf("Demo other question ? [Y/N]");
		while(again != 'Y' && again != 'y' && again !='n' && again !='N')
		{
			fflush(stdin);
			again=getchar();
		}
		if(again == 'n' || again == 'N')
			break;
	}
	system("pause");
}

void first_question(void)
{
	int size;
	CON_DATA *data_p;
	//引導輸入資料筆數
	printf("Please determine the size of contacts >");
	scanf_s("%d",&size);
	//產生動態結構儲存
	data_p = new CON_DATA[size];
	q1_input(data_p,size);
	q1_printf(data_p,size);
	delete [] data_p;
}

void q1_input(CON_DATA *data, int size)
{
	printf("Now, please input data.\n");
	for(int i=0;i<size;i++)
	{
		(*(data+i)).index=i+1;
		printf("%d-th data input\n",i+1);
		printf("\tName > ");
		fflush(stdin);
		gets(((*(data+i)).name));
		fflush(stdin);
		//scanf_s("%s",((*(data+i)).name),SIZE_NAME);
		printf("\tPhone > ");
		scanf_s("%s",&((*(data+i)).phone),SIZE_PHONE);
		printf("\tEmail > ");
		scanf_s("%s",&((*(data+i)).email),SIZE_EMAIL);
		printf("\tAge > ");
		scanf_s("%d",&((*(data+i)).age));
	}
}

void q1_printf(CON_DATA *data, int size)
{
	printf("Now, the program will print contacts...\n");
	printf("Index\tName      \tPhone          \tEmail                    \tAge\n");
	for(int i=0;i<size;i++)
		printf("%2d\t%-10s\t%-15s\t%-25s\t%2d\n",(*(data+i)).index,(*(data+i)).name,(*(data+i)).phone,(*(data+i)).email,(*(data+i)).age);
}

void second_question(void)
{
	char f_name[SIZE_FNAME];
	printf("input file name >");
	fflush(stdin);
	gets(f_name);
	q2_change_name(f_name);
	printf("The new name > %s",f_name);
	printf("\n");
}

void q2_change_name(char f_name[])
{
	int i=0;
	while(f_name[i] !=46 && ((f_name[i+1] !=67 && f_name[i+2] != 80 && f_name[i+3] != 80) || (f_name[i+1] !=99 && f_name[i+2] != 112 && f_name[i+3] != 112)))
		i++;
	f_name[i+2]=NULL;
	f_name[i+3]=NULL;
}

void third_question(void)
{
	char sentence[SIZE_SENTENCE];
	printf("please enter sentence >");
	fflush(stdin);
	gets(sentence);
	//統計長度
	int total_len=strlen(sentence);
	//反轉整句
	q3_reverse(sentence,total_len);
	//反轉單字
	q3_reverse_words(sentence);
	//經過strtok的句子空白部分變成了\0不能直接用%s印出,會斷掉
	for(int i=0;i<total_len;i++)
		printf("%c",sentence[i]);
	printf("\n");
}

void q3_reverse(char sentence[], int size)
{
	for(int i=0;i<size/2;i++)
	{
		char temp=sentence[i];
		sentence[i]=sentence[size-1-i];
		sentence[size-1-i]=temp;
	}
}

void q3_reverse_words(char sentence[])
{
	char *tag_s;
	tag_s = strtok(sentence," ");
	while(tag_s != NULL)
	{
		q3_reverse(tag_s,strlen(tag_s));
		tag_s = strtok(NULL," ");
	}
}

沒有留言:

張貼留言