三道图片题:
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);
}
解:
(b)str1[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;
}