博文

[058] 统计字符串中单词个数(2006-05-24 12:45:00)

摘要:《C程序设计(第二版)》 (谭) 字符数组练习: 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

思路:
    程序中用i作循环变量, num统计单词个数, word作为判别是否是单词的标志,若word = 0 表示未出现单词, 如出现单词word置1。
    单词数目可由空格出现次数决定(连续若干空格作为出现一次空格;一行开头的空格不统计在内).如果测出某一个字符为非空格,而其前面的字符是空格,则表示"新单词开始",此时单词数num累加1.如果当前字符为非空格而其前面的字符也是非空格,则意味着仍是原来的单词的继续,num不累加.前面一个字符是否空格可以从word值分析,若word=0,则表示前一个字符是空格;如果word = 1,意味着前一个字符为非空格。

#include <stdio.h>
int main()
{
    char string[81];
    int i;
    int num = 0;  /* 统计单词个数 */
    int word = 0; /* 是否为单词的标示 */
    char c;     gets(string);     for (i = 0; (c = string[i]) != '\0'; i++)
    {
        if (c == ' ')
            word = 0;
        else
      &nbs......

阅读全文(7899) | 评论:5

[057] 实矩阵相乘函数(2006-05-20 15:47:00)

摘要:最近频繁用到矩阵相乘运算, 所以想写一个函数。遇到的问题不少! 关于矩阵乘法规则,请查看: [050] 求两个矩阵的乘积矩阵 算法参考了徐士良的《常用算法程序集》里的一个实矩阵相乘函数,如下:

void brmul(a, b, m, n, k, c)
int m, n, k;
double a[], b[], c[];
{
    int i, j, l, u;
    for (i = 0; i<= m - 1; i++)
        for (j = 0; j <= k - 1; j++)
        {
            u = i * k + j;
            c[u] = 0.0;
            for (l = 0; l <= n - 1; l++)
                c[u] = c[u] + a[i * n + l] * b[l * k + j];
        }
}

参数说明:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  形参与函数类型           &nbs......

阅读全文(4696) | 评论:5

[056] Turbo C的图形系统(2006-05-16 18:40:00)

摘要:    虽然DOS下这种图形系统基本上已经没什么用武之地了, 但最近在做图形学上机时发现, 用它来做相关试验时还是不错的。首先由于其分辨率比较低,每个像素点很明显,可以看清一些细节。其次使用简单,可以把精力放到算法上,而不必像在VC里那样还要关心类似MFC那里一堆堆的东西。当然这些仅仅指的是算法的实现,做应用时就另当别论了。另外TC下的鼠标驱动要自己写,虽然网上有些代码,但是不好好研究一下还是很难会运用自如的。所以如果用鼠标做图形的拾取并不容易。

关于TC下的图形函数参见:Turbo C 图形函数 一文,比较全了。

用Win-TC的 文件->使用模板新建->BGI图形编程模板, 生成如下代码:
/* WIN-TC BGI 图形编程模板 */ #include "Conio.h"
#include "graphics.h"
#define closegr closegraph void initgr(void) /* BGI初始化 */
{
    int gd = DETECT, gm = 0;          /*和gd = VGA,gm = VGAHI是同样效果 */
    registerbgidriver(EGAVGA_driver); /*注册BGI驱动后可以不需要.BGI文件的支持运行*/
                                                &nbs......

阅读全文(6477) | 评论:0

[055] double型数的输入(2006-05-09 22:36:00)

摘要:    最近在做图形学上机,遇到许多问题,其中关于double型数的输入因为一个简单的错误,却困惑了很久。在书中看到用printf()函数输出时,用格式%f可以输出实数,包括单精度,双精度数,隐含输出6位小数。所以误以为对scanf()也是一样的,所以程序中输入用了如下的语句:

double Scal_R;
scanf("%f", &Scal_R);

程序里用输入的这个参数Scal_R控制一个圆的半径比例,比如输入此参数为1.5时,应该将原来圆的半径乘以1.5再重画此圆。但总是没有出现正确结果,也一直没有往这个地方想,郁闷了好一阵子。后来还是看了下谭老的书,才发现原来scanf()的附加格式说明字符里有个"l",用于输入长整型数据(可用%ld,%lo,%lx) 以及double型数据(用%lf或%le) ,可见输入double型数应该用"%lf",于是做了如下试验:

#include <stdio.h>
int main()
{
    double d_ouble;
    scanf("%f", &d_ouble);
    printf("%f\n", d_ouble);
    return 0;
}

运行结果(VC):
=======================================================================
1.5↙
-92559604329505835000000000000000000000000000000000000000000000.000000
=======================================================================

显然没有正确输出, 改为%lf 后: #include <stdio.h>
int main()
{
    double d_ou......

阅读全文(5896) | 评论:9

[054] 找出最长及最短字符串(2006-04-23 17:51:00)

摘要:<C程序设计> (夏宝岚)

练习字符串处理: 编写程序,由键盘输入若干字符串,输出最长及最短的字符串。

#include <stdio.h>
#include <string.h>
int main()
{
    char  InPut[1000];
    char OutMax[1000];
    char OutMin[1000];
    int len;
    int max = 0;
    int min = 1000;
    printf("InPut a string: ");
    gets(InPut);
    while ((len = strlen(InPut)) > 0)
    {   
        if (len > max)
        {
            max = len;
            strcpy(OutMax, InPut);
        }
        if (len < min)
      ......

阅读全文(4585) | 评论:0

[053] 字符串逆序输出(2006-04-23 15:27:00)

摘要:<C程序设计> (夏宝岚) 6.19 将键盘输入的字符串按逆序显示出来。

#include <stdio.h>
#include <string.h>
int main()
{
    char str[80];
    int i;
    printf("Input a string:  ");
    gets(str);
    printf("Reversal output: ");
    for (i = strlen(str)-1; i >= 0; i--)
        printf("%c", str[i]);
    printf("\n");
    return 0;
}

运行结果:
==================================================
Input a string:  abcdefghijklmn↙
Reversal output: nmlkjihgfedcba
==================================================

[补充] 2006.11.19  [074] 字符串逆序输出(递归) 。
......

阅读全文(5398) | 评论:2

[052] 常用的字符串处理函数(2006-04-23 14:35:00)

摘要:<C程序设计> (夏宝岚) 包含于 <string.h> 头文件中

<1> strlen 函数

形式: strlen (str);
功能: 计算并返回字符串str的长度(字符串结束标志'\0'不计入内)

例6.16 显示由键盘输入的字符串的长度。

#include <stdio.h>
#include <string.h>
int main()
{
    char str[80];
    printf("Input a string: ");
    gets(str);
    printf("%d\n", strlen(str));
    return 0;
}

运行结果:
===================================
Input a string: I love this game!↙
Lenth is 17
===================================

★ 关于gets()函数,MSDN中如下描述:
The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character.

 &nb......

阅读全文(4582) | 评论:0

[051] 字符数组中字符串的长度(2006-04-23 14:02:00)

摘要:《C程序设计》(夏宝岚)
6.13 检测存放在某字符数组中的字符串的长度。

#include <stdio.h>
int main()
{
    char str[] = "At last, we shall have revenge!";
    int i = 0;
    while (str[i] != '\0')
        i++;
    printf("Length is %d\n", i);
    return 0;
}

运行结果:
=========================
Length is 31
=========================

★ (P79)所谓字符串,就是用双引号括起来的字符序列。通常,字符串被存放在字符数组中。一个长度固定字符数组,可以存放不同长度的字符串。为了便于识别一个字符串的结尾,C语言约定,字符串的末尾以转义字符'\0'作为结束标记。有了字字符串的结束标记,程序就可以通过判断'\0'来检测字符串是否结束,而不必依赖字符数组的长度。引进了字符串的概念,就可以直接使用字符串常量对字符数组赋初值。......

阅读全文(4226) | 评论:1

[050] 求两个矩阵的乘积矩阵(2006-04-09 10:27:00)

摘要:参考: 《C程序设计》(夏宝岚) P78
6.10 求两个矩阵的乘积矩阵。

#include <stdio.h>
int main()
{
    int a[100][100] = {{1, 0, 3, -1}, {2, 1, 0, 2}};
    int b[100][100] = {{4, 1, 0}, {-1, 1, 3}, {2, 0, 1}, {1, 3, 4}};
    int c[100][100] = {{0}};
    int n = 2; /* 第一矩阵的行数 */
    int m = 4; /* 第一矩阵的列数,即第二矩阵的行数 */
    int p = 3; /* 乘积矩阵的列数 */
    int i, j, k;     for (i = 0; i < n; i++)
    {
        for (j = 0; j < p; j++)
        {
            c[i][j] = 0;
            for (k = 0; k < m; k++)
                c[i][j] = c[i][j] + a[i][k] * b[k][j];
&nb......

阅读全文(10168) | 评论:1

[049] 仿骰子程序-随机数的产生(2006-04-07 22:03:00)

摘要:出自:《C程序设计》(夏宝岚) P76
6.8 编写一个仿骰子程序,将六面体骰子掷6000次,统计出各面出现的次数。每次投掷骰子出现哪一面,由随机数发生器提供的函数经过处理而确定。

#include <stdio.h>
#include <stdlib.h> /* rand()函数用 */
int main()
{
    int face;
    int f[6] = {0};
    int i;     for(i = 1; i <= 6000; i++)
        f[rand() % 6]++ ;       /* 数组元素下标为0到5 */     printf("Face  Frequency\n");
    for(face = 0; face < 6; face++)
        printf("%2d %10d\n", face + 1, f[face]);
    return 0;
}

运行结果(仅供参考):
===============================
Face  Frequency
 1       1003
 2       1017
 3        983
 4        994
&nb......

阅读全文(5183) | 评论:1