星海's Blog

老头初学编程
C程序设计语言(第二版)课后习题答案 4-6 章
C初级常见错误

多种类型菱形打印(初学代码,以后删除)

星海 posted @ 2011年1月11日 12:38 in C代码 , 1785 阅读

 

/*
 * =====================================================================================
 *       Filename:  diamond-1.c
 *    Description:  编写函数diamond打印一个菱形
 *			问题摘自 http://learn.akae.cn/media/ch06s05.html
 * =====================================================================================
 */

#include	<stdio.h>
#include	<stdlib.h>

void diamond(int n, char x)
{
	if (n % 2 == 0) {
		printf("wrong number\n");
		return;
	}

	int i, j;

	for (i = (-n / 2); i < (n / 2 + 1); ++i) {
		for (j = 0; j < n; ++j) {
			if (j < 2 * abs(i)) {
				if (j % 2 == 0)
					printf(" ");
				else
					printf("\t");
			} else
				printf("%c\t", x);
		}
		printf("\n");
	}

}

int main(void)
{
	diamond(5, '&');
	return 0;
}

 

/*
 * =====================================================================================
 *       Filename:  diamond-2.c
 *    Description:  打印如下所示的菱形,创建一个函数diamond2();
 *
    A
   BBB
  CCCCC
 DDDDDDD
  CCCCC
   BBB
    A
 *        Created:  2011年01月10日 23时45分54秒
 * =====================================================================================
 */
#include	<stdio.h>
#include	<stdlib.h>

void diamond2(int n)
{
// 因为要显示大写字母,范围在A-Z,所以n的取值范围为 3——2*26-1=51
	if (n % 2 == 0 && n < 3 && n >= 51) {
		printf("Wrong Number\n");
		return;
	}

	int i, j, k, charx;
	char x = 'A';

	for (i = n / 2; i > -(n / 2 + 1); --i) {
		for (j = 0; j < abs(i); ++j)
			printf(" ");
//当i大于0时,字符A先输出再自增:x++。 否则,--x-1。
		if (i >= 0)
			charx = x++;
		else
			charx = --x - 1;
		for (k = 0; k < n - 2 * abs(i); ++k) {
			printf("%c", charx);
		}
		printf("\n");
	}
}

int main(void)
{
//      测试最大菱形
	diamond2(51);
	return 0;
}

 

/*
 * ==========================================================================
 *
 *    Description:
 *    编写一个程序,读取输入,直到读了10个字符串或者遇到EOF。这个程序可以为用户提供一个有5个选项的菜单:

 1. 输出初始化字符串列表\n\
 2. 按ascii码顺序输出字符串\n\
 3. 按长度递增输出字符串\n\
 4. 按字符串中第一个单词的长度输出字符串\n\
 5. 退出\n
 *
 *        Version:  1.0
 *        Created:  2011年01月28日 00时17分41秒
 *       Revision:  none
 *       Compiler:  gcc
 * ==========================================================================
 */

//全用的选择排序算法
//尤其注意136行,不能是 if (strlen(v[i]) - strlen(v[j]) >
//0),必须是strlen(v[i]) >
//strlen(v[j]),因为strlen返回unsigned值,unsigned值相减返回unsigned值
//

#include	<stdio.h>
#include	<string.h>
#include	<ctype.h>
#include	<stdbool.h>

#define MAXLINE 10		/* 最多输入字符串个数 */
#define MAXLEN 50		/* 字符串最大字符数 */

void menu(void);		/* 菜单显示程序 */
void prall(char *v[], int n);	/* 打印所有字符串 */
void compascii(char *s);	/* 按ascii码顺序输出字符串 */
void complen(char *v[], size_t lim);	/* 按字符串长度递增输出字符串 */
int cmpwd(char *s);		/* 计算单个字符串中第一个单词的长度 */
void compcmp(char *v[], size_t lim);	/* 按第一个长度排列所有字符串 */

int main(void)
{
	bool flags = true;	/* 菜单“退出”标记 */
	int c, i, j;
	size_t linenum = 0;	/* 实际输入的行数 */
	char a[MAXLINE][MAXLEN] = { 0 };
	char *p[MAXLINE];

	printf
	    ("请输入不超过10个字符串,每行字符串以换行符结尾\n");

	for (i = 0; i < MAXLINE; i++) {
		++linenum;
		j = 0;
		while (((c = getchar()) != '\n') && c != EOF && j < MAXLEN - 1)
			a[i][j++] = c;
		a[i][j] = '\0';
		if (c == EOF)
			break;
	}

	while (flags) {
		for (i = 0; i < linenum; i++)
			p[i] = a[i];
		menu();
		switch (c = getchar()) {
		case '1':
			prall(p, linenum);
			break;
		case '2':
			for (i = 0; i < linenum; ++i)
				compascii(a[i]);
			break;
		case '3':
			complen(p, linenum);
			prall(p, linenum);
			break;
		case '4':
			compcmp(p, linenum);
			prall(p, linenum);
			break;
		case '5':
			flags = false;
			break;
		default:
			printf
			    ("\n\n\n请输入1-5选择您要的功能,按5键推出\n");
			break;
		}
		while (getchar() != '\n') ;	/* 清除多余的回车符 */
	}

	return 0;
}

void menu(void)
{
	printf("按键1-5选择相应菜单\n\
1. 输出初始化字符串列表\n\
2. 按ascii码顺序输出字符串\n\
3. 按长度递增输出字符串\n\
4. 按字符串中第一个单词的长度输出字符串\n\
5. 退出\n");
}

void prall(char *v[], int n)
{

	int i;
	for (i = 0; i < n; i++) {
		printf("%s\n", v[i]);
	}
}

void compascii(char *s)
{
	char a[MAXLEN];
	int i, j, k;
	char temp;
	for (i = 0; i < MAXLEN - 1 && s[i] != '\0'; i++)
		a[i] = s[i];
	for (j = 0; j < i - 1; j++)
		for (k = j + 1; k < i; k++)
			if (a[j] > a[k]) {
				temp = a[j];
				a[j] = a[k];
				a[k] = temp;
			}
	a[i] = '\0';
	printf("%s\n", a);
}

void complen(char *v[], size_t lim)
{
	int i, j;
	char *temp;
	for (i = 0; i < lim - 1; i++)
		for (j = i + 1; j < lim; j++)
			if (strlen(v[i]) > strlen(v[j])) {
				temp = v[i];
				v[i] = v[j];
				v[j] = temp;
			}
}

int cmpwd(char *s)
{
	size_t num = 0;
	while (*s)
		if (!isspace(*s++))
			num++;
		else
			break;
	return num;
}

void compcmp(char *v[], size_t lim)
{
	int i, j;
	char *temp;
	for (i = 0; i < lim - 1; i++)
		for (j = i + 1; j < lim; j++)
			if (cmpwd(v[i]) > cmpwd(v[j])) {
				temp = v[i];
				v[i] = v[j];
				v[j] = temp;
			}
}

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter