大一c语言期末编程题

2024-10-07 版权声明 我要投稿

大一c语言期末编程题(精选9篇)

大一c语言期末编程题 篇1

int a,b,c,s,i=0;

for(s=100;s<1000;s++)

{

c=s%10;

b=s/10%10;

a=s/100;

if(s==a*a*a+b*b*b+c*c*c)

{

printf(“%dt”,s);

++i;

if(i%5==0)

printf(“n”);

}

} } 2.求1+2!+3!+...+20!的和 #include void main(){ double fact=1.0,sum=0.0;int i,j;for(i=1;i<=20;i++){ for(j=1;j<=i;j++)fact*=j;sum+=fact;fact=1;} printf(“%.0fn”,sum);} 3.输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。#include #include void main(){ long num;int a,b,c,d;printf(“Please input the number:”);scanf(“%d”,&num);if(num<=9999||num>=100000){ printf(“%The number error!n”);exit(0);} a=num/10000;b=num/1000%10;c=num/10%10;d=num%10;if(a==d&&b==c)printf(“nYes,the %ld palindrome!n”,num);else

is is printf(“nNo,the %ld is not palindrome!n”,num);} 4.求出1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数并并按照一行5个的格式输出。

#include void main(){ int num,i=0;for(num=1;num<=1000;num++)

if(((num%7||num%11)==1)&&((num%7&&num%11)==0)){ printf(“%dt”,num);++i;if(i%5==0)printf(“n”);} } 5.编程列出200以内所有的素数,按照一行10个的格式输出,并求出所有素数的平均值,#include #include void main(){ int i,j,k=0,sum=0,avg=0;for(i=2;i<200;i++){ for(j=2;j<=sqrt(i);j++)if(i%j==0)break;if(j>sqrt(i)){ printf(“%dt”,i);++k;sum+=i;if(k%10==0)printf(“n”);} } avg=sum/k;printf(“nThe is %dn”,avg);}

average

6、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1+1/3+1/5...+1/n #include void main(){ void odd(int n);void even(int n);int n;printf(“Please input the number:”);scanf(“%d”,&n);if(n%2)odd(n);else even(n);} void odd(int n){ float sum=0.0;float j;int i;for(i=1;i<=n;i+=2){ j=1.0/i;sum+=j;} printf(“%fn”,sum);} void even(int n){ float sum=0.0;int i;float j;if(n==0)printf(“%fn”,sum);else { for(i=2;i<=n;i+=2){ j=1.0/i;sum+=j;} printf(“%fn”,sum);} }

7、已知abc+cba=1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有 组合。

#include void main(){ int a,b,c;for(a=1;a<=9;a++)for(b=0;b<=9;b++)for(c=1;c<=9;c++)

if((100*a+10*b+c+100*c+10*b+a)==1333)

printf(“a=%d,b=%d,c=%dn”,a,b,c);}

8、用户输入12个0-100之间的整数,统计出小于60,60到79,80到100三个范围的整数各有多少个? #include #include void main(){ int i,j,k,n,num;i=j=k=0;printf(“Please input the 12 numbers with 0~100:”);for(n=1;n<=12;n++){ scanf(“%d”,&num);if(!(num>=0&&num<=100))exit(0);if(num<60)++i;else if(num<80)++j;else ++k;} printf(“nThere

are

%d numbers less than 60,%d numbers between 60 and 79,%d numbers between 80 and 100.n”,i,j,k);}

9、求这样一个三位数并输出该数字,该三位数等于其每位数字的阶乘之和。

即: abc = a!+ b!+ c!#include void main(){ int a,b,c,num;int s(int);for(num=100;num<1000;num++){ a=num/100;b=num/10%10;c=num%10;if(num==s(a)+s(b)+s(c)){ printf(“The is %dn”,num);break;} } } s(int n){ int i,sum=1;for(i=1;i<=n;i++)sum*=i;

number return sum;}

10、猜数游戏:由用户随机输入一个1位正整数数让人来猜,只能猜5次,如果人猜对了,则在屏幕上显示“You are so clever”,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止或者5次都猜不对给出提示“Game Over”。#include #include void main(){ int num,i,n;printf(“Please input the number with 0~9 for guessing:”);scanf(“%d”,&num);system(“cls”);if(num<0||num>9)exit(0);for(i=1;i<=5;i++){ printf(“nPlease input the number you guess:”);scanf(“%d”,&n);if(num==n){ printf(“nYou are so clever!n”);break;} else if(n

have

%d

times left!n”,5-i);continue;} else { printf(“nThe number you input is large,go on please!You

have

%d

times left!n”,5-i);continue;} } if(i>5)Over!n“);}

11、设N是一个四位数,它的9倍恰好是其反序数(例如:123的反序数是321),求N的值。#include void main(){ int n,k,a,b,c,d;for(n=1000;n<=9999;n++){ a=n/1000;

printf(”Game b=n/100%10;c=n/10%10;d=n%10;k=1000*d+100*c+10*b+a;if(k==9*n)printf(“N=%dn”,n);} } 12、100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。#include void main(){ int h1,h2,h3;for(h1=0;h1<=100;h1++)for(h2=0;h2<=100;h2++)for(h3=0;h3<=100;h3+=2){

if(h1+h2+h3==100&&3*h1+2*h2+1/2*h3==100)printf(“The horse has has

%d,middle

old horse horse

%d,young has %dn”,h1,h2,h3);} }

13、一位司机酒驾撞人逃跑。现场三人目击事件,但都没记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。(车号为4位数)#include #include void main(){ int n,a,b,c,d,i;for(n=1000;n<=9999;n++){ a=n/1000;b=n/100%10;c=n/10%10;d=n%10;i=sqrt(n);if(a==b&&c==d&&i*i==n)printf(“%dn”,n);} } 14、求S=1/(1*2)+1/(2*3)+1/(3*4)+……前50项之和并输出结果。#include void main(){ float i;float s=0;for(i=1;i<51;i++)s+=1.0/(i*(i+1));printf(“%f”,s);}

15、编程求出所有1000到3000之间能被7、11、17同时整除的整数,并求其平均值,并输出结果(结果保留两位小数)。#include void main(){ int i,k=0,sum=0;for(i=1000;i<=3000;i++)if(i%7==0&&i%11==0&&i%17==0){ sum+=i;++k;printf(“%dt”,i);}

printf(“n%d”,sum/k);}

16、编程找出满足下列条件的所有四位数的和并输出:该数第一、三位数字之和为10,第二、四位数字之积为12。

#include #include int main(void){ int i,j,x,y,z,m;for(i = 1000;i< 10000;i++){ x = i/1000;y =(i/100)%10;z =(i/10)%10;m = i%10;if((x + z)==10&&(y+ m)==12){ printf(“%dt”,i);} } printf(“n”);return 0;}

17、求并输出所有满足如下条件的三位正整数:它是某整数的平方,它的三位数码有两位是相同的。(如100是10的平方,它有两个0,225是15的平方,它有两个2)。#include #include void main(){ int n,i,a,b,c;for(n=100;n<=999;n++){ a=n/100;b=n/10%10;c=n%10;i=sqrt(n);

if((a==b||a==c||b==c)&&n==i*i)printf(“%dt”,n);} }

18、输出所有大于1010的4位偶数,且该类偶数的各位数字两两不相同。#include void main(){ int num,a,b,c,d;

for(num=1012;num<=9999;num+=2){ a=num/1000;b=num/100%10;c=num/10%10;d=num%10;if(a!=b&&b!=c&&c!=d)printf(“%dt”,num);} }

19、编制程序要求输入整数a和b,若a+b大于100,则输出a+b百位以上的数字,否则输出两数字之和。#include 2

222void main(){ int a,b,s;printf(“Please input a and b:”);scanf(“%d%d”,&a,&b);s=a*a+b*b;if(s>100)printf(“n%dn”,s/100);else printf(“n%dn”,a+b);} 20、编写一个程序实现如下功能:计算1~100之间所有包含4或者包含5的数字,并显示其累加之和 #include void main(){ int a,b,i,sum=0;for(i=1;i<=99;i++){ a=i/10;b=i%10;

大一c语言数组实验心得 篇2

很多初学者弄不清指针和数组到底有什么样的关系,为避免混淆不清,下面总结一下指针和数组的特性。

指针是保存数据的地址,任何存入指针变量的数据都会被当作地址来处理,指针变量本身的地址由编译器另外存储,存储在哪里,我们并不知道,间接访问数据,首先取得指针变量的内容,把它作为地址,然后从这个地址读或写入数据。

指针可以用间接访问操作符(_)访问,也可以用以下标的形式访问,指针一般用于动态数据结构。

数组是用来保存数据的,数组名代表的是数组首元素的地址而不是数组的首地址,所以数组p与&p是有区别的,虽然内容相同,但意义却不同,&p才是整个数组的首地址,数组名是整个数组的名字,数组内每个元素并没有名字,不能把数组当一个整体来进行读写操作。

当然数组在初始化时也有例外,如int p[]=“12345”是合法的。

数组可以以指针的形式访问如_(p+i);也可以以下标的形式访问p[i],但其本质都是p所代表的数组首元素的地址加上i_sizeof(类型)个字节作为数据的真正地址来进行访问的。

数组通常用于存储固定数目且数据类型相同的元素。

刚开始的时候我

有点分不清指针数组和数组指针,现在也总结一下,指针数组,首先它是一个数组,数组的每个元素都是指针,可以理解为“存储指针的数组”的简称,数组指针,首先它是一个指针,它指向一个数组,在32位系统下永远只占4个字节,至于它指向的数组有多少个字节,并不知道,可以理解为“指向数组的指针”。

举个例子,int _p1[10]与int (_p2) [10], 要理解这个问题,首先要清楚操作符的优先级,“[]” 的优先级比“_”的优先级高,所以首先p1与“[10]”结合构成一个数组p1[10],int _为修饰数组的内容,所以数组元素是指向int类型的指针,所以这个是指针数组,“”的优先级比“[]”的优先级高,“_”与p2结合构成一个指针变量,int修饰数组的内容,即数组的每个元素,数组这里并没有名字,是个匿名数组,现在清楚了p2是一个指针,它指向一个包含10个int类型数据的数组,即为数组指针。

下面再说说内存管理,内存分为三个部分:静态区、堆、栈。

其实堆栈就是栈,而不是堆。

静态区是保存自动全局变量和static变量。

静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。

堆是由malloc系统函数分配内存的。

其生命周期由free和delete决定。

栈保存局部变量。

栈上的内容只在函数范围内存在,当函数运行结束,这些内容也会自动被销毁。

再说说有关内存需要注意的地方,定义了指针变量,在使用之前一定要初始化使它指向一块合法的内存,不管什么时候,我们在使用指针之前一定要确保指针是有效的。

使用malloc系列函数分配内存,使用完之后应及时释放内存,以防止内存泄露。

C语言面向对象编程学习笔记 篇3

1、在底层驱动函数前加static标识符的作用:

a:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见 b:当函数声明为static以后,编译器在该目标编译单元内只含有该函数的入口地址,没有函数名,其它编译单元便不能通过该函数名来调用该函数,这也是对1的解析与说明

2、底层驱动的封装模板

通常将存储类,显示类,AD-DA类的外设驱动函数封装为以下几个函数: Void Open(void);

此函数用于开启外设,通常函数体中包涵IO和外设的初始化 Void Close(void)此函数用于关闭外设,特别是一些在休眠下功耗很大的外设,可用mos管控制其Vcc的通断,以此达到降低系统功耗的目的

Void Read(unsigned int address,unsigned char *data[],unsigned int count)

此函数用于读取数据,参数分别为:address,地址,*data[],存放数据的数组,count,要读取的字节数

Void Write(unsigned int address,unsigned char *data[],unsigned int count)此函数用于写数据,参数功能与读函数中相似。

Void control(unsigned char cmd,unsigned char data)此函数用于控制外设的工作状态,如休眠,低功耗等等

3、命名规则

A、宏定义全部用大写

如:#define OLED_CS PBout(12)B、驱动函数名称大小写,并且动词放置在末尾如

static long _OLED_Close(void)C、结构体的名称,结构体名大写,变量名小写,“驱动”的首字母大写

如:struct OLED_DEVICE oledDevice;

4、关于外设的数据手册

大一c语言期末编程题 篇4

一、定义

管道是单向的、先进先出的,它将一个程序的输入和另一个程序的输出连接起来。数据被一个进程读出后,将被从管道中删除。分为无名和有名管道两种。前者用于父进程和子进程间的通信,后者用于同一系统的两个进程间通信。

二、无名管道

代码如下:

int pipe(int fd[2]);

其中,fd[0]用于读管道,fd[1]用于写管道。若成功则返回零,否则返回-1,错误原因存于errno中。

三、有名管道:FIFO

代码如下:

int mkfifo(const char* pathname,mode_t mode)

open时使用O_NONBLOCK,访问要求无法满足则立即出错返回。erron是ENXIO。

例子:

代码如下:

fread.c //读文件

#include

#include

#define FIFO “myfifo”

main{

int fd;

char buff[100];

if(access(FIFO,F_OK) == -1){

mkfifo(FIFO,0777);

}

fd=open(FIFO,O_RDONLY|O_NONBLOCK); //设置非阻塞打开,否则当没有输入时,会阻塞在read函数

int num;

while(1){

memset(buff,‘‘,100); //如不清空最后的字符会出现乱码

if((num=read(fd,buff,100))==0){

printf(“waiting.....n”);

sleep(1);

continue;

}

printf(“read %d in fifo , it‘s %s”,num,buff);

sleep(1);

}

}

fwrite.c //写文件

#include

#include

#include

#define FIFO “myfifo”

main(){

int fd;

char buff[100];

memset(buff,‘‘,100);

scanf(“%s”,buff);

if(access(FIFO,F_OK) == -1){

mkfifo(FIFO,0777);

}

fd=open(FIFO,O_WRONLY);

int num;

num=write(fd,buff,strlen(buff));

printf(“%d char is written! It‘s %sn”,num,buff);

}

大一c语言期末编程题 篇5

· 所需具备的背景知识

· 开发所需的基本环境

· 获得帮助的途径

· 通过一个实例了解基本步骤

Prerequisite 先决条件:

在Linux上编写 C 程序,至少要熟悉以下两方面的基础知识:

1. C语言的编程基础,至少要知道一些基本的语法,控制流程等编程常识。

对常用的标准 C 函数库有常识性的了解。

2. 对Linux/UNIX 的操作有常识性的了解,掌握常用的shell 命令,如 ls, cat, cp, mkdir …etc.

Environment 所需环境:

1. Linux/ Unix 的操作系统,也可以使用windows下的cygwin。

我们这里讨论的都是通过shell命令行进行操作的。那如果进入了图形界面的Linux 怎么办呢?只要打开一个终端命令,就和命令行环境完全一样了(打开开始菜单可以找到终端命令)。

2. 必备的开发工具:

1) 输入程序需要一个编辑器。常用的有 vi , emacs. 在命令行上输入 vi, emacs, … 就可进入编辑环境

关于 vi

关于 EMACS

2) C语言的编译器。常用的是GNU的c语言编译器 gcc(编译 C 程序), g++(编译 C ++程序)。

关于 gcc / g++

关于 makefile >>>>用于简化编译过程

这里有一片入门文章 Linux下C语言编程基础知识,可以先看一下

3) 调试程序的常用工具:gdb.

关于 gdb

Get help获得帮助:

关于 Linux 的文档是非常丰富的,

最快捷,方便,全面的资料就在你的机器里,不要浪费。

在命令行上输入shell命令 man 或者 info:

$man gcc >>>>这个命令可以获得GNU 的C语言编译器的文档。当然,他们是英文的。

关于 man

关于 info

网络上的资源也很多,多得以至于不知道什么才是自己最需要的。关于如何获得有价值的信息

看一下 loveunix 上的相关资源 >>>>

Basic steps 基本步骤:

1. 输入源代码

2. 编译,链接,运行

3. 调试程序

我们从最基本的 hello world 程序开始,实际操作一下:

1. 输入源代码

引用

$ emacs hello.c >>>>进入emacs 编辑器环境#include >>>如果你看不懂这个函数,就去好好的看c语言的书int main(){printf(“Hello World. ”); >>>>Emacs环境下,按下 Tab 键,有自动缩进功能exit(0);}

完成输入后,按住CTRL 键,按下 x, 再按下 c , 最后松开 CTRL。 >>>>程序保留并退出emacs 环境。

2. 编译,链接,运行

引用

$ gcc –o hello hello.c$ ./hello >>>>./ 指明了所执行程序的路径Hello World.$

一个linux平台上的c程序开发已经完成咯

3. 调试

如果要使用 gdb 调试程序,那么在上一步编译的时候,记得加上 –g 选项

引用

$ gcc –g –o hello hello.c$ gdb hello >>>>进入 gdb 调试环境

大一c语言期末编程题 篇6

void INT0()interrupt 0 using 1 {.........} interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt 4 指明是串行口中断;

using 0 是第0组寄存器; using 1 是第1组寄存器; using 2 是第2组寄存器; using 3 是第3组寄存器;

例如:

/*-----------------

外部中断程序-----------------*/ void ISR_Key(void)interrupt 0 using 1 { P1=~P1;

//s3按下触发一次,P1取反一次 }

/*-----------------

串口中断程序-----------------*/ void UART_SER(void)interrupt 4 //串行中断服务程序 {

unsigned char Temp;

//定义临时变量

if(RI)

//判断是接收中断产生

{

RI=0;

//标志位清零

Temp=SBUF;

//读入缓冲区的值

P1=Temp;

//把值输出到P1口,用于观察

SBUF=Temp;

//把接收到的值再发回电脑端

}

if(TI)

//如果是发送标志位,清零

C语言面试题大13 篇7

struct node

{ int data;

struct node *front,*next;

};

有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除

BOOL DeteleNode(Node *pHeader, DataType Value)

{

if (pHeader == NULL) return;

BOOL bRet = FALSE;

Node *pNode = pHead;

while (pNode != NULL)

{

if (pNode->data == Value)

{

if (pNode->front == NULL)

{

pHeader = pNode->next;

pHeader->front = NULL;

}

else

{

if (pNode->next != NULL)

{

pNode->next->front = pNode->front;

}

pNode->front->next = pNode->next;

}

Node *pNextNode = pNode->next;

delete pNode;

pNode = pNextNode;

bRet = TRUE;

//不要break或return, 删除所有

}

else

{

pNode = pNode->next;

}

}

return bRet;

}

void DE(Node *pHeadA, Node *pHeadB)

{

if (pHeadA == NULL || pHeadB == NULL)

{

return;

}

Node *pNode = pHeadA;

while (pNode != NULL)

{

if (DeteleNode(pHeadB, pNode->data))

{

if (pNode->front == NULL)

{

pHeadA = pNode->next;

pHeadA->front = NULL;

}

else

{

pNode->front->next = pNode->next;

if (pNode->next != NULL)

{

pNode->next->front = pNode->front;

}

}

Node *pNextNode = pNode->next;

delete pNode;

pNode = pNextNode;

}

else

{

pNode = pNode->next;

}

}

}

2. 编程实现:找出两个字符串中最大公共子字符串,如“abccade”,“dgcadde”的最大子串为“cad”

int GetCommon(char *s1, char *s2, char **r1, char **r2)

{

int len1 = strlen(s1);

int len2 = strlen(s2);

int maxlen = 0;

for(int i = 0; i < len1; i++)

{

for(int j = 0; j < len2; j++)

{

if(s1[i] == s2[j])

{

int as = i, bs = j, count = 1;

while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])

count++;

if(count >maxlen)

{

maxlen = count;

*r1 = s1 + i;

*r2 = s2 + j;

}

}

}

}

3. 编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数

char* test3(long num) {

char* buffer = (char*)malloc(11);

buffer[0] = “0”;

buffer[1] = “x”;

buffer[10] = “�”;

char* temp = buffer + 2;

for (int i=0; i < 8; i++) {

temp[i] = (char)(num<<4*i>>28);

temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16;

temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55;

}

return buffer;

}

输入N, 打印 N*N 矩阵

比如 N = 3,打印:

1 2 3

8 9 4

7 6 5

N = 4,打印:

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

解答:

1 #define N 15

int s[N][N];

void main

{

int k = 0, i = 0, j = 0;

int a = 1;

for( ; k < (N+1)/2; k++ )

{

while( j < N-k ) s[i][j++] = a++; i++; j--;

while( i < N-k ) s[i++][j] = a++; i--; j--;

while( j >k-1 ) s[i][j--] = a++; i--; j++;

while( i >k ) s[i--][j] = a++; i++; j++;

}

for( i = 0; i < N; i++ )

{

for( j = 0; j < N; j++ )

cout << s[i][j] << “ ”;

cout << endl;

}

}

2 define MAX_N 100

int matrix[MAX_N][MAX_N];

/*

*(x,y):第一个元素的坐标

* start:第一个元素的值

* n:矩阵的大小

*/

void SetMatrix(int x, int y, int start, int n) {

int i, j;

if (n <= 0) //递归结束条件

return;

if (n == 1) { //矩阵大小为1时

matrix[x][y] = start;

return;

}

for (i = x; i < x + n-1; i++) //矩阵上部

matrix[y][i] = start++;

for (j = y; j < y + n-1; j++) //右部

matrix[j][x+n-1] = start++;

for (i = x+n-1; i >x; i--) //底部

matrix[y+n-1][i] = start++;

for (j = y+n-1; j >y; j--) //左部

matrix[j][x] = start++;

SetMatrix(x+1, y+1, start, n-2); //递归

}

void main() {

int i, j;

int n;

scanf(“%d”, &n);

SetMatrix(0, 0, 1, n);

//打印螺旋矩阵

for(i = 0; i < n; i++) {

for (j = 0; j < n; j++)

printf(“%4d”, matrix[i][j]);

printf(“”);

}

}

斐波拉契数列递归实现的方法如下:

int Funct( int n )

{

if(n==0) return 1;

if(n==1) return 1;

retrurn Funct(n-1) + Funct(n-2);

}

请问,如何不使用递归,来实现上述函数?

请教各位高手!

解答:int Funct( int n ) // n 为非负整数

{

int a=0;

int b=1;

int c;

if(n==0) c=1;

else if(n==1) c=1;

else for(int i=2;i<=n;i++) //应该n从2开始算起

{

c=a+b;

a=b;

b=c;

}

return c;

}

解答:

现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位,

C语言面试题大汇总13

100 的二进制是 001 100 100

低位在前 高位在后

001----s3

100----s2

100----s1

所以结果应该是 1

如果先申明的在低位则:

001----s1

100----s2

100----s3

结果是 4

1、原题跟little-endian,big-endian没有关系

2、原题跟位域的存储空间分配有关,到底是从低字节分配还是从高字节分配,从Dev C++和VC7.1上看,都是从低字节开始分配,并且连续分配,中间不空,不像谭的书那样会留空位

3、原题跟编译器有关,编译器在未用堆栈空间的默认值分配上有所不同,Dev C++未用空间分配为

01110111b,VC7.1下为11001100b,所以在Dev C++下的结果为5,在VC7.1下为1。

注:PC一般采用little-endian,即高高低低,但在网络传输上,一般采用big-endian,即高低低高,华为是做网络的,所以可能考虑big-endian模式,这样输出结果可能为4

判断一个字符串是不是回文

int IsReverseStr(char *aStr)

{

int i,j;

int found=1;

if(aStr==NULL)

return -1;

j=strlen(aStr);

for(i=0;i

if(*(aStr+i)!=*(aStr+j-i-1))

{

found=0;

break;

}

return found;

}

Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

数组实现:

#include

#include

int Josephu(int n, int m)

{

int flag, i, j = 0;

int *arr = (int *)malloc(n * sizeof(int));

for (i = 0; i < n; ++i)

arr[i] = 1;

for (i = 1; i < n; ++i)

{

flag = 0;

while (flag < m)

{

if (j == n)

j = 0;

if (arr[j])

++flag;

++j;

}

arr[j - 1] = 0;

printf(“第%4d个出局的人是:%4d号”, i, j);

}

free(arr);

return j;

}

int main()

{

int n, m;

scanf(“%d%d”, &n, &m);

printf(“最后胜利的是%d号!”, Josephu(n, m));

system(“pause”);

return 0;

}

链表实现:

#include

#include

typedef struct Node

{

int index;

struct Node *next;

}JosephuNode;

int Josephu(int n, int m)

{

int i, j;

JosephuNode *head, *tail;

head = tail = (JosephuNode *)malloc(sizeof(JosephuNode));

for (i = 1; i < n; ++i)

{

tail->index = i;

tail->next = (JosephuNode *)malloc(sizeof(JosephuNode));

tail = tail->next;

}

tail->index = i;

tail->next = head;

for (i = 1; tail != head; ++i)

{

for (j = 1; j < m; ++j)

{

tail = head;

head = head->next;

}

tail->next = head->next;

printf(“第%4d个出局的人是:%4d号”, i, head->index);

free(head);

head = tail->next;

}

i = head->index;

free(head);

return i;

}

int main()

{

int n, m;

scanf(“%d%d”, &n, &m);

printf(“最后胜利的是%d号!”, Josephu(n, m));

system(“pause”);

return 0;

}

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc);

1.不调用库函数,实现strcpy函数。

2.解释为什么要返回char *。

解说:

1.strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc)

{

if ((strDest==NULL)||(strSrc==NULL)) file://[/1]

throw “Invalid argument(s)”; //[2]

char * strDestCopy=strDest; file://[/3]

while ((*strDest++=*strSrc++)!=“�”); file://[/4]

return strDestCopy;

}

错误的做法:

[1]

(A)不检查指针的有效性,说明答题者不注重代码的健壮性。

(B) 检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false 三个关键字以提供更安全的条件表达式。

(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。

[2]

(A)return new string(“Invalid argument(s)”);,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。

(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。

[3]

(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。

[4]

(A)循环写成while (*strDest++=*strSrc++);,[1](B)。

c语言中期考核试题3 篇8

一、单项选择题(每小题3分,共30分)

1、选出下列标识符中不是合法的标识符的是()。

A.hot_do B.cat1 C._pri D.2ab

2、为了避免嵌套的条件分支语句if-else的二义性,C语言规定:C程序中的else总是与()组成配对关系。

A.缩排位置相同的if B.在其之前未配对的if C.在其之前未配对的最近的if D.同一行上的if

3、以下程序的输出结果是()。main(){ int a=5,b=6;printf(“%d %dn”, a--,++b);} A.5 6 B.5 7 C.4 6 D.4 7

4、设有如下定义: int x=10,y=3,z;则语句printf(“%dn”,z=(x%y,x/y));的输出结果是(A.4 B.3 C.1 D.0

5、设整型变量a为5,使b不为2的表达式是()。

A.b=a/2 B.b=6-(--a)C.b=a%2 D.b=a>3?2:1

6、以下程序段的输出结果是()。

int a=5;float x=3.14;a*=x*(‘E’-‘A’);

printf(“%fn”,(float)a);

A.62.000000 B.62.800000 C.63.000000 D.62

7、以下程序的输出结果是()。

main(){ int a=0,i;for(i=0;i<4;i++){ switch(i){ case 0:

case 1: a+=3;break;case 2: a+=2;default: a+=5;} } printf(“%dn”,a);} A.18 B.17 C.16 D.12

8、若有定义:int a=5,b=2,c;,执行语句c=a/b+0.5;后,c的值为()A.2 B.2.0 C.2.5 D.3

9、以下程序执行后输出结果是()

main(){ int i=1,j=1,k=2;if((j++‖k++)&&i++)printf(“%d,%d,%dn”,i,j,k);

} A)1,1,2 B)2,2,1 C)2,2,2 D)2,2,3

10、以下对二维数组a进行正确初始化的是()

A.int a[2][3]={{1,2},{3,4},{5,6}};B.int a[ ][3]={1,2,3,4,5,6};C.int a[2][ ]={1,2,3,4,5,6};D.int a[2][ ]={{1,2},{3,4}};

二、读程序写结果题(每小题4分,共计20分)

1、float f=3.1415927;printf(“%f,%3.3f”,f,f);

则输出结果是(1)。

。)

2、int x=6, y=7;printf(“%d,”,x++);printf(“%dn”,++y);输出结果是(2)。

3、a=3;a+=(a<1)?a:1;printf(“%d”,a);输出结果是(3)。

4、for(a=1,b=1;a<=100;a++){ if(b>=20)break;if(b%3==1){ b+=3;continue;} b-=5;} 程序的输出结果a的值为(4)

5、int y=1, x, *p, a[ ]={2,4,6,8,10};p=&a[1];for(x=0;x<3;x++)y + = *(p + x);printf(“%dn”,y);程序的输出结果y的值是(5)

三、程序填空题(每空3分,共15分)

1、从键盘上输入10个数,求其平均值。main(){ int i;float f,sum;for(i=1,sum=0.0;i<11;i++){(1);(2);}printf(“average=%fn”,sum/10);}

2、以下程序的功能是:从键盘上输入若干个学生的成绩, 统计并输出最高成绩和最低成绩,当输入负数时结束输入.main(){ float x,amax,amin;scanf(“%f”,&x);amax=x;amin=x;while((3)){ if(x>amax)amax=x;(4)amin=x;scanf(“%f”,(5));}printf(“namax=%fnamin=%fn”,amax,amin);}

四、编程题(共35分)

面试题 用C语言实现乘法口诀表 篇9

#include < stdio. h>void main{ int i,j; for(i =1;i <=9;i ++) { for(j =1;j <=9;j ++) printf( “%d*%d=%2d ”,i,j,i* j); printf( “n”); } return 0;}

这个题主要是想用两个for循环嵌套使用,要注意之间的关系,printf( “%d*%d=%2d ”,i,j,i* j);这个语句可以使得运行结果右对齐,排版好看,

面试题 用C语言实现乘法口诀表

上一篇:学文明礼仪 做时代新人下一篇:产品设计师求职信