【C】排版问题

(一)输出梯形 题目描述:

输入一个高度h,输出一个高为h,上底边为h的梯形。

输入:

一个整数h(1<=h<=1000)。

输出:

h所对应的梯形。

样例输入:
4
样例输出:
      ****
    ******
  ********
**********
提示:
梯形每行都是右对齐的。
#include<stdio.h>
int main(){
	int h,i;
	while(scanf("%d",&h)!=EOF){
		int max=h+2*(h-1);
		for(i=0;i<h;i++){
			int j=1;
			while(j<=max-h-i*2){
				printf(" ");
				j++;
			}
			while(j<=max){
				printf("*");
				j++;
			}
			printf("\n");
		}
	}
	return 0;
}
(二)叠筐

题目描述

需要的时候,就把一个个大小差一圈的筐叠上去,使得从上往下看时,边筐花色交错。这个工作现在要让计算机来完成,得看你的了。

输入描述:

输入是一个个的三元组,分别是,外筐尺寸n(n为满足0<n<80的奇整数),中心花色字符,外筐花色字符,后二者都为ASCII可见字符;

输出描述:

输出叠在一起的筐图案,中心花色与外筐花色字符从内层起交错相叠,多筐相叠时,最外筐的角总是被打磨掉。叠筐与叠筐之间应有一行间隔。
示例1

输入

11 B A
5 @ W

输出

AAAAAAAAA 
ABBBBBBBBBA
ABAAAAAAABA
ABABBBBBABA
ABABAAABABA
ABABABABABA
ABABAAABABA
ABABBBBBABA
ABAAAAAAABA
ABBBBBBBBBA
 AAAAAAAAA 

 @@@ 
@WWW@
@W@W@
@WWW@
 @@@ 
#include<stdio.h>
int main(){
	int n,i,j;
	char nei,wai;
	while(scanf("%d %c %c",&n,&nei,&wai)!=EOF){
		char buf[80][80];
		for(i=0;i<n/2;i++){
			if(i==0||i==n-1){
				for(j=0;j<n;j++){
					if(j==0||j==n-1){
						buf[i][j]=' ';
					}
					else buf[i][j]=wai;
				}
			}//首行与末行
			else{
				if(i%2==1){//奇数行
					int m=i/2+1;
					int k=m;
					j=0;
					while(j<n-m*2){
						while(k>=1){
							k--;
							buf[i][j++]=wai;
							buf[i][j++]=nei;
						}
						buf[i][j++]=nei;
					}
					k=m;
					while(j<n){
						while(k>=1){
							k--;
							buf[i][j++]=nei;
							buf[i][j++]=wai;
						}
					}
				}
				else{//偶数行
					int m=i/2;
					int k=m;
					j=0;
					while(j<n-m*2){
						while(k>=1){
							k--;
							buf[i][j++]=wai;
							buf[i][j++]=nei;
						}
						buf[i][j++]=wai;
					}
					k=m;
					while(j<n){
						while(k>=1){
							k--;
							buf[i][j++]=nei;
							buf[i][j++]=wai;
						}
					}
				}
			}
		}//对称图形的上半部分
		j=0;
		while(j<n){
			buf[n/2][j++]=wai;
			buf[n/2][j++]=nei;
		}//对称轴
		for(i=0;i<=n/2;i++){
			for(j=0;j<n;j++){
				printf("%c",buf[i][j]);
			}
			printf("\n");
		}//对称轴及以上部分
		for(i=n/2-1;i>=0;i--){
			for(j=0;j<n;j++){
				printf("%c",buf[i][j]);
			}
			printf("\n");
		}//对称轴以下部分
		printf("\n");
	}
	return 0;
}			
注:以上错误的,没有理解题目的意思,“中心花色”是指在整个图形的中心,“外筐花色”是相对“中心花色”而言的,而不一定是整个图形的外筐,修改如下:
#include<stdio.h>
int main(){
	int n,i,j;
	char nei,wai;
	while(scanf("%d %c %c",&n,&nei,&wai)!=EOF){
	    char buf[80][80];
	    if(n/2%2==0){
			char tmp=wai;
			wai=nei;nei=tmp;
		}
		for(i=0;i<n/2;i++){
			if(i==0||i==n-1){
				for(j=0;j<n;j++){
					if(j==0||j==n-1){
						buf[i][j]=' ';
					}
					else buf[i][j]=wai;
				}
			}//首行与末行
			else{
				if(i%2==1){//奇数行
					int m=i/2+1;
					int k=m;
					j=0;
					while(j<n-m*2){
						while(k>=1){
							k--;
							buf[i][j++]=wai;
							buf[i][j++]=nei;
						}
						buf[i][j++]=nei;
					}
					k=m;
					while(j<n){
						while(k>=1){
							k--;
							buf[i][j++]=nei;
							buf[i][j++]=wai;
						}
					}
				}
				else{//偶数行
					int m=i/2;
					int k=m;
					j=0;
					while(j<n-m*2){
						while(k>=1){
							k--;
							buf[i][j++]=wai;
							buf[i][j++]=nei;
						}
						buf[i][j++]=wai;
					}
					k=m;
					while(j<n){
						while(k>=1){
							k--;
							buf[i][j++]=nei;
							buf[i][j++]=wai;
						}
					}
				}
			}
		}//对称图形的上半部分
		j=0;
		while(j<n){
			buf[n/2][j++]=wai;
			buf[n/2][j++]=nei;
		}//对称轴
		for(i=0;i<=n/2;i++){
			for(j=0;j<n;j++){
				printf("%c",buf[i][j]);
			}
			printf("\n");
		}//对称轴及以上部分
		for(i=n/2-1;i>=0;i--){
			for(j=0;j<n;j++){
				printf("%c",buf[i][j]);
			}
			printf("\n");
		}//对称轴以下部分
		printf("\n");
	}
	return 0;
}			
注:以上格式仍没有满足题目要求,正确的截图应是这样的,意指“叠筐之间有一行间隔”:
#include<stdio.h> 
int main(){     
    int n,i,j,k,x,y;     
    char a,b,c;     
    int output[81][81];     
    bool firstcase=true; //第一组数据    
    while(scanf("%d %c %c",&n,&a,&b)!=EOF){         
        if(firstcase)             
            firstcase=false;         
        else             
            printf("\n");//若不是第一组数据,输入数据后,当叠筐输出前要有一空行         
        for(i=1,j=1;i<=n;j++,i+=2){//从里至外输出每个圈             
            x=n/2+1;y=x;             
            x-=j-1;y-=j-1;//每个圈右上角坐标         
            c=j%2==1?a:b;//确定当前圈是哪个字符             
            for(k=1;k<=i;k++){                 
                output[x+k-1][y]=c;//左                 
                output[x][y+k-1]=c;//上                 
                output[x+k-1][y+i-1]=c;//右                 
                output[x+i-1][y+k-1]=c;//下             
            }         
        }         
        if(n!=1){//n=1时不需磨角             
            output[1][1]=' ';             
            output[1][n]=' ';             
            output[n][1]=' ';             
            output[n][n]=' ';         
        }         
        for(i=1;i<=n;i++){              
            for(j=1;j<=n;j++)                  
                printf("%c",output[i][j]);             
            printf("\n");         
        }      
    }     
    return 0; 
}

(三)打印沙漏

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(<=1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

输入样例:
19 *
输出样例:
 
 
***** *** * *** ***** 2
#include<stdio.h>
int main(){
	int n,c,i,j,k,p,m,sum,num;
	scanf("%d %c",&n,&c);
	sum=1;i=3;
	while(sum<=n){
		sum=sum+i*2;
		i=i+2;
	}
	m=i-4;//首排m个,共m排
	sum=sum-(i-2)*2;//共sum个
	num=n-sum;//多num个
	k=m;//设每排k个
	for(j=1;j<=m/2;j++){//上半部分
		int kg=m-k;
		for(p=1;p<=kg/2;p++){
			printf(" ");
		}
		for(i=1;i<=k;i++){
			printf("%c",c);
		}
		printf("\n");
		k=k-2;
	}
	for(p=1;p<=(m-1)/2;p++){
		printf(" ");
	}
	printf("%c",c);
	printf("\n");
	k=3;
	for(j=1;j<=m/2;j++){
		int kg=m-k;
		for(p=1;p<=kg/2;p++){
			printf(" ");
		}
		for(i=1;i<=k;i++){
			printf("%c",c);
		}
		printf("\n");
		k=k+2;
	}
	printf("%d\n",num);
	return 0;	
}
注:本题的陷阱在于,每行符号之前用空格代替,符号打印完毕后,无须再输出空格。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值