ch6

1.读入一系列由空白分割的(名字,值)对,其中每个名字是由空白分开的一个单词,值是一个整数或者一个浮点值,计算并打印出对应于每个名字的所有值之和与平均值,以及所有的名字的和与平均值。
#include "stdafx.h"
#include<iostream>
#include<map>
#include<string>
using namespace std;

//定义名字的值
class Value{
public:
    double sum;
    int count;
    Value() :sum(0.0), count(0){}
};
//定义(名字,值)
typedef map<string, Value> Data;

void collect_data(Data & data){
    string name;
    //输入名字和值
    cout << "Input 'Quit' : collect data end! \n";
    cout << "input name: ";
    while ((cin >> name)&& name != "Quit"){
        cout << "input nameValue: ";
        double nameValue;
        cin >> nameValue;
        data[name].sum += nameValue;
        ++data[name].count;
        cout << "input name: ";
    }
}

//输出数据
void print_data(Data const & data){
    double global_sum = 0.0;
    int global_count = 0;
    //使用迭代器输出
    int temp_sum;
    int temp_count;
    for (Data::const_iterator i = data.begin(); i != data.end(); ++i)
    {
        temp_sum = (*i).second.sum;
        temp_count = (*i).second.count;
        cout << "name: " << (*i).first << " ; sum =  " << temp_sum
            << " ;mean = " << temp_sum / temp_count << endl;
        global_sum += temp_sum;
        global_count += temp_count;
    }
    cout << "global sum: " << global_sum << " ;global mean: " << global_sum / global_count << endl;
}


int main(){
    Data data;
    collect_data(data);
    print_data(data);
    return 0;
}


【相关文档】
1.C++ map的基本操作和使用
2.C++迭代器 iterator

2.找出5中不同结构的器意义无定义的c++结构。找出5中不同的其意义由实现确定的c++结构。

【无定义行为】:


1.超出数组边界的访问

int a[10];
int *p = &a[10]; //a[0]~a[9]可以,a[10]不行

2.使用已经销毁的对象:

int &r = * new int;
delete &r;
r = r+1;//引用不合法

3.企图重新解释变量:

int i ;
*(float*)&i = 1.0;//通过非声明的类型访问

4.强制目标的类型不是元对象的实际类型:

struct B{int i;};
struct D:B{};
B * bp =new B;
D * dp = static_cast<D*>(bp); //非法强制

5.强制去掉某个原定义为const对象的const属性

void f(int const &r){const_cast<int&>(r)  =2;}
int const i = 3;
f(i); //非法的const_cast

C++标准转换运算符const_cast

找出具有实现定义的结构也很容易:
1.某个类型的大小:

sizeof(int);

2.type_info::name()的输出:

std::cout<<typeid(double).name()

3.按位运算符的作用:

int mistery = ~0;

4.基本类型的最大最小值:

int mx = numeric_limits<int>::max();

5.历史副本的个数:

struct S {
S(S const&)
{std::cout<<"copy\n"}
};
S f(){S a;return a;}
int main(){
f();
return 0;
}

C++中的"未定义的行为"

3.找出10个不可移植的c++ 代码的例子
4.给下面不等式加上括号

5.写出下面函数:strlen().他返回的C风格字符串的长度;strcpy(),他将一个c风格字符串复制到另一个;strcmp(),他比较两个c风格字符串。

#include "stdafx.h"
#include<iostream>
#include<assert.h>
#include<cstddef> //为了使用std::size_t
using namespace std;

size_t Mystrlen(char const *s){
    assert(s);
    size_t len = 0;
    while (s[len]){
        ++len;
    }
    return len;
}

void Mystrcpy(char * dest, char const * src){
    assert(src && dest);
    /*while (*src)
    {
        *dest++ = *src++;
    }
    */
    do {
        *dest++ = *src;
    } while (*src++);
}

enum CStringOrder {
    FirstBeforeSecond = -1, Same = 0,
    SecondBeforeFirst = 1
};

CStringOrder Mystrcmp(char const * first,  const  char* second){
    assert(first&&second);
    unsigned char const * f = (unsigned char const *)(first);
    unsigned char const *s = (unsigned char const *)(second);
    do {
        if ((*f)<(*s))
            return FirstBeforeSecond;
        else
        if ((*s)<(*f))
            return SecondBeforeFirst;
        else
        {
            return Same;
        }
    } while (*(s++) && *(f++));
}

int main(){
    char a[] = "abcde";
    char  b[10];
    char *c = "bcdef";
    size_t len = Mystrlen(a);
    cout << "len: " << len << endl;
    Mystrcpy(b,a );
    cout << "str:" << b << endl;
    CStringOrder res = Mystrcmp(a, b);
    cout << "a and :" << res << endl;

}

【相关文档】
0.【C++ 学习笔记】 size_t 和 int
1.size_t
2. C++ assert.h头文件
3.C语言中char*和char[]用法区别分析


6.下一个函数cat(),.他取两个c风格字符串为参数,返回一个字符串,该字符串是两个字符串Dee拼接。利用new为这个结果取得存储。
#include "stdafx.h"
#include<iostream>
#include<string>
# include<cstddef>
using namespace std;

//第一种方法
char * cat(char const * a, char const*b){
    size_t len_a= strlen(a);
    size_t len_b = strlen(b);
    char* s = new char[len_a+len_b + 1];
    //加一是因为拷贝的时候连‘\0’都要拷贝,所以第二个参数是缓冲区要设置成第三个长度加一
    strcpy_s(s,len_a+1, a); 
    strcpy_s(s + len_a,len_b+1, b);
    return s;
}
//第二种方法
void concatenate(char const *a, char const * b, char * dest){
    while (*a != '\0')*dest++  =  *a++;
    while (*b != '\0')*dest++  =  *b++;
    *dest = '\0';
}

int main(){
    char * result = cat("c++", "programming");
    cout << "method 1: " << result <<" len:" <<strlen(result)<<endl;
    delete[] result;

    char result2[100];
    concatenate("four", " seasons", result2);
    cout << "method 2: " << result2 << endl;

}

【相关文档】
1.strcpy_s与strcpy的比较
2.C语言-L Buffer is too small && 0 解决方法

7写一个函数atoi(const char*).它是以一个c语言风格字符串为参数,返回与之对应的int值,例如:atoi("123")应该是123,使他能够处理简单的十进制之外,还能处理c++的八进制和十六进制形式。修改atoi()以处理c++的字符常量记法。

#include "stdafx.h"

#include<iostream>
#include<string>
#include<stdexcept>  //异常处理
#include<limits>
using namespace std;

namespace Myatoi_space {
    inline int digit(char c, int base) {
        int value;
        switch (c) {
        case '0': value = 0; break;
        case '1': value = 1; break;
        case '2': value = 2; break;
        case '3': value = 3; break;
        case '4': value = 4; break;
        case '5': value = 5; break;
        case '6': value = 6; break;
        case '7': value = 7; break;
        case '8': value = 8; break;
        case '9': value = 9; break;
        case 'a': case 'A': value = 10; break;
        case 'b': case 'B': value = 11; break;
        case 'c': case 'C': value = 12; break;
        case 'd': case 'D': value = 13; break;
        case 'e': case 'E': value = 14; break;
        case 'f': case 'F': value = 15; break;
        default:
            throw domain_error(string("invalid digit"));
        }
        if (value >= base)
            throw domain_error(string("invalid digit"));
        return value;
    }

    inline char next_char(char const *&p) {
        if (*p != '\\') // \ is special; hence '\\'
            return *p++;
        else { // 3 octal digits:         
            int char_value = digit(p[1], 8) * 64
                + digit(p[2], 8) * 8
                + digit(p[3], 8);
            if (char_value>std::numeric_limits<char>::max()
                || char_value<std::numeric_limits<char>::min())
                throw domain_error(string("not a char"));
            p += 4; // backslash and 3 octal digits
            return char_value;
        }
    }

    void load_first_digit(char const *&s, int &value,
        bool &is_negative, int &base) {
        char c1 = next_char(s);
        is_negative = c1 == '-';
        if (c1 == '-' || c1 == '+')
            c1 = next_char(s);
        if (c1 == '\0') { // "", "-" and "+" are illegal
            throw domain_error(string("invalid input"));
        }
        else if (c1 != '0') {
            base = 10;
        }
        else {
            char const *p = s;
            char c2 = next_char(p);
            if (c2 == 'x' || c2 == 'X') { // "0x..."?
                base = 16;
                s = p;
                c1 = next_char(s);
            }
            else { // c2!='x' and c2!='X'
                base = 8; // I.e., even "0" is treated as octal
            }
        }
        value = digit(c1, base);
    }
}

using namespace Myatoi_space;
int Myatoi(char const *s) {
    int value, base;
    bool is_negative;
    load_first_digit(s, value, is_negative, base);
    while (char c = next_char(s)) {
        if (value>std::numeric_limits<int>::max() / base)
            throw range_error(string("out-of-range"));
        value *= base;
        int d = digit(c, base);
        if (value>std::numeric_limits<int>::max() - d)
            throw range_error(string("out-of-range"));
        value += d;
    }
    return is_negative ? -value : value;
}
int main() {
    printf("atoi(\"123\") = %d\n", Myatoi("123"));
    printf("atoi(\"0123\") = %d\n", Myatoi("0123"));
    printf("atoi(\"0x123\") = %d\n", Myatoi("0x123"));
}

【相关文档】
1.C++ limits头文件的用法(numeric_limits)
2.c++中exception和stdexcept
3.C++中的namespace

8.写一个函数itoa(int i , char b[]).,,他在b中建立器车的字符串并且返回b

#include "stdafx.h"
#include<iostream>
using namespace std;
char const digit[] = "123456789";

char * Myitoa(int i, char b[]){
    char *p = b;
    if (i < 0){
        *p++ = '-';
        i = -i;
    }
    int shifter = i;
    do{
        ++p;
        shifter = shifter / 10;
    } while (shifter);
    *p = '\0';
    do{
        *--p = digit[i % 10];
        i = i / 10;
    } while (i);
    return b;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 一、字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 s...
    JaiUnChat阅读 1,656评论 0 7
  • 本文转自:http://www.cnblogs.com/lidabo/p/5225868.html 1)字符串操作...
    XiaohuiLI阅读 9,505评论 0 0
  • 在c语言中,字符串是用字符数组来存储的(并不像c++或者java等语言中有单独的string类型), 存放时在字符...
    朱森阅读 1,557评论 0 2
  • 2017年第一天过去了,许多人都沉醉在表面的快乐中。真的新年快乐吗?快不快乐,只有自己心里清楚。 如何过好2017...
    粥渔阅读 137评论 1 2
  • 天气很冷 心里很累 今天回家路上并不平坦 首先心里就有疙瘩 坐车&面对我妈 我很忐忑 很无奈 也很尴尬 到了后卫寨...
    九霄ya阅读 194评论 0 0