編程區(qū):《《《《冒泡排序,二分查找,篩選法,的考察》》》》
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\n");
exit(0);
}
printf("\nA contents are:\n");
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\n");
exit(0);
}
printf("\nB contents are :\n");
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("\nC fileis:\n");
fp=fopen("C","w");
for(i=0;i
{
putc(c[i],fp);/將字符一個個寫入文件中/
putchar(c[i]);/一個個輸出字符/
}
fclose(fp);
return 1;
}
86.有一浮點型數(shù)組A,用C語言寫一函數(shù)實現(xiàn)對浮點數(shù)組A進行降序排序,并輸出結(jié)果,要求要以數(shù)組A作為函數(shù)的入口.(建議用冒泡排序法)
#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; //發(fā)生了交換,故將交換標志置為真
}
}
if(!exchange) //本趟排序未發(fā)生交換,提前終止算法
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 :\n");
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之內(nèi)的質(zhì)數(shù)
#include
using namespace std;
#define N 100
int main()
{
/0~100共101個數(shù)/
int sieve[N + 1];
int i;
//step 1:初始化(sieve[i] = 0 表示不在篩中,即不是質(zhì)數(shù);1表示在篩中)
sieve[0]=sieve[1]=0;
for(int i = 2; i <= N; i++)
{
sieve[i] = 1;
}
//step 2:偶數(shù)(2的倍數(shù))肯定不是質(zhì)數(shù),所以應該先篩除
for(i = 2; i <= N / 2; i++)
{
sieve[i 2] = 0;
}
int p = 2; //第一個質(zhì)數(shù)是2
//step 3:從sieve中刪去P的倍數(shù)
while(p p <= N)
{
p = p + 1; //選下一個p
while(sieve[p] == 0)
{
p++;
}
int t = p p;
int s = 2 p;/質(zhì)數(shù)與質(zhì)數(shù)之和包含合數(shù),但質(zhì)數(shù)于合數(shù)之和必為質(zhì)數(shù),提高算法效率/
while(t <= N)
{
sieve[t] = 0; //刪除
t = t + s;
}
}
//step 4: 輸出結(jié)果
for(i = 2; i <= N; i++)
{
if(sieve[i] != 0)
{
cout<
內(nèi)存復制:
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;
}
注意:內(nèi)存拷貝時要避免內(nèi)存空間重疊的問題,(即pvfrom與pvto所指向的內(nèi)存不能重疊)
為了防止內(nèi)存空間重疊,若是目標地址高于源地址,從后往前復制;
若是源地址高于目標地址,從前往后復制;
《《《《查找字符串中的子串》》》》
84、請編寫一個C 函數(shù),該函數(shù)在一個字符串中找到可能的最長的子字符串,該字符串是由同一字符組成的。
#include
#include
#include
int ChildString(charp)
{
char q=p;
int stringlen=0, i=0,j=1,len=0,maxlen=1;
//stringlen=strlen(p);
while(q!='\0') //不能用strlen,求得長stringlen
{
stringlen++;
q++;
}
while( i< stringlen)
{
if((p+i)==(p+j)&&j< stringlen)
{
len++; //統(tǒng)計子串長度
i++;
j++;
}
else
{
if(len>=maxlen) //統(tǒng)計最大子串長度
{
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):\n");
scanf("%s",arr);
len=ChildString(arr);
printf("the len of childarr is:%d\n",len);
return 1;
}
99. 計算字符串中子串出現(xiàn)的次數(shù)
方法1;
int main(int argc,char argv[])
{
char str1[20],str2[20],p1,p2;
int sum=0;
printf("pleaseinput two strings\n");
scanf("%s%s",str1,str2);
p1=str1;
p2=str2;
while(p1!='\0')
{
if(p1==p2)
{
while((p1++==p2++) && p2!='\0'); /不斷比較字符串1與2,至字符串2到達‘\0’/
}
else
p1++; /如果,字符串2一次匹配已結(jié)束,或者 此刻p1與p2不等;/
if(p2=='\0') /如果是字符串2結(jié)束,則成功找到一次,sum++/
sum++;
p2=str2; /p2始終指向str2;/
}
printf("%d",sum);
return 1;
}
方法2:
#include
#include
#include
//判斷兩字符串是否相等,相等返回1,不等返回0
int Judge(char movePt,char tempPt)
#if 1
{
int ret=0 ;
while( !(movePt-tempPt) && tempPt)
{
movePt++;
tempPt++;
}
if(tempPt=='\0')
{
ret=1;
}
return ret;
}
#endif
#if 0
{
int i;
for(i=0; i
{
if(movePt != tempPt[i])
return 0;
return 1;
}
}
#endif
//計算子串出現(xiàn)的次數(shù),str為原字符串,sub為子串
int StrCount(char str,char sub)
{
int count = 0;
char move = str;
if( strlen(str) < strlen(sub) )
{
return 0;
}
else
{
while( strlen(move) >= strlen(sub) )
{
printf("%s\n",move);
if(Judge(move,sub))
{
count++;
printf("count++");
}
move++;
}
}
return count;
}
int main(int argc,char argv[])
{
char arr1[20];
char arr2[20];
int num;
printf("please input two arrs:");
scanf("%s%s",arr1,arr2);
num=StrCount(arr1,arr2);
printf("the num is :%d\n",num);
return 1;
}
90、輸入一行字符,統(tǒng)計其中有多少個單詞。
int main(int argc,char argv[])
{
char string[81];
int i,num=0;//word=0;
char c;
gets(string); /不能用scanf,視空格為終結(jié)/
for(i=0;(c=string[i])!='\0';i++)
{
if(c==' ')
num++;
}
num++;
printf("Thereare %d words in theline\n",num);
return 1;
}
83、請編寫一個C 函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返回該字符所在位置索引值。
intsearch(char cpSource, int n, char ch) //起始地址,搜索長度,目標字符
{
int i;
for(i=0; i
return i;
}
《《《《數(shù)字問題,水仙花數(shù),/和%的用法》》》》
98某個公司采用公用電話傳遞數(shù)據(jù),數(shù)據(jù)是四位的整數(shù),在傳遞過程中是加密的,加密規(guī)則如下:每位數(shù)字都加上5,然后用和除以10的余數(shù)代替該數(shù)字,再將第一位和第四位交換,第二位和第三位交換。
#include
#include
int main(int argc,char argv[])
{
int a,i,aa[4],t;
scanf("%d",&a);
aa[0]=a%10;
aa[1]=a%100/10;
aa[2]=a%1000/100;
aa[3]=a/1000;
for(i=0;i<=3;i++)
{
aa[i]+=5;
aa[i]%=10;
}
for(i=0;i<=3/2;i++)
{
t=aa[i];
aa[i]=aa[3-i];
aa[3-i]=t;
}
for(i=3;i>=0;i--)
printf("%d",aa[i]);
return 1;
}
97、809??=800??+9??+1其中??代表的兩位數(shù),8??的結(jié)果為兩位數(shù),9??的結(jié)果為3位數(shù)。求??代表的兩位數(shù),及809??后的結(jié)果。
output(longb,long i)
{
printf("\n%ld/%ld=809%ld+%ld",b,i,i,b%i);
}
int main()
{
long int a,b,i;
a=809;
for(i=10;i<100;i++)
{
b=ia+1;
if(b>=1000&&b<=10000&&8i<100&&9i>=100)
output(b,i);
}
}
92、有1、2、3、4個數(shù)字,能組成多少個互不相同且無重復數(shù)字的三位數(shù)?都是多少?
#include "stdio.h"
Int main()
{
inti,j,k;
printf("\n");
for(i=1;i<5;i++) /以下為三重循環(huán)/
for(j=1;j<5;j++)
for (k=1;k<5;k++)
{
if (i!=k&&i!=j&&j!=k) /確保i、j、k三位互不相同/
printf("%d,%d,%d\n",i,j,k);
}
}
水仙花束問題:
#include
int main()
{
int i;
int num=0;
for(i=100;i<=999;i++)
{
int H,T,G,A;
H =i/100;
T=i/10%10;
G =i%10;
A =HHH +TTT + GGG;
if(A==i )
{
printf("%5d",i);
num++;
}
}
printf("thenum is %d\n",num);
return 1;
}
《《《《有關位操作的問題》》》》
93.取一個整數(shù)a從右端開始的4~7位。
Int main()
{
unsigned a,b,c,d;
scanf("%o",&a); /scanf("%x",&a);16進制/
b=a>>4;
c=~(~0<<4);// ~的優(yōu)先級大于<<;
/~0,11111111->11110000->括號外面00001111,保證低4位為1111/
d=b&c;
printf("%o\n%o\n",a,d);
}
運行結(jié)果:輸入:1234
輸出:
1234
11(8進制)
78、請編寫一個C 函數(shù),該函數(shù)給出一個字節(jié)中被置1 的位的個數(shù)。
#include
#include
unsigned char CheckSetBitNum(unsigned char ucNumber)
{
unsigned char i;
unsigned char iResult=0;
for(i=0;i<8;i++)
{
iResult+= (ucNumber>>i) & 0x01; //第i位是1則加1,否則加0,位移動操作不改變原值
printf("ucNumber>>%d=%d\n",i,ucNumber>>i);
printf("iResult=%d\n",iResult);
}
return iResult;
}
int main(int argc,char argv[])
{
unsigned char a;
int num;
scanf("%c",&a);
num=CheckSetBitNum(a);
printf("%d",num);
return 1;
}
方法2:
int count(int x)
{
int i,y,sum=0;
for (i=0;i<8;i++)
{
y=x%2; /這是移出去的值/
x=x/2; /對于整數(shù)右移一次后x的值相當于右移前的值除以2/
if (y==1) sum+=1;
}
return sum;
}
int main(int argc,char argv[])
{
int x;
scanf("%d",&x);
printf("%d",count(x));
return 0;
}
《《《《字符串與整數(shù)互換》》》》
79、請編寫一個C 函數(shù),該函數(shù)將給定的一個字符串轉(zhuǎn)換成整數(shù)。
int main(int argc,char argv[])
{
char arr[20];
char str=arr;
int num=0;
int digital;
printf("please input a string");
scanf("%s",arr);
while(str!='\0')
{
digital=str-48;
num=num10+digital;
str=str+1;
}
printf("the result is %d",num);
return 1;
}
字符串倒置
int main(int argc,charargv[])
{
char str="hello world";
char des=NULL;
int len=strlen(str);
des=(char)malloc(len+1);//結(jié)尾封口添0;
char d=des;
char s=&str[len-1];//指向最后一個字符;
while(len--!=0)
d++=s--;
d='\0';//封口
printf("%s\n",des);
free(des);
return 1;
《《《《數(shù)組》》》》
94. 打印出楊輝三角形
int main()
{
int i,j,arr[11][11];
for(i=1;i<=10;i++)
for(j=1;j<=i;j++)
{
if(j==1||i==j)
arr[i][j]=1;
else
arr[i][j]=arr[i-1][j-1]+arr[i-1][j];
}
for(i=1;i<=10;i++)
for(j=1;j<=i;j++)
{
printf("%5d",arr[i][j]);
if(i==j)
printf("\n");
} return 1;
}
71.一語句實現(xiàn)x是否為2的若干次冪的判斷。
void main()
{
int a;
scanf(“%d”,&a); printf(“%c”,(a)&(a-1)?’n’:’y’);
// 若是打印y,否則n
2的n次冪用2進制表示一定是10,100,1000,10000......
對應的i-1就是1,11,111,1111....
i &(i-1)為false(也就是0)時就是返回true
程序分析題
class A
{
public:
A(int a)
{
printf("%d ",a);
}
};
A a(1);
int main(void)
{
printf("main ");
A c(2);
static A b(3);
return 0;
}
答案:、1 main 2 3
【函數(shù)體外】
只能存在聲明語句或定義語句(實際上函數(shù)體外的聲明語句都是定義語句,如果沒有初始化,會隱式的初始化,對于基本類型初始化為零,對于類類型則調(diào)用相應的構(gòu)造函數(shù)),
不能存在表達式語句,包括函數(shù)調(diào)用語句。
2.
struct Test
{
unsigned short int a:5;
unsigned short int b:5;
unsigned short int c:6;
};
int main(intargc,char argv[])
{
struct Test test;
test.a=16;
test.b=4;
test.c=0;
int j=sizeof(test);
int i=(short)&test;
printf("%d\n",i);
printf("sizeof %d\n",j);
return 0;
}
0000 0000 1001 0000
小端機器結(jié)果將是:16+128=144,選B
60.main()
{
Int a[5]={1,2,3,4,5};
intptr=(int)(&a+1);
int ptr2=(int)((int)a+1);
printf(“%d,%d,%d”,(a+1),(ptr-1),ptr2); 結(jié)果:2,5,2
}
地址 0-3 4-7 8-11 12-15 16-19 20-23
數(shù)值 1 2 3 4 5
&a+1 就是地址為20的地方
ptr1[-1]就是20-4=16這個地方 一個Int 占用4個地址
(int)a+1 跟(int)a+1不一樣 前者地址為1 后者為4,
所以,int ptr2=(int)((int)a+1);ptr2表示的是指向地址為1的指針地址
要點:指針進行運算,加數(shù)與指針類型相關,一般(char),一個字節(jié);(int),4個字節(jié);
若是指向結(jié)構(gòu)體,或者是數(shù)組的指針,由具體(sizeof)長度決定;
詳見:點擊打開鏈接
#include
#include
int main()
{
int a[4]={1,2,3,4};
int ptr1=(int )(&a+1);
int ptr2=(int )((int)a+1);
printf("%x,%x",ptr1[-1],ptr2);
return 0;
}
小端字節(jié):ptr2=0x2000000;
大端字節(jié):ptr2=0x100;
62
#define SQUARE(a)((a)(a))
int a=5;
int b;
b=SQUARE(a++);
在同一個式子中有兩次以上修改變量內(nèi)容的副作用時,是未定義行為。
C語言規(guī)定a++的自增副作用應該發(fā)生在下一個序列點之前,但是乘法、括號和賦值都不是序列點,只有整個表達式結(jié)束時才是。在此之前a自增副作用發(fā)生的時機是未定義的。 每個編譯器的結(jié)果不同,結(jié)果是25或者36(不提倡在一個表達式中對變量進行兩次后自增操作)
63、#define Max_CB500
void LmiQueryCSmd(StructMSgCB pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum
{
......;
}
}這段代碼執(zhí)行有什么問題?
【標準答案】死循環(huán)
unsigned char //無符號字符型表示范圍0~255
char //有符號字符型表示范圍-128~127