算法竞赛入门经典授课教案第3章 - 数组和字符串(精心排版,并扩充部分内容)

2026/1/21 13:45:15

第3章 数组和字符串

3.2 字 符 数 组

文本处理在计算机应用中占有重要地位。在C语言中,字符串其实就是字符数组——可以像处理普通数组一样处理字符串,只需要注意输入输出和字符串函数的使用。

例3-3 竖式问题。

找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。具体格式见样例输出(为了便于观察,竖式中的空格改用小数点显示,但你的程序应该输出空格,而非小数点)。

样例输入:2357 样例输出: <1> ..775 x..33 ----- .2325 2325. ----- 25575

The number of solutions=1 【分析】

本题的解题策略是尝试所有的abc和de,判断是否满足条件。写出如下的伪代码:

char s[20]; int count = 0; scanf(\

for(abc = 111; abc <= 999; abc++) for(de = 11; de <= 99; de++)

第 60页

第3章 数组和字符串

if(“abc*de”是个合法的竖式) { printf(\ 打印abc*de的竖式和其后的空行 count++; }

printf(\

说明:(1)char s[20]是一个定义字符数组的语句,scanf(\表示从键盘输入一个字符串给字符数组s。

(2)char是“字符型”的意思,而字符是一种特殊的整数。每一个字符都有一个整数编码,称为ASCII码。C语言中允许用直接的方法表示字符,还有以反斜线开头的字符(转义序列,Escape Sequence)。

(3)在stdlib.h中有一个函数atoi,它的函数原型如下:

int atoi(char *s)

它表示将字符串s中的内容转换成一个整型数返回,如字符串“1234”,则函数返回值是1234。

(4)在stdlib.h中有一个函数itoa,它的函数原型如下:

char *itoa(int value,char *string,int radix)

它表示将整数value转换成字符串存入string, radix为转换时所用基数(保存到字符串中的数据的进制基数 2 8 10 16),返回指向转换后的字符串的指针 。

例如,itoa(32,string,10)是将32变成十进制数一个字符串“32”,并返回指向这个字符串的指针;itoa(32,string,16)是将32变成十进制数一个字符串“20”,并返回指向这个字符串的指针。

(5)stdlib 头文件即standard library标准库头文件,该文件包含了的C语言标准库函数的定义,声明了数值与字符串转换函数, 伪随机数生成函数, 动态内存分配函数, 进程控制函数等公共函数。 输入样式: C语言模式:#include

C++样式:#include

提示3-7:C语言中的字符型用char表示,它实际存储的是字符的ASCII码。字符常量可以用单引号法表示。在语法上可以把字符当作int型使用。

第 61页

第3章 数组和字符串

语句scanf(\s);表示读入一个不含空格、TAB和回车符的字符串,存入字符数组s中,s前面没有&符号。

提示3-8:在scanf(\中,不要在s前面加上&符号。如果是字符数组char s[MAXN] [MAXL],可以用scanf(\读取第i个字符串。

接下来有两个问题:判断和输出。先考虑输出。首先计算第一行乘积x=abc*e,然后是第二行y=abc*d,最后是总乘积z=abc*de,然后一次性打印出来:

printf(\完整程序如下:

程序3-4 竖式问题

#include #include int main() {

int i, ok, abc, de, x, y, z, count = 0; char s[20], buf[99]; scanf(\

for(abc = 111; abc <= 999; abc++) for(de = 11; de <= 99; de++) {

x = abc*(de); y = abc*(de/10); z = abc*de;

sprintf(buf, \ ok = 1;

for(i = 0; i < strlen(buf); i++) if(strchr(s, buf[i]) == NULL) ok = 0; if(ok) {

printf(\

printf(\ } }

printf(\ return 0; }

说明:(1)sprintf函数

第 62页

第3章 数组和字符串

sprintf是个变参函数,定义如下:

int sprintf( char *buffer, const char *format [, argument] ... ); 除了前两个参数类型固定外,后面可以接任意多个参数。

功能:把格式化的数据写入字符串buf,它的返回值是字符串长度。包含此函数的头文件是stdio.h。

例如,本程序中的sprintf(buf,\语句的功能是将整数abcdexyx打印成字符串存储在串buff中。可以直接接受其返回值:

int len=sprintf(buf, \

(2)strchr函数 strchr函数定义如下:

char *strchr(const char *s,char c);

功能:查找字符串s中首次出现字符c的位置。它的返回值是返回首次出现c的位置的指针,如果s中不存在c则返回NULL。包含此函数的头文件是string.h。

例如,本程序的if语句中strchr(s, buf[i])的功能是查找字符串s中首次出字符buf[i]的位置。如果strchr(s, buf[i])==NULL,则表明字符串s中没有buf[i]的字符。

(3)sprintf函数、printf函数、fprintf函数的区别

printf输出到屏幕,fprintf输出到文件,而sprintf输出到字符串。需要注意是应该保证写入的字符串有足够的空间。

提示3-9:可以用sprintf把信息输出到字符串,用法和printf、fprintf类似。但你应当保证字符串足够大,可以容纳输出信息。

字符串的空间应为字符个数加1,这是因为C语言的字符串是以空字符'\\0'结尾的。

函数strlen(s)的作用是获取字符串s的实际长度,即函数strlen(s)返回的是结束标记之前的字符个数(需包含头文件string.h)。因此这个字符串中的各个字符依次是s[0],s[1],?,s[strlen(s)-1],而s[strlen(s)]正是结束标记'\\0'。

第 63页


算法竞赛入门经典授课教案第3章 - 数组和字符串(精心排版,并扩充部分内容).doc 将本文的Word文档下载到电脑
搜索更多关于: 算法竞赛入门经典授课教案第3章 - 数组和字符串(精心排版, 的文档
相关推荐
相关阅读
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 10

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219