1. 程式人生 > >學習記錄(2018年7月25日)

學習記錄(2018年7月25日)

 1、編寫一個C函式,將句子中的單詞位置倒置,而不改變單詞內部結構.

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

void str_rev(char *str, int len)
{
	int i;
	char tmp;

	for(i = 0; i < len/2; i++)
	{
		tmp = *(str + i);
		*(str + i) = *(str + len - 1 - i);
		*(str + len - 1 - i) = tmp;
	}

}

void word_rev(char *str, int len)
{
	char *p;
	int i, word_len = 0;
	p = (char *)malloc(sizeof(char)*50);

	while(*str != '\0')
	{
		if(*str == ' ')
		{
			str_rev(str - word_len, word_len);
			word_len = 0;
		}
		else
		{
			word_len++;
		}
		str++;
	}

}

int main()
{
	int i, len, flag = 0;
	char *str;
	str = (char *)malloc(sizeof(char)*100);

	printf("Please input:\n");
	scanf("%[^\n]",str);
	len = strlen(str);

	for(i = 0; i < len; i++)
	{
		if(*(str+i) == ' ')
		{
			flag = 1;
		}
	}
	if(flag == 0)
	{
		printf("Input error!\n");
		exit(1);
	}

	str_rev(str, len);
	word_rev(str, len);

	printf("Output:\n %s\n",str);
	return 0;
}

2、輸入一個字串,同時輸入幀頭和幀尾(可以是多個字元),將該字串中合法的幀識別出來.提示:幀頭和幀尾分別是head和tail  字串”asdheadhauboisoktail”中headhauboisoktail是合法幀。

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

int main()
{
	int len, i, start, end;
	char *str;
	
	str = (char *)malloc(sizeof(char)*64);
	scanf("%s",str);

	len = strlen(str);

	for(i = 0; i < len-3; i++)
	{
		if(strncmp(str+i, "head", 4) == 0)
		{
			start = i;
		}
		if(strncmp(str+i, "tail", 4) == 0)
		{
			end = i;
		}
	}

	for(i = start; i < end+4; i++)
	{
		printf("%c",*(str+i));
	}
	
	printf("\n");

	return 0;
}

3、用c語言連結串列實現簡易通訊錄,修改除錯如下: 


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

#define LEN sizeof(struct information)

typedef struct information
{
	char name[20];
	char id[20];
	char phone[20];
	char home[20];
	struct information *next;
}INFO;


/*face()用來顯示通訊錄的基本功能選擇。*/
void face()
{
	printf("****************************\n");
	printf("請輸入你需要進行的操作號碼:\n");
	printf("\t1:顯示通訊錄已有資訊。\n");
	printf("\t2:新增通訊錄人員。\n");
	printf("\t3:刪除通訊錄人員。\n");
	printf("\t4:修改通訊錄人員資訊。\n");
	printf("\t5:查詢通訊錄人員資訊。\n");
	printf("\t6:儲存通訊錄。\n\n");
	printf("\t9:清屏。\n");
	printf("\t0:退出通訊錄。\n");
	printf("****************************\n");
}


/*print()用來顯示通訊錄已有資訊。*/
void print(INFO *head)
{
	INFO *p;
	p = head;
	system("clear");

	if(head!=NULL)
	{
		printf("已有成員如下:\n");
		do
		{
			printf("姓名:%s\n",p->name);
			printf("ID:%s\n",p->id);
			printf("電話號碼:%s\n",p->phone);
			printf("家庭住址:%s\n\n",p->home);
			p=p->next;
		}while(p!=NULL);
	}
	else
	{
		printf("對不起!!沒有任何聯絡人記錄!!\n\n");
		printf("****************************\n");
	}
	
}


/*add()新增通訊錄資訊,將資訊存入p0節點*/
INFO *add(INFO *head)
{
	INFO *p0 = NULL, *p1, *p2;
	p0 = (INFO *)malloc(LEN);
	p1 = head;
	p2 = head;
	
	printf("請輸入你需要新增的成員資訊:\n");
	printf("****************************\n");
	printf("姓名:");
	scanf("%s",p0->name);
	printf("ID:");
	scanf("%s",p0->id);
	printf("電話號碼:");
	scanf("%s",p0->phone);
	printf("家庭住址:");
	scanf("%s",p0->home);
	
	/*再將p0節點按姓名順序存入通訊錄。*/
	if(head==NULL)
	{
		head=p0;
		p0->next=NULL;
	}
	else
	{
		while((strcmp(p0->name,p1->name)>0)&&(p1->next!=NULL))
		{
			p2=p1;
			p1=p1->next;
		}
		if((strcmp(p0->name,p1->name))<=0)
		{
			if(head==p1)
				head=p0;
			else
				p2->next=p0;
			p0->next=p1;
		}
		else
		{
			p1->next=p0;
			p0->next=NULL;
		}
		printf("恭喜你!!成功添加了聯絡人資訊!!");
		printf("\n************************************************************\n");
		printf("\n\n");
	}
	return head;
	
			
	/*
	//在通訊錄頭部插入
	if(head == NULL)
	{
		head = p0;
		head->next = NULL;
	}
	else
	{
		p0->next = head->next;
		head->next = p0;
	}
	return head;
	//在通訊錄尾部插入
	if(head == NULL)
	{
		head = p0;
		head->next = NULL;
	}
	else
	{
		while(p1->next!=NULL)
		{
			p2 = p1;
			p1 = p1->next;
		}
		p1->next = p0;
		p0->next = NULL;
	}
	return head;
	*/
}


/*delete()刪除通訊錄人員資訊。*/
INFO *delete(INFO *head)
{
	INFO *p1, *p2;
	char name[10];
	p1 = head;
	p2 = head;
	
	printf("請以姓名為關鍵字,輸入需要刪除的成員資訊:\n");
	printf("****************************\n");
	scanf("%s",name);
	if (head==NULL)
    {
		printf("很抱歉!沒有任何聯絡人紀錄!\n");
		printf("\n*******************************************************\n");
		return(head);
	}
	while(p1!=NULL)
	{
		if(strcmp(p1->name,name)==0)
		{
			if(p1==head)
				head=p1->next;
			else
				p2->next=p1->next;
			free(p1);
			printf("刪除記錄成功!\n");
			return(head);
		}
		p2=p1;
		p1=p1->next;
	}
	printf("對不起!沒有要刪除的聯絡人紀錄!\n");
	return head;
}


/*rev()修改通訊錄人員資訊。*/
void revise(INFO *head)
{
	INFO *p1, *p2;
	char name[10];
	p1 = head;
	p2 = head;
	
	printf("請以姓名為關鍵字,輸入需要修改的成員資訊:\n");
	printf("****************************\n");
	scanf("%s",name);
	
	while(p1!=NULL)
	{
		if(strcmp(p1->name,name)==0)
		{
				printf("請根據提示修改成員資訊:\n");
				printf("將姓名%s修改為:",p1->name);
				scanf("%s",p1->name);
				printf("將ID%s修改為:",p1->id);
				scanf("%s",p1->id);
				printf("將電話號碼%s修改為:",p1->phone);
				scanf("%s",p1->phone);
				printf("將家庭住址%s修改為:",p1->home);
				scanf("%s",p1->home);
				printf("修改成功。\n");
				break;
		}
		p2=p1;
		p1=p1->next;
	}
	if(p1==NULL)
		printf("對不起!!沒有該聯絡人的紀錄!!\n");

	
}


/*search()查詢通訊錄人員資訊。*/
void search(INFO *head)
{
	INFO *p1, *p2;
	char name[10];
	p1 = head;
	p2 = head;
	
	printf("請以姓名為關鍵字,輸入需要查詢的成員資訊:\n");
	printf("****************************\n");
	scanf("%s",name);
	while(p1!=NULL)
	{
		if(strcmp(p1->name,name)==0)
		{
			printf("查詢到如下資訊:\n");
			printf("姓名:%s\n",p1->name);
			printf("ID:%s\n",p1->id);
			printf("電話號碼:%s\n",p1->phone);
			printf("地址:%s\n",p1->home);   
			break;
		}
		p2=p1;
		p1=p1->next;
	}
	if(p1==NULL)
		printf("對不起!!沒有該聯絡人的紀錄!!\n");

}

void save(INFO *head)
{
	INFO *p;
	FILE 
}


int main()
{
	int choose;
	INFO *head = NULL;
	head = (INFO *)malloc(LEN);
	system("clear");
	
	while(1)
	{
		face();
		
		scanf("%d",&choose);
		switch(choose)
		{
			case 0:system("clear");return 0;
			case 1:print(head);break;
			case 2:head = add(head);break;
			case 3:head = delete(head);break;
			case 4:revise(head);break;
			case 5:search(head);break;
			case 6:save(head);break;
			case 9:system("clear");break;
			default :printf("輸入錯誤!\n");break;
		}
	
	}
}