if (a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j] && a[i][j]>a[i][j-1] && a[i][j]>a[i][j+1])
{
printf("%d %d %dn",a[i][j],i,j);
cnt++;
}
if (cnt==0)
{
printf("None %d %dn",m,n);
}
return(0);
}
9.统计不及格人数
有4名学生,每名学生有4门课程,编写程序,要求输入所有学生的成绩,然后统计每门课不及格的人数。
输入格式:
输入4名学生的4门课程到二维数组a[4][4] ,数据之间用一个空格分隔,每输入4个数,敲回车,成绩为整数。
输出格式:
在一行中输出每列数据中小于60的个数,即不及格人数,每个数据后有一个空格。
输入样例:
在这里给出一组输入。例如:
86 54 78 90
61 50 60 45
30 90 70 85
80 85 75 96
输出样例:
在这里给出相应的输出。例如:
1 2 0 1
(1)编程思路。
定义二维数组int a[4][4];保存4名学生的4门课程的成绩。采用二重循环
for (i=0;i<4;i++)
for (j=0;j<4;j++)
{ }
对二维数组中的各元素进行遍历。
(2)源程序。
#include
int main ()
{
int a[4][4];
int i,j;
for (i=0;i<4;i++)
for (j=0;j<4;j++)
scanf("%d",&a[i][j]);
for (j=0;j<4;j++)
{
int cnt=0;
for (i=0;i<4;i++)
if (a[i][j]<60)
cnt++;
printf("%d ",cnt);
}
printf("n");
return(0);
}
10.字符串替换
本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:
原字母 对应字母
A
B
C
D
X
Z
Y
X
W
C
… …
Y
Z
输入格式:
B
A
输入在一行中给出一个不超过80个字符、并以回车结束的字符串。
输出格式:
输出在一行中给出替换完成后的字符串。
输入样例:
Only the 11 CAPItaL LeTtERS are replaced.
输出样例:
Lnly the 11 XZKRtaO OeGtVIH are replaced.
(1)编程思路。
定义数组char str[81];保存输入的字符串,由样例可知,输入的字符串中含有空格,因此采用 gets(str)输入字符串,不能采用 scanf(“%s”,str)输入字符串。
用循环 for (i=0;str[i]!='0';i++) 对字符串中的每个字符进行遍历,对遍历的每个字符,若为答谢字母( if (str[i]>='A' && str[i]<='Z') ),则按替换规则进行转换,可用表达式简单描述为: str[i]='Z'-(str[i]-'A'); 。
(2)源程序。
#include
int main()
{
char str[81];
int i;
gets(str);
for (i=0;str[i]!='0';i++)
if (str[i]>='A' && str[i]<='Z')
str[i]='Z'-(str[i]-'A');
printf("%sn",str);
return 0;
}
11.组个最小数
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入格式:
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。
整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出格式:
在一行中输出能够组成的最小的数。
输入样例:
2 2 0 0 0 3 0 0 1 0
输出样例:
10015558
(1)编程思路。
定义数组 int a[10],其中元素a[i]的值表示数字i出现的次数。
因为数的最高位不能为0,先在a[1]~a[9]之间找一个最小的元素值不为0的元素a[i],输出i,然后a[i]=a[i]-1(表示数字i在最高位已用了一个)。
之后,采用如下的二重循环,按数字0~9使用的个数,依次输出对应个数的数字,这样得到的数一定是最小数。
for (i=0;i<10;i++)
for (j=1;j<=a[i];j++)
printf("%d",i);
(2)源程序。
#include
int main()
{
int a[10],i,j;
for (i=0;i<10;i++)
scanf("%d",&a[i]);
for (i=1;i<10;i++)
if (a[i]!=0) break;
printf("%d",i);
a[i]--;
for (i=0;i<10;i++)
for (j=1;j<=a[i];j++)
printf("%d",i);
printf("n");
return 0;
}
12.IP地址转换
一个IP地址是用四个字节(每个字节8个位)的二进制码组成。请将32位二进制码表示的IP地址转换为十进制格式表示的IP地址输出。
输入格式:
输入在一行中给出32位二进制字符串。
输出格式:
在一行中输出十进制格式的IP地址,其由4个十进制数组成(分别对应4个8位的二进制数),中间用“.”分隔开。
输入样例:
11110010
输出样例:
204.148.21.114
(1)编程思路。
定义数组 char ip[33];保存输入的二进制IP字符串,定义数组 int a[4]保存对应的4个十进制数。
32位二进制IP地址按每8位二进制一组(1个字节)转换为一个十进制数。
设n位B进制数为an-1an-2……a1a0,将其按权值展开后求和就可得到对应的十进制数ret。
对于ip[0]~ip[8]保存的8位二进制按上式写成循环如下:
ret=0;
for(i=0;i<8;i++)
ret=ret*2+ip[i]-'0';
将ip[0]~ip[7]、ip[8]~ip[15]、ip[16]~ip[23]、ip[24]~ip[31]这4组8位的二进制数按上面的方法转换为十进制数,分别保存到a[0]、a[1]、a[2]和a[3]中,最后按格式输出即可。
(2)源程序。
#include
int main()
{
char ip[33];
int a[4],num,i,j;
scanf("%s",ip);
num=0;
j=0;
for (i=0;ip[i]!='0';i++)
{
num=num*2+ip[i]-'0';
if ((i+1)%8==0)
{
a[j++]=num;
num=0;
}
}
printf("%d.%d.%d.%dn",a[0],a[1],a[2],a[3]);
return 0;
}
发表评论