《计算概论》课程 第十九讲 C 程序设计语言应用

Similar documents
C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C 1 # include <stdio.h> 2 int main ( void ) { 4 int cases, i; 5 long long a, b; 6 scanf ("%d", & cases ); 7 for (i = 0;i < cases ;i ++) 8 { 9

IO

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

C/C++程序设计 - 字符串与格式化输入/输出

内 容 提 要 指 针 持 久 动 态 内 存 分 配 字 符 串 ( 字 符 数 组 ) 2

北京大学

佐證資料

2013 C 1 # include <stdio.h> 2 int main ( void ) 3 { 4 int cases, a, b, i; 5 scanf ("%d", & cases ); 6 for (i = 0;i < cases ;i ++) 7 { 8 scanf ("%d %d

02

高雄市左營國民小學八十九學年度第一學期一年級總體課程教學進度表

攝 心 為 戒, 因 戒 而 生 定, 由 定 而 生 慧

C/C++语言 - C/C++数据

CC213

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

新版 明解C++入門編

新・解きながら学ぶC言語

1998目录.mdi

C/C++ - 字符输入输出和字符确认

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

怎样使孩子更加聪明健康(五).doc

新版 明解C言語入門編

新・明解C言語入門編『索引』

C++ 程序设计 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C/C++ - 函数

女性健美保健(中).doc

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

<4D F736F F D20C9EAC2DBBEABD1A1CEC4D5C23538C6AA2E646F63>

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

C/C++ - 文件IO

nooog

Microsoft PowerPoint - string_kruse [兼容模式]

《C语言程序设计》教材习题参考答案

Microsoft Word _4

郑州大学(下).doc

厨房小知识(六)

广 东 纺 织 职 业 技 术 学 院 发 展 党 员 公 示 制 实 施 办 法 关 于 推 荐 优 秀 团 员 作 为 党 的 发 展 对 象 工 作 的 意 见 后 勤 管 理 工 作 广 东 纺 织 职 业 技 术 学 院 新 引 进 教 职 工 周 转 房 管 理


游戏攻略大全(五十).doc

金融英语证书考试大纲


健康知识(二)

中南财经大学(二).doc

广西大学(一).doc

根据学校教学工作安排,2011年9月19日正式开课,也是我校迁址蓬莱的第一学期开学

山东大学(一).doc

2

主 编 : 杨 林 副 主 编 : 张 新 民 邹 兰 曹 纯 纯 周 秋 婷 李 雅 清 黄 囡 囡 评 审 顾 问 : 杨 林 张 新 民 评 审 : 张 新 民 邹 兰 曹 纯 纯 周 秋 婷 李 雅 清 黄 囡 囡 李 忆 萍 徐 如 雪 文 字 编 辑 : 曹 纯 纯 邹 兰 李 雅 清

最新文物管理执法全书(十四).doc

园林常识(二).doc

前 言 二 一 六 年 四 月 四 日, 兒 童 節, 誕 生 了 一 件 美 事 : 中 國 作 家 曹 文 軒 在 意 大 利 博 洛 尼 亞 國 際 童 書 展 榮 獲 國 際 安 徒 生 文 學 獎, 是 該 獎 創 設 六 十 年 來, 第 一 位 摘 桂 的 中 國 作 家, 意 義 重

湖 南 科 技 大 学

上海外国语大学(二).doc

2009 陳 敦 德

切 实 加 强 职 业 院 校 学 生 实 践 能 力 和 职 业 技 能 的 培 养 周 济 在 职 业 教 育 实 训 基 地 建 设 工 作 会 议 上 的 讲 话 深 化 教 育 教 学 改 革 推 进 体 制 机 制 创 新 全 面 提 高 高 等 职 业 教 育 质 量 在

鸽子(三)

兽药基础知识(四)

园林植物卷(十).doc

园林植物卷(十七).doc

临床手术应用(三)

家装知识(二十)

医疗知识小百科

家庭万事通(一)

家装知识(三)

园林绿化(一)

园林植物卷(十五).doc

最新监察执法全书(一百五十).doc

兽药基础知识(三)

奥运档案(四).doc

最新监察执法全书(五十).doc

最新执法工作手册(三百八十四)

中华美食大全4

动物杂谈_二_.doc

抗非典英雄赞歌(三)

新时期共青团工作实务全书(三十五)

经济法法律法规第十九卷

游戏攻略大全(五十九).doc

火灾安全实例

兽药基础知识(七)

实用玉米技术(二)

中国政法大学(一).doc

水产知识(一)

招行2002年半年度报告全文.PDF

(Microsoft Word - outline for Genesis 9\243\2721\243\25529.doc)

穨Shuk-final.PDF

2

國立中山大學學位論文典藏.PDF

Microsoft Word mpc-min-chi.doc

( ) 1

穨cwht.PDF

900502_Oasis.indb

bnb.PDF

untitled

Microsoft Word - om388-rnt _excl Items 16 & 38_ _final_for uploading_.doc

% 25% (i) 95% 96,290,900 (ii) 99.9% 17,196,000 (iii) 99.9% 89,663,100 2

¨Æ·~½g¡ã¾·~¤ÀÃþ

公務員懲戒法實務及新制

大小通吃-糖尿病


Transcription:

计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn

字符数组的定义 #include<iostream> int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout << a[i]; return 0; a b c d e f g h i j a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

字符数组的定义 #include<iostream> int main() char a[10] = 'a', 'b', 'c', 'd', 'e'; for (int i = 0; i < 10; i++) cout << a[i]; return 0; a b c d e \0 \0 \0 \0 \0 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

字符数组的初始化 char c[ ] = C', h ', i', n', a'; char c[ ] = China ;

认识一下字符串 China ; char c[5] = China ;?

只可以 : 关于赋值 在数组定义并初始化的时候 : 不可以 : char c[6] = China ; 不能用赋值语句将一个字符串常量或字符数组直接赋给另一个字符数组 str1[ ]= China ; ( 赋值, 不合法 ) str1 = China ; ( 赋值, 不合法 ) str2 = str1; ( 赋值, 不合法 )

正确的赋值方式 #include<iostream> int main() char str1[] = "C++ language", str2[20]; int i = 0; while (str1[i]!= '\0') str2[i] = str1[i]; i++; str2[i] = '\0'; cout << "String1:" << str1 << endl; cout << "String2:" << str2 << endl; return 0;

字符串数组 利用二维数组存储多个字符串 char weekday[7][11] = Sunday", "Monday", "Tuesday", "Wednesday", Thursday", Friday", Saturday"; S u n d a y \0 \0 \0 \0 \0 M o n d a y \0 \0 \0 \0 \0 T u e s d a y \0 \0 \0 \0 W e d n e s d a y \0 \0 T h u r s d a y \0 \0 \0 F r i d a y \0 \0 \0 \0 \0 S a t u r d a y \0 \0 \0

字符 / 字符数组 / 字符串 的输入与输出 I. 引子 : 输入的过程 II. 一个字符的输入与输出 III. 字符数组 / 字符串的输入与输出

认识一下 : 输入缓冲区 How are you? cin>>str;

用 cin 输入数据 int a, b ; cin>>a>>b; // 从键盘输入 21 22 int a, b ; cin>>a>>b; // 从键盘输入 21 abc int a, b, c ; cin>>a>>b>>c; // 从键盘输入 21 22 // 23

用 cin 输入数据 #include<iostream> int main() float grade; cout << "enter grade : "; while (cin >> grade) // 能从 cin 流读取数据 if (grade >= 85) cout << grade << "GOOD!" << endl; if (grade < 60) cout << grade << "fail!" << endl; cout << "enter grade:"; return 0;

(1) 一个字符的输入

方法一 : 直接用 cin 输入字符 #include <iostream> int main() char c; cout << "enter a sentence:" << endl; while (cin >> c) cout << c; return 0;

用 cin.get( ) 函数输入字符 cin.get( ) 函数 可以用于读入一个字符 ; 2 种形式 : 无参数, 一个参数 cin.get( ) cin.get(char)

方法二 : 用 cin.get( ) 输入字符 #include <iostream> int main() char c; cout << "enter a sentence:" << endl; while ((c = cin.get())!= EOF) cout<<c; return 0;

方法三 : 用 cin.get(char) 输入字符 #include <iostream> int main() char c; cout << "enter a sentence:" << endl; while (cin.get(c)) // 读取一个字符赋给字符变量 c cout << c; return 0;

方法四 : 用 getchar( ) 输入字符 #include <iostream> int main() char c; cout << "enter a sentence:" << endl; while (c = getchar()) // 不跳过任何字符 cout<<c; return 0;

(2) 一串字符的输出

用 cout 输出字符数组 #include <iostream> int main() char a[10] = "Computer"; cout<<a; return 0; C o m p u t e r \0 \0 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]

用 cout 输出字符数组 #include <iostream> int main() char a[8] = 'C', 'o', 'm', 'p', 'u', 't', 'e', 'r' ; cout<<a; return 0; C o m p u t e r a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7]

用 cout 输出字符数组 S u n d a y \0 \0 \0 \0 \0 #include <iostream> M o n d a y \0 \0 \0 \0 \0 T u e s d a y \0 \0 \0 \0 W e d n e s d a y \0 \0 T h u r s d a y \0 \0 \0 int main() F r i d a y \0 \0 \0 \0 \0 S a t u r d a y \0 \0 \0 char weekday[7][11] = "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ; for (int i = 0; i < 7; i++) cout << weekday[i] << endl; return 0;

用 cout 输出字符数组 #include <iostream> int main() int a[8] = 1,2,3,4,5,6 ; cout<<a; return 0;

(2) 一串字符的输入

方法一 : 直接用 cin 输入字符串 #include <iostream> int main() char str[10]; cout << "enter a sentence:" << endl; while (cin >> str) cout << str<<endl; return 0;

方法二 : 用 cin.get( ) 函数输入 有 3 个参数的 get 函数 cin.get(ch, 10,'\n'); 读取 10-1 个字符 ( 包含空格 ), 赋给指定的字符数组 ; 如果在读取 10-1 个字符之前, 遇到指定的终止字符 \n, 则提前结束读取 ; ( 如果第 3 个参数没有指定, 则默认为 \n 读取成功返回非 0 值 ( 真 ), 如失败 ( 遇文件结束符 ) 则返回 0 值 ( 假 )

方法二 : 用 cin.get( ) 函数输入 #include <iostream> int main() char ch[20]; cout << "enter a sentence:" << endl; cin.get(ch, 10, o ); // 指定终止符为 o cout << ch << endl; return 0;

方法三 : 用 cin.getline( ) 函数输入 #include <iostream> int main() char ch[20]; cout << "enter a sentence:" << endl; cin.getline(ch, 10, o ); // 指定终止符为 o cout << ch << endl; return 0;

方法三 : 用 cin.getline( ) 函数输入 getline 与 get 的区别 getline 遇到终止标志字符时结束, 缓冲区指针移到终止标志字符之后 ; get 遇到终止字符是停止读取, 指针不移动 We are good friends. cin.get( ) We are good friends. cin.getline( )

方法三 : 用 cin.getline( ) 函数输入 #include <iostream> int main() char weekday[7][11]; for (int i = 0; i < 7; i++) cin.getline(weekday[i], 11); for (int i = 0; i < 7; i++) cout << weekday[i] << endl; return 0;

一个需要特别关注的程序 #include<iostream> int main() char a[10][10]; int n = 0; cin >> n; for (int i = 0; i < n; i++) cin.getline(a[i], 10); for (int i = 0; i < n; i++) cout << a[i] << endl; return 0;

Pass! #include<iostream> int main() char a[10][10]; int n = 0; cin >> n; cin.get( ); // 添加一条语句 for (int i = 0; i < n; i++) cin.getline(a[i], 10); for (int i = 0; i < n; i++) cout << a[i] << endl; return 0;

例 1 字符串加密 字符串加密 输入一个字符串, 把每个字符变成它后续字符, 如果是 Z 或者 z, 则变成 A 或 a. 空格则不变 然后将变换后的字符串输出 ; 要求能够接受连续输入 ; hello ifmmp nice to meet u. ojdf up nffu v/ do you like c++ ep zpv mjlf d,, no? op@ bye czf ^Z Press any key to continue

思路 : 例 1 字符串加密 读入字符串 ( 想一下以什么方式输入?) 从字符头到尾循环 : 是 Z 则直接赋值 A, 跳过以下步骤 是 z 则直接赋值 a, 跳过以下步骤 空格不做处理, 跳过以下步骤 其他字符 ++ 输出新字符串 ;

#include <iostream> 例 1 字符串加密 int main() char str[200]; while (cin.getline(str, 200)) for (int i = 0; str[i]!= '\0'; i++) if (str[i] == 'Z') str[i] = 'A'; continue; if (str[i] == 'z') str[i] = 'a'; continue; if (str[i] == ' ') continue; str[i]++; cout << str << endl; return 0;

例 2 字符串连接 问题 : 输入两个字符串, 将其中较短的串接到较长的串的后面 要求 : 不使用系统函数 strcat 每个输入的串的长度不超过 20

插入 : 字符数组常用操作 #include <iostream> #include <string> int main() char str1[20],str2[20]; cin.getline(str1,20); strcpy(str2,str1); cout << str1 <<endl; // 数组名就是字符串名 cout << str2 <<endl;

定义 : char str1[40], str2[40]; 例 2 字符串连接 cin.getline(str1,20); cin.getline(str2,20); 计算长度 : for (len1 = 0; str1[len1]!= '\0'; len1++); for (len2 = 0; str2[len2]!= '\0'; len2++); 拼接 : 第一个串的下标指向最后一个元素之后 第二个串的下标指向第一个元素 for(len2=0;str1[len2]!='\0';len2++); str1[len1++]=str2[len2]; str1[len1]= \0 ; // 不加上 \0, 就不是一个字符串

#include <iostream> int main() int len1, len2; char str1[40], str2[40]; cin.getline(str1, 20); cin.getline(str2, 20); for (len1 = 0; str1[len1]!= '\0'; len1++); for (len2 = 0; str2[len2]!= '\0'; len2++); if (len1 >= len2) for (len2 = 0; str2[len2]!= '\0'; len2++) str1[len1++] = str2[len2]; str1[len1] = '\0'; else for (len1 = 0; str2[len1]!= '\0'; len1++) str2[len2++] = str1[len1]; str2[len2] = '\0'; cout << str1 << endl; cout << str2 << endl; return 0;

例 3 统计单词数 问题 : 输入一个英文句子 ( 不超过 80 个字母 ), 统计其中有多少个单词, 单词之间用空格分开

例 3 统计单词数 Everything Should Be Made as Simple as Possible, But Not Simpler. - Albert Einstein

例 3 统计单词数 #include <iostream> int main() char str[80]; int num = 0, flag = 0; cin.getline(str, 80); for (int i = 0; str[i]!= '\0'; i++) if (str[i] == ' ') flag = 0; else if (flag == 0) flag = 1; num++; cout << " 字符串中有 " << num << " 个单词 " << endl; return 0;

好好想想, 有没有问题? 谢谢!