三道题+作业题

来源:互联网 发布:extjs4 获取grid数据 编辑:程序博客网 时间:2024/06/08 05:21

三道图片题:

1、

 

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

int *maximumNumbers(const int *num,int numsSize)

{

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

int max=abs(num[0])+abs(num[1])+abs(num[2]);

int *index=(int *)malloc(3*sizeof(int));

if(index==NULL)

{

printf("error");

return index;

}

index[0]=num[0];

index[1]=num[1];

index[2]=num[2];

for(i=0;i<numsSize-2;i++)

{

for(j=i+1;j<numsSize-1;j++)

{

for(k=j+1;k<numsSize;k++)

{

if(abs(num[i])+abs(num[j])+abs(num[k])>max)

{

max=abs(num[i])+abs(num[j])+abs(num[k]);

index[0]=num[i];

index[1]=num[j];

index[2]=num[k];

}

}

}

}

return index;

}

int main()

{

int a[8]={12,5,-5,1,4,-10,2,6};

int *index=maximumNumbers(a,8);

printf("%d  %d  %d\n",*index,*(index+1),*(index+2));

return 0;

}

 

2、

 

#include<stdio.h>

int num_spy(int num)

{

int jud=num;

while(num)

{

int temp=num;

int a=num;

while(a>0)

{

temp=temp-a%10;

a=a/10;

}

if(temp>=jud)

return num;

num++;

}

}

int main()

{

printf("请输入要转换的整数:\n");

int num;

scanf("%d",&num);

int ret=num_spy(num);

printf("%d\n",ret);

return 0;

}

 

 

3、

 

#include<stdio.h>

int func(int a,int b,int m)

{

int i=0,temp=1;

for(i=b;i>0;i--)

temp=temp*a;

return temp%m;

}

int main()

{

int a,b,m;

printf("输入三个非负整数a b m,其中m不为0\n");

scanf("%d%d%d",&a,&b,&m);

int ret=func(a,b,m);

printf("输出结果为:%d\n",ret);

return 0;

}

 

 

12.9三道题:

1

(1)分析程序, 写出输出结果?

/* char *ptr;

if ((ptr = (char *)malloc(0)) == NULL)

puts("Got a null pointer");

else

puts("Got a valid pointer");

 

解:

(答案)Got a valid pointer

原因:malloc有默认最小分配空间,所以指针不为NULL

 

(2) 分析程序, 写出输出结果?

char * GetStr()

{

char *tmp;

tmp = "123"

return tmp;

}

void main()

{

printf("%s.\n", GetStr());

}

*/

 

解:

(答案)123.

原因:字符串常量放在代码段或者常量区,在子函数只执行完后空间不会被销毁;

 

2、输入一个正整数,输出原数并逆序打印出各位数字。

//例如:原数:123456 逆序:654321

//逆序函数原型:int invers_int(int x)(需要用到递归实现)

 

解:

#include<stdio.h>

int invers_int(int x)

{

if(x>0&&x<=9)

{

printf("%d\n",x);

return 0;

}

else

{

printf("%d",x%10);

return  invers_int(x/10);

}

}

int main()

{

int a=123456;

printf("%d\n",a);

invers_int(a);

return 0;

}

 

3、按以下规律翻译密码:将每一个字母变成它后面的字母,例如,将A变成B,B变成C,…,Z变成A,非字母字符不变,“!”作为电文结束标志。

解:

#include<stdio.h>

void translate(char *p)

{

while(*p!='!')

{

if((*p>=65&&*p<=90)||(*p>=97&&*p<=122))

{

if(*p==90)

*p=65;

else if(*p==122)

*p=97;

else

*p=*p+1;

}

p++;

}

 

}

 

void func()

{

char ch;

printf("输入字符串,!代表结束\n");

while((ch=getchar())!='!')

{

if((ch>=65&&ch<=90)||(ch>=97&&ch<=122))

{

if(ch==90)

ch=65;

else if(ch==122)

ch=97;

else

ch=ch+1;

}

printf("%c",ch);

}

printf("\n");

}

int main()

{

/*

char str[]="aczeA126FGJZ!";

translate(str);

printf("%s\n",str);

*/

func();

return 0;

}

 

12.16三道题:

1、编写程序:读入一个在字母C和X之间的字符,打印出该字母在中间的相邻五个字母。

如:输入F,则输出DEFGH.

函数原型:void func(char ch)

 

解:

#include<stdio.h>

void func(char ch)

{

if((ch>'C')&&(ch<'X'))

printf("%c%c%c%c%c\n",ch-2,ch-1,ch,ch+1,ch+2);

}

int main()

{

printf("输入一个在C与X之间的字符\n");

char ch=0;

scanf("%c",&ch);

func(ch);

return 0;

}

 

2、一个球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第十次反弹多高。

 

解:

#include<stdio.h>

int main()

{

int i=1;

int num=10;

float a=100;

float b=100;

for(i=2;i<=num;i++)

{

a=a/2;

b=a*2+b;

}

a=a/2;

printf("第十次落地前经过了:%f\n",b);

printf("第十次弹起:%f\n",a);

return 0;                                                                                                                                                                              

}

 

3、编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。

函数原型:PS:故意这么写的,别给乱换

void show_time(int *year, int *month, int *date, int *hour, int *minute, int *second)

 

解:

#include<stdio.h>

void show_time(int *year,int *month,int *date,int *hour,int *minute,int *second)

{

if(*second==59)

{

*second=0;

if(*minute==59)

{

*minute=0;

if(*hour==23)

{

*hour=0;

switch(*month)

{

case 1:case 3:case 5:case 7:case 8:case 10:

{

if(*date==31)

{

*date=1;

*month=*month+1;

}

else

*date=*date+1;

break;

}

case 4:case 6:case 9:case 11:

{

if(*date==30)

{

*date=1;

*month=*month+1;

}

else

*date=*date+1;

break;

}

case 2:

{

if(*year%100)

{

if(!(*year%4))

{

if(*date==28)

{

*date=1;

*month=*month+1;

}

else

*date=*date+1;

break;

}

else

{

if(*date==27)

{

*date=1;

*month=*month+1;

}

else

*date=*date+1;

break;

}

}

else

{

if(!(*year%400))

{

if(*date==28)

{

*date=1;

*month=*month+1;

}

else

*date=*date+1;

break;

}

else

{

if(*date==27)

{

*date=1;

*month=*month+1;

}

else

*date=*date+1;

break;

}

}

}

case 12:

{

if(*date==31)

{

*date=1;

*month=1;

*year=*year+1;

}

else

*date=*date+1;

break;

}

default:

printf("输入错误\n");

}

}

else

*hour=*hour+1;

}

else

*minute=*minute+1;

}

else

*second=*second+1;

printf("%d年%d月%d日%d时%d分%d秒\n",*year,*month,*date,*hour,*minute, *second);

}

int main()

{

printf("请输入年月日时分秒\n");

int year, month,date, hour, minute, second;

scanf("%d%d%d%d%d%d",&year,&month,&date,&hour,&minute,&second);

show_time(&year,&month,&date,&hour,&minute,&second);

return 0;

}

12.23三道题:

1、改错:

(a)、void test1()

{

char string[10];

char *str1 = "0123456789";

strcpy(string, str1);

}

 

解:

(a)数组下标越界;改为string[11];

 

(b)、void test2()

{

char string[10], str1[10];

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

{

str1[i] = 'A';

}

strcpy(string, str1);

}

解:

(bstr1[10]没有0结束标志,strcpy复制数组从首地址开始,直到遇到0结束标志结束,并且会复制0结束标志。并且没有定义变量i;

改为如下形式:

void  test2()

{

int i=0;

char string[10],str1[10];

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

str1[i]='A';

str1[9]=0;

strcpy(string,str1);

printf("%s\n",string);

}

 

(c)、void test3(char *str)

{

char string[10];

if (strlen(str1)<=10)

{

strcpy(string, str1);

}

}

解:

(c)把 if(strlen(str1)<=10)改为if(strlen(str1)<10)

strlen用来计算字符串长度(不包括0结束标志),原理为:从传入的地址开始,计算字符串长度,直到遇到遇到0结束标志结束。

strcpy复制数组从首地址开始,直到遇到0结束标志结束,并且会复制0结束标志。

 

2、找赛手:2个羽毛球队比赛,各出3人,每个人只比一次。甲队为A,B,C三人,乙队为X,Y,Z三人。有人打听比赛名单,A说他不和X比,C说不和X,Z比。编程找出三队赛手的名单.

 

解:

#include<stdio.h>

int main()

{

char str1[3]={'A','B','C'};

char str2[3]={'X','Y','Z'};

int i=0;

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

{

if((str2[i]!='X')&&(str2[i]!='Z'))

printf("%c与C比赛\n",str2[i]);

else if(str2[i]!='X')

printf("%c与A比赛\n",str2[i]);

else

printf("%c与B比赛\n",str2[i]);

}

return 0;

}

 

3、用C语言实现字符串中子字符串的替换, 成功返回0,失败返回-1.例如:“ABCDEFG”这个字符串,把其中"BCD"替换成“9527”这个子串,结果变成:“A9527EFG”

函数原型:

int str_replace(char *str, char * replaced_str, char *new_str)

 

解:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

int str_replace(char *str,char *replace_str,char *new_str)

{

int i=0;

int length=strlen(str);

int replace_length=strlen(replace_str);

int new_length=strlen(new_str);

while(str[i])

{

if(str[i]==replace_str[0])

{

int j=0;

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

{

if(str[i+j]!=replace_str[j])

break;

}

if(j==replace_length)

break;

}

i++;

}

if(i==length-1)

return -1;

char *p1=(char*)malloc((length-i)*sizeof(char));

if(p1==NULL)

return -1;

memset(p1,0,length-i);

strcpy(p1,str+i+replace_length);

strcpy(str+i,new_str);

strcpy(str+i+new_length,p1);

free(p1);

return 0;

}

 

int main()

{

char str[20]={"ABCDEFG"};

char *replace_str="BCD";

char *new_str="9527";

printf("原来%s\n",str);

int ret=str_replace(str,replace_str,new_str);

printf("%d\n",ret);

printf("原来%s\n",str);

return 0;

}