习题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;
}