- 相關(guān)推薦
C語言編程題
C語言是一種廣泛應(yīng)用于系統(tǒng)編程、嵌入式開發(fā)、軟件開發(fā)等多個領(lǐng)域的高級編程語言。它以其高效、靈活和可移植性而受到程序員的喜愛。對于初學(xué)者來說,掌握C語言的基礎(chǔ)至關(guān)重要,這包括理解基本語法、控制結(jié)構(gòu)(如選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu))、函數(shù)、指針以及數(shù)據(jù)結(jié)構(gòu)(如結(jié)構(gòu)體)。以下是小編整理的相關(guān)內(nèi)容,一起來看看吧。
C語言編程題 1
1)讀文件file1.txt的內(nèi)容(例如):
12
34
56
輸出到file2.txt:
56
34
12
(逆序)
第一題,注意可增長數(shù)組的應(yīng)用.
#include
#include
int main(void)
{
int MAX = 10;
int *a = (int *)malloc(MAX * sizeof(int));
int *b;
FILE *fp1;
FILE *fp2;
fp1 = fopen(“a.txt”,”r”);
if(fp1 == NULL)
{printf(“error1″);
exit(-1);
}
fp2 = fopen(“b.txt”,”w”);
if(fp2 == NULL)
{printf(“error2″);
exit(-1);
}
int i = 0;
int j = 0;
while(fscanf(fp1,”%d”,&a[i]) != EOF)
{
i++;
j++;
if(i >= MAX)
{
MAX = 2 * MAX;
b = (int*)realloc(a,MAX * sizeof(int));
if(b == NULL)
{
printf(“error3″);
exit(-1);
}
a = b;
}
}
for(;–j >= 0;)
fprintf(fp2,”%d\n”,a[j]);
fclose(fp1);
fclose(fp2);
return 0;
}
可謂是反序的經(jīng)典例程.
void inverse(char *p)
{
if( *p = = ‘\0′ )
return;
inverse( p+1 );
printf( “%c”, *p );
}
int main(int argc, char *argv[])
{
inverse(“abc\0″);
return 0;
}
借簽了樓上的“遞規(guī)反向輸出”
#include
void test(FILE *fread, FILE *fwrite)
{
char buf[1024] = {0};
if (!fgets(buf, sizeof(buf), fread))
return;
test( fread, fwrite );
fputs(buf, fwrite);
}
int main(int argc, char *argv[])
{
FILE *fr = NULL;
FILE *fw = NULL;
fr = fopen(“data”, “rb”);
fw = fopen(“dataout”, “wb”);
test(fr, fw);
fclose(fr);
fclose(fw);
return 0;
}
在對齊為4的情況下
struct BBB
{
long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
p=0×1000000;
p+0×200=____;
(Ulong)p+0×200=____;
(char*)p+0×200=____;
希望各位達(dá)人給出答案和原因,謝謝拉
解答:假設(shè)在32位CPU上,
sizeof(long) = 4 bytes
sizeof(char *) = 4 bytes
sizeof(short int) = sizeof(short) = 2 bytes
sizeof(char) = 1 bytes
由于是4字節(jié)對齊,
sizeof(struct BBB) = sizeof(*p)
= 4 + 4 + 2 + 1 + 1/*補(bǔ)齊*/ + 2*5 + 2/*補(bǔ)齊*/ = 24 bytes (經(jīng)Dev-C++驗證)
p=0×1000000;
p+0×200=____;
= 0×1000000 + 0×200*24
(Ulong)p+0×200=____;
= 0×1000000 + 0×200
(char*)p+0×200=____;
= 0×1000000 + 0×200*4
你可以參考一下指針運(yùn)算的細(xì)節(jié)
2、運(yùn)用四色定理,為N個局域舉行配色,顏色為1、2、3、4四種,另有數(shù)組adj[][N],如adj[i][j]=1則表示i區(qū)域與j區(qū)域相鄰,數(shù)組color[N],如color[i]=1,表示i區(qū)域的顏色為1號顏色。
四色填充
3、用遞歸算法判斷數(shù)組a[N]是否為一個遞增數(shù)組。
遞歸的方法,記錄當(dāng)前最大的,并且判斷當(dāng)前的是否比這個還大,大則繼續(xù),否則返回false結(jié)束:
bool fun( int a[], int n )
{
if( n= =1 )
return true;
if( n= =2 )
return a[n-1] >= a[n-2];
return fun( a,n-1) && ( a[n-1] >= a[n-2] );
}
4、編寫算法,從10億個浮點數(shù)當(dāng)中,選出其中最大的10000個。
用外部排序,在《數(shù)據(jù)結(jié)構(gòu)》書上有
《計算方法導(dǎo)論》在找到第n大的數(shù)的算法上加工
5、編寫一unix程序,防止僵尸進(jìn)程的出現(xiàn).
3.可怕的題目終于來了
象搜索的輸入信息是一個字符串,統(tǒng)計300萬輸入信息中的最熱門的.前十條,我們每次輸入的一個字符串為不超過255byte,內(nèi)存使用只有1G,
請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
4.國內(nèi)的一些帖吧,如baidu,有幾十萬個主題,假設(shè)每一個主題都有上億的跟帖子,怎么樣設(shè)計這個系統(tǒng)速度最好,請描述思想,寫出算發(fā)(c語言),空間和時間復(fù)雜度,
1. 簡述一個Linux驅(qū)動程序的主要流程與功能。
2. 請列舉一個軟件中時間換空間或者空間換時間的例子。
void swap(int a,int b)
{
int c; c=a;a=b;b=a;
}
—>空優(yōu)
void swap(int a,int b)
{
a=a+b;b=a-b;a=a-b;
}
6. 請問一下程序?qū)⑤敵鍪裁唇Y(jié)果?
char *RetMenory(void)
{
char p[] = “hellow world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = RetMemory();
printf(str);
}
RetMenory執(zhí)行完畢,p資源被回收,指向未知地址。返回地址,str的內(nèi)容應(yīng)是不可預(yù)測的, 打印的應(yīng)該是str的地址
寫一個函數(shù),它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出連續(xù)最長的數(shù)字串,并把這個串的長度返回,并把這個最長數(shù)字串付給其中一個函數(shù)參數(shù)outputstr所指內(nèi)存。例如:”abcd12345ed125ss123456789″的首地址傳給intputstr后,函數(shù)將返回
9,outputstr所指的值為123456789
int continumax(char *outputstr, char *inputstr)
{
char *in = inputstr, *out = outputstr, *temp, *final;
int count = 0, maxlen = 0;
while( *in != ‘\0′ )
{
if( *in > 47 && *in < 58 )
{
for(temp = in; *in > 47 && *in < 58 ; in++ )
count++;
}
else
in++;
if( maxlen < count )
{
maxlen = count;
count = 0;
final = temp;
}
}
for(int i = 0; i < maxlen; i++)
{
*out = *final;
out++;
final++;
}
*out = ‘\0′;
return maxlen;
}
不用庫函數(shù),用C語言實現(xiàn)將一整型數(shù)字轉(zhuǎn)化為字符串
方法1:
int getlen(char *s){
int n;
for(n = 0; *s != ‘\0′; s++)
n++;
return n;
}
void reverse(char s[])
{
int c,i,j;
for(i = 0,j = getlen(s) – 1; i < j; i++,j–){
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void itoa(int n,char s[])
{
int i,sign;
if((sign = n) < 0)
n = -n;
i = 0;
do{/*以反序生成數(shù)字*/
s[i++] = n%10 + ’0′;/*get next number*/
}while((n /= 10) > 0);/* the number*/
if(sign < 0)
s[i++] = ‘-’;
s[i] = ‘\0′;
reverse(s);
}
方法2:
#include
using namespace std;
void itoint num);
void itoint num)
{
int i = 0;
int j ;
char stra[10];
char strb[10];
while ( num )
{
stra[i++]=num%10+48;
num=num/10;
}
stra[i] = ‘\0′;
for( j=0; j < i; j++)
{
strb[j] = stra[i-j-1];
}
strb[j] = ‘\0′;
cout< }
int main()
{
int num;
cin>>num;
itonum);
return 0;
}
C語言編程題 2
1、請編一個函數(shù)fun,它的功能是:根據(jù)以下公式求π的值(要求滿足精度0.0005,即,某項小于0.0005時停止迭代):
程序運(yùn)行后,如果輸入精度0.0005,則程序輸出多少。
注意:部分源程序存在PROG1.C中,請勿改動主函數(shù)和其他函數(shù)中的內(nèi)容,僅在函數(shù)fun的指定的部位填入你編寫的若干語句。
試題源程序如下:
#include
#include
double fun(double eps)
{
}
main()
{ double x;
printf("Input eps:");
scanf("%lf",&x); printf("eps=%lf, PI=%lf",x,fun(x));
}
分析:
(1)本題所用基本算法應(yīng)為累加。假設(shè)累加值放在變量s中,累加項放在變量t中,累加操作由語句s=s+t;來實現(xiàn)。
(2)若稱 為第1累加項,則其前的1為第0累加項,其后的一項為第2累加項,按給定的公式可知,從第1累加項開始,后一項的累加項是前一項的值乘以 。所以當(dāng)前的累加項應(yīng)當(dāng)是:t=t*n/(2.0*n+1.0)。表達(dá)式右邊的t中是前一項的值,表達(dá)式左邊的t為當(dāng)前的每累加累加項。請注意,不要寫成:t*n/(2*n+1)而進(jìn)行整除。
(3)若第0累加項的1作為s的初值,語句:s=s+t;執(zhí)行n次,就把第1到第n項累加到了s中。每進(jìn)行一次累加,n值增1。
(4)把以上操作放在循環(huán)中。按本題規(guī)定,當(dāng)某項小于eps(0.0005)時停止迭代,因此若用while循環(huán),可用t>=eps作為控制循環(huán)進(jìn)行的條件:
while( t>=eps ){ s+=t; n++; t=t*n/(2.0*n+1); }
(5)注意應(yīng)給所用變量賦適當(dāng)?shù)某踔怠?/p>
(6)退出循環(huán)后,函數(shù)的返回值應(yīng)是:2*s。2、請編一個函數(shù)fun,其中n所指存儲單元中存放了數(shù)組中元素的個數(shù)。函數(shù)的功能是:刪除所有值為y的元素。已在主函數(shù)中給數(shù)組元素賦值,y的值由主函數(shù)通過鍵盤讀入。
注意:部分源程序存在PROG1.C中,請勿改動主函數(shù)和其他函數(shù)中的內(nèi)容,僅在函數(shù)fun的指定的部位填入你編寫的若干語句。
試題源程序如下:
#include
#define M 20
void fun(int bb[],int *n, int y)
{
}
main()
{ int aa[M]={1,2,3,3,2,1,1,2,3,4,5,4,3,2,1}, n=15, y, k;
printf("The original data is: ");
for(k=0; k
fun(aa, &n, y);
printf("The data after d %d: ",y);
for(k=0; k
}
分析:
(1)本題的基本算法是查找和刪除。
(2)若循環(huán)控制變量是i,通過for循環(huán)逐個檢查元素中的值,把數(shù)組元素中不等于y的值從頭開始重新放入bb所指的數(shù)組中。用i作為下標(biāo),逐個引用數(shù)組元素;用i作為下標(biāo),把不等于y的元素中的值逐一重新放入bb所指的數(shù)組中。這一操作可用以下語句來實現(xiàn):
if(bb[i]!=y)bb[j++]=bb[i];
(3)因為已刪除了與y值相等的元素,因此,數(shù)組中數(shù)據(jù)的個數(shù)已經(jīng)改變;所以循環(huán)結(jié)束后,需要重新給n所指變量賦值。退出循環(huán)后,變量j中存放的是刪除后數(shù)組中數(shù)據(jù)的個數(shù),通過語句*n=j;把它賦給n所指變量即可。
(4)主函數(shù)中輸出aa數(shù)組中原有的數(shù)據(jù),和刪除后的.數(shù)據(jù)?忌梢詫φ账幒瘮(shù)是否正確。3.請編寫一個函數(shù)void fun(char m,int k,int xx[]),該函數(shù)的功能是:將大于整數(shù)m且緊靠m的k個素數(shù)存入xx所指的數(shù)組中。例如,若輸入17和5,則應(yīng)輸出:19,23,29,31, 37。
注意:部分源程序存在PROG1.C中,請勿改動主函數(shù)和其他函數(shù)中的內(nèi)容,僅在函數(shù)fun的指定的部位填入你編寫的若干語句。
試題源程序如下:
#include
void fun(int m, int k, int xx[])
{
}
main()
{ int m, n, zz[100];
printf("Please enter two integers(m & n): ");
scanf("%d%d",&m,&n);
fun(m, n, zz);
for(m=0; m
printf("");
}
分析:
(1)本題的基本算法是求素數(shù)。假設(shè)有整數(shù)i,若i不能被2到i之間的任意一個數(shù)除盡,則i就是素數(shù);若一旦能被某個數(shù)除盡就不是素數(shù)。
(2)以下是求i是否為素數(shù)的基本算法:變量ok用作i是素數(shù)的標(biāo)志,ok為1,則i是素數(shù)。
ok=1;
for(p=2; p
if( i%p==0){ ok=0; break; }
if(ok)……
(3)本題要求把大于m的k個素數(shù)存入xx所指的數(shù)組中。所以,i的值應(yīng)大于m;取大于m的值逐一進(jìn)行判斷,若是素數(shù)就放入xx所指數(shù)組中。把以上語句放入一個循環(huán)中:
for( i=m+1,j=0; ? ; i++ )
{ ok=1;
for(p=2; p<=i/2; p++)
if( i%p==0 ){ ok=0; break; }
if (ok) { xx[j]=i;j++; }
}
此處,變量i統(tǒng)計存入數(shù)組中元素的個數(shù),同時作為下標(biāo)。
(4)按本題的要求,外循環(huán)結(jié)束的條件應(yīng)當(dāng)是:j
【C語言編程題】相關(guān)文章:
C語言編程練習(xí)04-05
經(jīng)典C語言面試算法題03-17
Visual C#的Excel編程03-19
C++編程簡歷表格11-22
2017年計算機(jī)二級考試C語言編程題練習(xí)題及答案03-10
C++/C程序員基本編程技能筆試10-26
C++/C程序員編程技能筆試題04-04