if(p!
=i)
{t=str[p];str[p]=str[i];str[i]=t;}
}
选择排序的语法,注意思路。
6.单词排序
二维数组法:
程序:
#include
#include
#include
intmain()
{
charstr1[5][100],str2[100];
inti,j,p;
for(i=0;i<5;i++)
gets(str1[i]);//输入5个字符串,str1[i]代表二维数组str[i][100]
for(i=0;i<5;i++)//的地址
{
p=i;
for(j=i+1;j<5;j++)
if(strcmp(str1[j],str1[p])>0){strcpy(str2,str1[p]),strcpy(str1[p],str1[j]),strcpy(str1[j],str2);}//用数组名对数组进行操作
}
for(i=0;i<5;i++)
printf("%s\n",str1[i]);//通过二维数组的地址输出字符串
system("pause");
return0;
}
算法分析:
关键在于将5个字符串进行循环处理,以此来方便排序。
利用二维数组的概念,将字符串放在二维数组第二维,引用二维数组的单维数组名便可以调用整个字符数组,记住二维数组的特点。
7.打印字符(TestA1)
输入行数和起始字母,输出大写字母等腰三角形。
输出的字母是循环的,即递增到字母'Z'以后输出'A';递减到字母'A'以后输出'Z'。
例如:
输入:
4X↙
输出:
X↙
YZY↙
ZABAZ↙
ABCDCBA↙
程序:
#include
#include
intmain()
{inti,j,n;
charch;
scanf("%d%c",&n,&ch);//输入参数
for(i=1;i<=n;i++)
{for(j=1;j<=n-i;j++)
putchar('');//先在每行打印空格
for(j=1;j<=i;j++)
{if(ch>'Z')
ch=ch-26;//注意该判断条件的位置,由于此处会
putchar(ch);//对字符进行递加,故应该判断字符
ch++;//是否大于‘Z’.
}
ch--;
ch--;//两个ch--的作用是使字符变到中间字符减一的字符
for(j=1;j<=i-1;j++)
{if(ch<'A')
ch=ch+26;//注意该判断条件的位置
putchar(ch);
ch--;
}
putchar('\n');
ch++;
ch++;//使字符变为下一行开始字符
}
system("PAUSE");
return0;
}
算法分析:
对于打印图形类问题,关键在于分析规律!
注意打印的形式,将空格当字符打印出来!
本题的规律在于每行的空格数与行数成函数关系,每行需打印的字符成对称关系!
按照对称性,用两个循环,分别打印出来!
另外注意相邻两行的规律,前一行最后一个字符递加一个就是下一行开始的字符!
这样对于所有打印的字符可以用一个变量来处理,程序更加简单!
重要语法:
putchar('\n');
ch++;
ch++;
for(j=1;j<=i;j++)
{if(ch>'Z')
ch=ch-26;
putchar(ch);
ch++;
}
ch--;
ch--;
8.字母X
输入整数n值和首字母,输出以首字母为中心,边长为n的X形。
其中,上两条边上字母递增,下两条边上字母递减。
且认为字母是循环的,即Z与A相邻。
若输入的不是大写字母,则输出”inputerror"提示。
输入:
4A
输出:
D D
C C
B B
A
Z Z
Y Y
X X
程序:
#include
#include
intmain()
{
inti,j,n,k;
charch;
scanf("%d%c",&n,&ch);
if(ch<'A'||ch>'Z')printf("inputerror\n");
else
{
ch=ch+n-1;//得到首行字符
for(i=1;i<=n;i++)
{for(k=1;k<=5;k++)
{
if(ch<'A')ch=ch+26;//注意,首行字符向下递减的时候,可能会
if(ch>'Z')ch=ch-26;//出现字符大于Z或者小于A的情形
}//当n的值过大的时候,需要多做几次判断
for(j=1;j<=2*n-i;j++)
{
if(j==i||j==2*n-i)putchar(ch);
elseputchar('');
}
putchar('\n');
ch--;
}
for(i=1;i<=n-1;i++)
{
if(ch<'A')ch=ch+26;//只需判断ch是否小于A
for(j=1;j<=n+i;j++)
{
if(j==n-i||j==n+i)putchar(ch);
elseputchar('');
}
putchar('\n');
ch--;
}
}
system("pause");
return0;
}
算法分析:
先按规律求出首行字符,再依次打印,注意只需使用一个字符变量,相邻两行字符变化有规律。
重要语法:
for(k=1;k<=5;k++)
{
if(ch<'A')ch=ch+26;//
if(ch>'Z')ch=ch-26;//
}
对前半段的字符,需要同时判断是否大于Z,小于A.
9.打印空心数字梯形
输入行数n和首数字字符,在屏幕上输出由数字围起的高和下底宽度均n的空心梯形。
要求:
输出的数字是循环的,即输出数字9后再输出的数字是0。
输入:
行数n和首字符
输出:
空心梯形
程序:
#include
#include
intmain()
{
inti,j,n;
charch;//仅用一个字符变量,通过递增或递减输出字符,将本题
scanf("%d%c",&n,&ch);//数字当作字符输出
if(n==1){putchar(ch);putchar('\n');}//特殊情况是n=1!
特殊对待
else
{
for(j=1;j<=3*n-2;j++)
{
if(ch>'9')ch=ch-10;
if(j%2==0)putchar('');
elseputchar(ch++);
}//注意此处,j的值是加了1的,所以判断语句如下
if(j%2!
=0)ch--;elsech=ch-2;//用该语句即可概括奇偶的
for(j=3*n-1;j<=6*n-5;j++)//不必用两个语句分开讨论奇偶
{
if(ch<'0')ch=ch+10;//注意该判断条件
if(j%2==0)putchar('');
elseputchar(ch--);
}//注意找规律,不论是奇数还是偶数,第一行的字符数为
putchar('\n');ch++;ch++;//6*n-5
for(i=1;i<=n-2;i++)//输出中间的n-2行
{
if(ch>'9')ch=ch-10;//注意该判断条件
for(j=1;j<=6*n-5-2*i;j++)
{
if(j==2*i+1||j==6*n-5-2*i)putchar(ch);
elseputchar('');
}
putchar('\n');
ch++;
}
for(j=1;j<=2*n-2;j++)
putchar('');//打印最后一行前面空格
for(j=2*n-1;j<=3*n-2;j++)//输出最后一行思路与第一行相同,
{//只是循环次数不同
if(ch>'9')ch=ch-10;
if(j%2==0)putchar('');
elseputchar(ch++);
}
if(j%2!
=0)ch--;elsech=ch-2;
for(j=3*n-1;j<=4*n-3;j++)
{
if(ch<'0')ch=ch+10;
if(j%2==0)putchar('');
elseputchar(ch--);
}
}
putchar('\n');
system("pause");
return0;
}
算法分析:
第一:
将此处的数字当作字符处理,直接打印字符,另外总体思路为只用一个字符来递增或递减输出。
第二:
此处需要处理特殊情况,即n=1的情形。
n>=2时,分第一行,中间行以及最后行输出。
其中第一行和最后一行输出规律相同,只是循环次数不同。
第三,关键在于找到每行字符个数,以及字符数的递变规律。
另外注意奇偶的输出区别。
重要语法:
1.if(j%2!
=0)ch--;elsech=ch-2;
用来处理n为奇数和n为偶数的两种情形
2.for(j=3*n-1;j<=6*n-5;j++)
由分析得,首行的字符数均为6*n-5个
注意:
本题不该用把字符当作数字按照%2d的形式输出,应为中间的行里面,数字的间距不同
10.空心数字菱形
输入:
n
输出:
数字菱形
友情提示:
同学们总结一下打印星号组成的实心图形程序的编程思路:
第一步,打印星号组成的正方形;第二步,改变每行星号的个数,打印每行星号数量不一样的图形;如果是空心图形,每行第一个和最后一个位置输出星号,其他位置输出空格。
程序:
#include
#include
intmain()
{
inti,j,n,k;
scanf("%d",&n);
k=n;//注意此处n有两个作用,一个用来递变,一个用来控制
for(i=1;i<=k;i++)//次数,故应该用另一个变量保存n
{
for(j=1;j<=k-i;j++)
printf("");
for(j=k-i+1;j<=k;j++)//注意循环起始条件
printf("%-2d",n--);
n++;n++;
for(j=k+1;j<=k+i-1;j++)//注意循环起始条件
printf("%-2d",n++);
n--;putchar('\n');
}
for(i=1;i<=k-1;i++)
{
for(j=1;j<=i;j++)
printf("");
for(j=i+1;j<=k;j++)//注意循环起始条件
printf("%-2d",n--);
n++;n++;
for(j=k+1;j<=2*k-1-i;j++)//注意循环起始条件
printf("%-2d",n++);
n--;putchar('\n');
}
system("pause");
return0;
}
算法分析:
首先,由于本题输出的数字有的为两位数,故不可以用将这些数字看作字符,而应该当作数字处理。
此时,数字间的空格可以通过输出的格式,即%-2d,来打印出来。
其次,本题中输入的n有两个作用,一个是用来递变,另一个是控制循环的次数。
故应该用另一个变量保存n的值,使之为定值来控制循环次数。
另外,对于每行的输出,关键在于找到每次循环的起始和终止条件!
重要语法:
1.k=n;
用k来保存n的值,依次来控制循环次数
2.for(j=k-i+1;j<=k;j++)
3.for(j=i+1;j<=k;j++)
4.for(j=k+1;j<=2*k-1-i;j++)
注意各起始和终止条件
11.空心的倒三角形
输入:
输入三角形的高度(h>=0)。
输出:
打印相应的空心倒三角形。
程序:
#include
#include
intmain()
{
intn,i,j;
scanf("%d",&n);
if(n==1)putchar('*');//n=1是特殊情况,要单独讨论
else
{
for(j=1;j<=2*n-1;j++)//注意循环次数
putchar('*');
putchar('\n');
for(i=2;i<=n;i++)
{
for(j=1;j<=2*n-i;j++)
if(j==i||j==2*n-i)putchar('*');
elseputchar('');
putchar('\n');
}
}
system("pause");
return0;
}
算法分析:
考虑第一行的特殊情况即可,其他思路与前面的类似
12.空心字符菱形
输入:
菱型起始字母和菱形的高度。
输出:
参看测试用例,打印空心的由字符组成的菱形。
程序:
#include
#include
intmain()
{
inti,j,n;
charch;
scanf("%c%d",&ch,&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n+i-1;j++)//注意循环起始和终止条件
if(j==n-i+1||j==n+i-1)putchar(ch);
elseputchar('');
putchar('\n');ch++;
}
ch--;ch--;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=2*n-1-i;j++)//注意循环起始和终止条件
if(j==i+1||j==2*n-1-i)putchar(ch);
elseputchar('');
putchar('\n');ch--;
}
system("pause");
return0;
}
算法分析:
与上题类似。
13.数字正方形
输入n的值,输出如下例(n=4)所示的由数字组成的正方型。
1234
5678
9101112
13141516
输入:
n
输出:
数字组成的正方型
程序:
#include
#include<