1.22 学习报告

习题5-7qsort函数未完成

// 5_7_readlines.cpp : 定义控制台应用程序的入口点。
// 掌握指针数组的使用方法
//从控制台中读入字符,存储在指针数组中,需要考虑的问题是数组空间大小的问题
//将文本进行排序
//最后将排序的文本输出出来
/*
   读取所有输入行
   对文本行进行排序
   按次序打印文本行
*/

#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std ;
#define MAXLINES 1000  //指针数组的大小
#define MAXLINE 100    //每行字符的长度
#define ALLOCSIZE 1000
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf ;
char *p_Array[MAXLINES];  /****定义一个指针数组*****/

int readlines(char *p_Array[] , int maxlines); //返回输入数据的行数及文本的记录
int readlines_(char *p_Array[] , char *s , int maxlines);
void writelines(char *p_Array[] , int nlines);
void qsort(char *p_Array[] , int left ,int right);
int getline(char *s , int line);
char *alloc(int n);
void strcpy_(char *s , char *t);
int _tmain(int argc, _TCHAR* argv[])
{
	int nlines ;  /*用来记录读入的行*/
	char s[MAXLINE];
	if((nlines = readlines(p_Array , MAXLINES)) >= 0 )
    //if((nlines = readlines_(p_Array ,s, MAXLINES)) >= 0 )
	{
		qsort(p_Array , 0 ,nlines- 1);
		writelines(p_Array , nlines);
		return 0;
	}
	else
	{
		cout<<"error:too long "<<endl;
		return 1 ;
	}
	getchar();
	getchar();
	system(0);
}
//返回一行字符的长度
int getline(char *s , int line)
{
	int c ; 
	int i = 0 ;
	int count = 0 ;
	while(--line > 0 && (c = getchar()) != EOF && c != '\n')
	{
		  s[i++] = c ;
	}
	if(c == '\n')
		s[i++] = c ;
	s[i] = '\0' ;
	return i ;
}
char *alloc(int n)
{
	if(allocbuf + ALLOCSIZE - allocp >= n)
	{
		allocp += n ;
		return allocp - n ;
	}else
		return 0 ;
}
void strcpy_(char *s , char *t)
{
	while(*s++ = *t++);
}
//比较字符串str1和str2的前n个字符
int strcmp_(char *s , char *t )
{
	for(; *s == *t ; s++ , t++)
	{
		if(*s == '\0')
			return  0 ;
	}
	if( (*s - *t) > 0)
		return 1 ;
	else
		return -1 ;
}
//将每行的字符存储在指针数组中
int readlines(char *p_Array[] , int maxlines)
{
	int len , nlines = 0;
	char *p , line[MAXLINE];
	while((len = getline(line , MAXLINE)) > 0 )
	{
		if(nlines >= maxlines ||( p = alloc(len)) == NULL) //程序的健壮性
			return -1 ;
		else
		{
			line[len-1] = '\0' ;
			strcpy_(p , line);
			p_Array[nlines++] = p ;
		}
	}
	return nlines ;
}
int readlines_(char *p_Array[] , char *s , int maxlines)
{
	int len , nlines = 0;
	char line[MAXLINE];
	while((len = getline(line , MAXLINE)) > 0 )
	{
		if(nlines >= maxlines) //程序的健壮性
			return -1 ;
		else
		{
			line[len-1] = '\0' ;
			strcpy_(s , line);
			p_Array[nlines++] = s ;
		}
	}
	return nlines ;
}
void writelines(char *p_Array[] , int nlines)
{
	for(int i = 0 ; i < nlines ; i++)
		printf("%s\n", p_Array[i]);
}
//交换的指针的指向
void qsort(char *p_Array[] , int left ,int right)
{
	int i , j ;
	i = left ;
	j = right-1 ;
	char *temp ;
	temp = p_Array[left];
	while(left < right)
	{
		while(left < right && strcmp_(temp,p_Array[j]) < 0 )
			j-- ;
		p_Array[left] = p_Array[j];
		while(left < right && strcmp_(temp,p_Array[i]) > 0)
			i++ ;
		p_Array[right] = p_Array[i];
	}
	p_Array[left] = temp ;
	qsort(p_Array , left , i-1);
	qsort(p_Array , j+1 , right);

}

习题5-8 

int day_of_year(int year , int month , int day)
{
	int leap ;
	leap = year%4 ==0 && year%100 !=0 || year % 400 == 0;
	int i ;
	if(month < 1 || month > 12 )
		return -1 ;
	if(day < 1 || day > daytab[leap][month])
		return -1 ;
	for(int i = 1 ; i < month ; i++)
		day += daytab[leap][i];
	return day ;
}
void month_day(int year , int yearday , int *pmonth , int *pday)
{
	int leap ;
	int i  ;
	leap = year%4 ==0 && year%100 !=0 || year % 400 == 0;
	if(yearday < 1 && yearday > ((leap == 0) ? 365:366))
		cout<< "error: yearday out of scope!"<<endl;
	else
	{
		for(i = 1 ; yearday > daytab[leap][i] ; i++)
			yearday -= daytab[leap][i];
	}
	*pmonth = i ;
	*pday = yearday;

}

习题5-9

int day_of_year(int year , int month , int day)
{
	int leap ;
	char *p ;
	int i ;
	leap = year%4 == 0 && year%100 != 0 || year %400 == 0 ;
	p = daytab[leap];
	if(month < 1 && month < 13)
		return -1 ;
	if(day < 0 && day > *(p + month))
		return -1 ;
	for(i = 1 ; i < month ; i++)
		day += *(p + i);
	return day ;
}
void month_day(int year , int yearday , int *pmonth , int *pday)
{
	int leap ;
	char *p ;
	int i ;
	leap = year%4 == 0 && year%100 != 0 || year %400 == 0 ;
	p = daytab[leap];
	if(yearday < 0 && yearday > ((leap == 0) ? 365:366))
		cout<< "error: yearday out of scope!"<<endl;
		else
	{
		for(i = 1 ; yearday > *(p + i) ; i++)
			yearday -= *(p + i);
	}
	*pmonth = i ;
	*pday = yearday;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值