编程区:《《《《冒泡排序,二分查找,筛选法,的考察》》》》
100、
有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中.
#include
#include
int main(int argc,char* argv[])
{
FILE* fp;
int i,j,k,num,NUM;
char c[50],t,ch;
if((fp=fopen("A","r"))==NULL)
/*can be replaced by open
* int fd=open("A",O_RDONLY|O_CREAT);*/
{
printf("fileA cannot be opened ");
exit(0);
}
printf(" A contents are: ");
for(i=0;(ch=fgetc(fp))!=EOF;i++)/*一个字符一个字符读*/
{
c[i]=ch;
putchar(c[i]);
}
num=i+1;
fclose(fp);
if((fp=fopen("B","r"))==NULL)
{
printf("fileB cannot be opened ");
exit(0);
}
printf(" B contents are : ");
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{
c[num+i]=ch;
putchar(c[num+i]);
}
fclose(fp);
NUM=num+i+1;
for(k=0;k
{
for(j=0;j
{
if(c[j]>c[j+1])
{
t=c[j];
c[j]=c[j+1];
c[j+1]=t;
}
}
}
printf(" C fileis: ");
fp=fopen("C","w");
for(i=0;i
{
putc(c[i],fp);/*将字符一个个写入文件中*/
putchar(c[i]);/*一个个输出字符*/
}
fclose(fp);
return 1;
}
86.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)
#include
#include
void BubbleSort(int arr[], int n)
{
int i,j;
int exchange = 1;//交换标志,提高算法效率;
int temp;
for(i=0;i
{
exchange=0;//本趟排序开始前,交换标志应为假
for(j=0;j
{
if(arr[j+1] > arr[j])
{
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
exchange=1; //发生了交换,故将交换标志置为真
}
}
if(!exchange) //本趟排序未发生交换,提前终止算法
return;
}
}
int main(int argc,char* argv[])
{
int arr[5]={1,4,2,6,5};
int i;
BubbleSort(arr, 5);
printf("after sort,arr is : ");
for(i=0;i<5;i++)
{
printf("%3d",arr[i]);
}
return 1;
}
77.写出二分查找的代码:
Int binary_search(int* arr,int key,int size)
{
Intmid;
Intlow=0;
Int high=size-1;
While(low<=high)
{
Mid=(low+high)/2;
If(arr[mid]>key)
High=mid-1;
ElseIf(arr[mid]
Low=mid+1;
Else
Return mid;
}
Return -1;
}
补充1:用帅选法查找100之内的质数
#include
using namespace std;
#define N 100
int main()
{
/*0~100共101个数*/
int sieve[N + 1];
int i;
//step 1:初始化(sieve[i] = 0 表示不在筛中,即不是质数;1表示在筛中)
sieve[0]=sieve[1]=0;
for(int i = 2; i <= N; i++)
{
sieve[i] = 1;
}
//step 2:偶数(2的倍数)肯定不是质数,所以应该先筛除
for(i = 2; i <= N / 2; i++)
{
sieve[i * 2] = 0;
}
int p = 2; //第一个质数是2
//step 3:从sieve中删去P的倍数
while(p * p <= N)
{
p = p + 1; //选下一个p
while(sieve[p] == 0)
{
p++;
}
int t = p * p;
int s = 2 * p;/*质数与质数之和包含合数,但质数于合数之和必为质数,提高算法效率*/
while(t <= N)
{
sieve[t] = 0; //删除
t = t + s;
}
}
//step 4: 输出结果
for(i = 2; i <= N; i++)
{
if(sieve[i] != 0)
{
cout<
内存复制:
void* memcpy(void* pvTo, constvoid* pvFrom, size_tsize)
{
assert((pvTo!= NULL) &&(pvFrom!= NULL));
byte* pbTo= pvTo;
byte* pbFrom= pbFrom;
while (size--> 0)
{
*pbTo++ = *pbFrom++;
}
return pvTo;
}
注意:内存拷贝时要避免内存空间重叠的问题,(即pvfrom与pvto所指向的内存不能重叠)
为了防止内存空间重叠,若是目标地址高于源地址,从后往前复制;
若是源地址高于目标地址,从前往后复制;
《《《《查找字符串中的子串》》》》
84、请编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,该字符串是由同一字符组成的。
#include
#include
#include
int ChildString(char*p)
{
char* q=p;
int stringlen=0, i=0,j=1,len=0,maxlen=1;
//stringlen=strlen(p);
while(*q!=' ') //不能用strlen,求得长stringlen
{
stringlen++;
q++;
}
while( i< stringlen)
{
if(*(p+i)==*(p+j)&&j< stringlen)
{
len++; //统计子串长度
i++;
j++;
}
else
{
if(len>=maxlen) //统计最大子串长度
{
maxlen=len+1;
len=0;
}
else
len=0;
i++;
j++;
}
}
return maxlen;
}
int main(int argc,char* argv[])
{
char arr[11];
int len;
printf("please input chararr(10): ");
scanf("%s",arr);
len=ChildString(arr);
printf("the len of childarr is:%d ",len);
return 1;
}
99. 计算字符串中子串出现的次数
方法1;
int main(int argc,char* argv[])
{
char str1[20],str2[20],*p1,*p2;
int sum=0;
printf("pleaseinput two strings ");
scanf("%s%s",str1,str2);
p1=str1;
p2=str2;
while(*p1!=' ')
{
if(*p1==*p2)
{
while((*p1++==*p2++) && *p2!=' '); /*不断比较字符串1与2,至字符串2到达‘