2013-7-22学习C面试题

1.   编程:计算班级学生平均成绩和不及格人数。

#include <stdio.h>

int main(int argc, constchar * argv[])

{

    int stu[10]={99,98,55,96,95,94,93,92,91,90};

    int sum=0;

    int count=0;

    float avr=0;

    for (int i=0; i<10; i++) {

        sum+=stu[i];

        if (60>stu[i]) {

            count++;

        }

    }

    avr = (float)sum / 10;

    printf("学生平均成绩是:%f,不及格人数是:%d",avr,count);

    return0;

}

2.   编程,用条件表达式实现三个整数从大到小排序。

#include <stdio.h>

int main(int argc, constchar * argv[])

{

    int a=10,b=20,c=30;

    int max,mid,min;

    max=a>b?(a>c?a:c):(b>c?b:c);

    mid=a>b?(a<c?a:c>b?c:b):(b<c?b:c);

    min=a<b?(a<c?a:c):(b<c?b:c);

    printf("max=%d,mid=%d,min=%d",max,mid,min);

    return0;

}

3.   请说明三种循环语句的异同点。

     三种循环分别是while;do while 和 for

     相同点都是实现了一段逻辑循环操作,都具有以下三条内容:

     (1)循环体的设计

     (2)循环条件的设计

     (3)循环入口的初始化工作

     不同点:while是先进行判断,然后执行循环体;do while是先进行循环体然后再进行判断;for也是先进行判断然后进入循环体,结束后,进行++操作

     for循环一般用在循环次数固定的情况下

4.   请举例说明 break、continue 语句的区别。

      break//终止当前循环       contine//跳过此次循环

     #include <stdio.h>

int main(int argc, constchar * argv[])

{

    for (int i=0; i<4; i++) {

        for (int j=0; j<4; j++) {

            if (i==1) {

                continue;

            }

            if (j==2) {

                break;

            }

            printf("%d   %d\n",i,j);

        }

    }

    return0;

}

结果:

0   0

0   1

2   0

2   1

3   0

3   1

5.   用三种循环语句编写程序实现:计算 100 以内的整数之和 。

     

for循环:

#include <stdio.h>

int main(int argc, constchar * argv[])

{

    int sum=0;

    for (int i=0; i<=100; i++) {

        sum+=i;

    }

    printf("100以内的整数的和:%d",sum);

    return0;

}

while循环:

#include <stdio.h>

int main(int argc, constchar * argv[])

{

    int sum=0;

    int i=0;

    while (i<=100) {

        sum+=i;

        i++;

    }

    printf("100以内的整数的和:%d",sum);

    return0;

}

do while循环:

#include <stdio.h>

int main(int argc, constchar * argv[])

{

    int sum=0;

    int i=0;

    do {

        sum+=i;

        i++;

    }while (i<=100);

    printf("100以内的整数的和:%d",sum);

    return0;

}

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)

提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:

    if ( n == 0 )

    if ( n != 0 )

以此类推。

 

请写出 BOOL  flag 与“零值”比较的 if 语句:

 if(FALSE == flag)[错误]

 if(flag)或者if(!flag)

请写出 float  x 与“零值”比较的 if 语句:

 

 const double EPSILON = 1.00e-07;

if (x<abs(EPSILON))

{

}

 

请写出 char  *p 与“零值”比较的 if 语句:

 

 if(NULL == p)或者if(NULL != p)

 

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

 

       char  str[] = “Hello” ;

       char   *p = str ;

int     n = 10;

请计算

sizeof (str ) = 5[错]     6[对]          char str[8] = "Hello"   sizeof(str) =8

        

sizeof ( p ) =  8    

         

sizeof ( n ) = 4

void Func ( char str[100])

{

请计算

 sizeof( str ) = 8  //相当于指针

}

 

void *p = malloc( 100 );

请计算

sizeof ( p ) =8  

 

 

三、简答题(25分)

 

1、头文件中的 ifndef/define/endif 干什么用?

 

 防止引用该头文件的时候重复定义

 

2、#include  <filename.h>   和  #include  “filename.h” 有什么区别?

 

 第一种是指从系统文件中去找filename.h文件;第二种是从当前文件中去找filename.h的文件

 

3、const 有什么用途?(请至少说明两种)

 1.const修饰常量,该变量不可修改,例如const double PI=3.14

 2.常指针,const放在不同的地方有不同的效果,例如:

const int *p 和 int const *p 效果是一样的,指针所指向的内容是不可以变的,指针指向可以变

const int *p 和 int const *p指针指向不可变,但指针指向的内容可以变

int const * const p  指针指向和内容都不可以变

4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?

 

 首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

被extern "C"修饰的变量和函数是按照C语言方式编译和连接的

 

 

5、请简述以下两个for循环的优缺点

 

// 第一个

for (i=0; i<N; i++)

{

if (condition)

    DoSomething();

else

    DoOtherthing();

}

// 第二个

if (condition)

{

for (i=0; i<N; i++)

    DoSomething();

}

else

{

    for (i=0; i<N; i++)

    DoOtherthing();

}

优点:

 如果N比较小,第一种方法代码量少

 

缺点:

 

 耗时间

 

优点:

 节省时间

 

缺点:

 受客观条件的制约,有可能condition在DoSomething()中被修改

 

 

四、有关内存的思考题(20分)

 

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str); 

strcpy(str, "hello world");

printf(str);

}

 

请问运行Test函数会有什么样的结果?

答:程序有错误!

修改:

方法一:

void GetMemory(char **p)

{

     p=(char *)malloc(100);

}

void Test(void)

{

     char *str = NULL;

     GetMemory(&str);

     strcpy(str,"hello world");

     printf(str);

}

方法二:

char * GetMemory(char *p)

{

     p=(char *)malloc(100);

     return p;

}

void Test(void)

{

     char *str = NULL;

     str = GetMemory(str);

     strcpy(str,"hello world");

     printf(str);

}

 

 

 

char *GetMemory(void)

char p[] = "hello world";

return p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();  

printf(str);

}

 

请问运行Test函数会有什么样的结果?

答:有错误

虽然地址传过来了,但是“hello world”值没有传过来           为什么? 地址和strlen大小都一样

Void GetMemory2(char **p, int num)

{

*p = (char *)malloc(num);

}

void Test(void)

{

char *str = NULL;

GetMemory(&str, 100);

strcpy(str, "hello"); 

printf(str);  

}

请问运行Test函数会有什么样的结果?

答:

 能够输出hello

 

 

 

void Test(void)

{

char *str = (char *) malloc(100);

    strcpy(str, “hello”);

    free(str);    

    if(str != NULL)

    {

      strcpy(str, “world”);

printf(str);

}

}

请问运行Test函数会有什么样的结果?

答:

 free了空间以后,str不知道指向哪儿了,可能为空,也可能不为空,所以这样写不稳定

 

 

 

 

五、编写strcpy函数(10分)

已知strcpy函数的原型是

       char *strcpy(char *strDest, const char *strSrc);

       其中strDest是目的字符串,strSrc是源字符串。

 

(1)不调用C++/C的字符串库函数,请编写函数 strcpy

 

char *strcpy(char *strDest,constchar *strSrc)

{

    

    if ((strDest == NULL)||(strSrc==NULL)) {

        returnNULL;

    }

    char *strDestCopy = strDest;

    while ((*strDest++=*strSrc++)!='\0');

    return strDestCopy;

}

 

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

 

 返回赋值完成后的字符串,以便在外部函数进行赋值或者打印出来

 实现链式表达式

 

六、编写类String的构造函数、析构函数和赋值函数(25分)

已知类String的原型为:

    class String

    {

      public:

        String(const char *str = NULL);    // 普通构造函数

        String(const String &other);        // 拷贝构造函数

        ~ String(void);                        // 析构函数

        String & operate =(const String &other);    // 赋值函数

      private:

        char      *m_data;                // 用于保存字符串

    };

       请编写String的上述4个函数。

#include <iostream>

usingnamespacestd;

#include <string.h>

class String1

{

public:

    String1(constchar *str = NULL) //普通构造函数

    {

        if (str==NULL) {

            m_data = newchar[1];

            m_data = '\0';

        }

        //delete []m_data;

        else

        {

            m_data = newchar[strlen(str)+1];

            strcpy(m_data, str);

        }

    }

    String1(constString1 &other) //拷贝构造函数

    {

/*

        if (&other == this) {

            cout<<"不能为复制本身";

        }*/不需要写这个  因为不可能自己作为参数传递给自己,应为自己还没创建好

        if (this->m_data == other.m_data) {

            cout<<"不要赋值相等的值";

        }

        else

        {

            if (m_data) {

                delete []m_data;

            }

            m_data = newchar [strlen(other.m_data)+1];

            strcpy(m_data, other.m_data);

        }

    }

    ~String1(void)

    {

        if (m_data) {

            delete []m_data;

        }

    }

    String1 &operate = (const String1 &other)

    {

        if(this == &other)

        {

            return *this;

        }

        delete []m_data;

        m_data = newchar[strlen(other.m_data)+1];

        strcpy(m_data,other.m_data);

    };

private:

    char * m_data;//用于保存字符串

};

int main(int argc, constchar * argv[])

{

    String1 s="ding";

    String1 ss= s;

    cout<<ss;

    return0;

}

栈和堆的区别:

栈是自动释放,堆是手动释放

局部变量都是存放在栈上面的,new,malloc等新建出来的变量是存在堆上的

栈容量比较小,堆容量比较大

时间: 2024-11-02 20:15:06

2013-7-22学习C面试题的相关文章

2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都去mysql中获取,当并发量大的时候,我们希望mysql前面有层缓存做着. 这层缓存可能是redis,memcache,File等,但是这个逻辑代码是放在Controller中好还是Model中好呢? 放在Controller中: 好处:可以单个Controller进行控制,每个controller

2013亚马逊校招机试题A

题目没复制下来,凭印象写的. 删除代码中的的注释.注释分两种,//和/**/.字符串中出现的注释符号不能被当作注释. 解题思路: 以前编译原理课做过类似的程序,分出几个状态,并做状态转移判断即可. StringBuilder中存放返回的字符串.动作a表示添加当前字符到StringBuilder,b表示删除StringBuilder中最后一个字符.-表示其他字符或者无动作或者状态不转变 状态 字符 转变状态 动作 0 " 1 a 0 / 2 a 0 - - a 1 " 0 a 1 - -

Linux-0.0.1内核阅读连载笔记-2013.08.22

__________________________________________________________ ../kernel/Vsprintf.c __________________________________________________________ /* vsprintf.c -- Lars Wirzenius & Linus Torvalds. */ /*  * Wirzenius wrote this portably, Torvalds fucked it up

Linux Shell脚本编程的五个经典例子【新手学习】

例子一:绘制特殊图形 #!/bin/bash   MAX_NO=0   echo -n "Enter Number between (5 to 9) : "  read MAX_NO   if ! [ $MAX_NO -ge 5 -a $MAX_NO -le 9 ] ; then  echo "WTF... I ask to enter number between 5 and 9, Try Again"  exit 1  fi   clear   for (( i

(转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)

  本文转自:http://mp.weixin.qq.com/s/aAHbybdbs_GtY8OyU6h5WA   专题 | 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文) 原创 2017-01-28 Yuxi Li 机器之心 选自arXiv 作者:Yuxi Li 编译:Xavier Massa.侯韵楚.吴攀     摘要   本论文将概述最近在深度强化学习(Deep Reinforcement Learning)方面喜人的进展.本文将从深度学习及强化学习的背景知识开始,包

[经典面试题]完美洗牌算法

题目 有个长度为2n的数组{a1,a2,a3,-,an,b1,b2,b3,-,bn},希望排序后{a1,b1,a2,b2,-.,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法. 来源 2013年UC的校招笔试题 思路一 第①步.确定b1的位置,即让b1跟它前面的a2,a3,a4交换: a1,b1,a2,a3,a4,b2,b3,b4 第②步.接着确定b2的位置,即让b2跟它前面的a3,a4交换: a1,b1,a2,b2,a3,a4,b3,b4 第③步.b3跟它前面的a4交换位

【Windows 8 Store App】学习二:ResourceLoader

原文 http://www.cnblogs.com/java-koma/archive/2013/05/22/3093308.html 在项目开发时,通常有一些资源信息需要存储起来,比如请求的URL,app名称.我们把这样的一个key-value键值对文件叫做Resource文件. VS在创建WP项目时会自动生成AppResources.resx文件,但是在创建Win 8应用时不会自动生成,我们可以手动创建并编辑.   添加资源文件: #1. 添加文件夹: Resources   #2. 选中R

【Windows 8 Store App】学习一:获取设备信息

原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093306.html 通常情况下我们需要知道用户设备的一些信息:deviceId, os version, 设备制造商, 设备型号. 下面的代码用于获取设备的信息.(注:代码源于网络) public class DeviceInfoHelper { public async static Task<DeviceInfo> GetDeviceInfoAsync() { DeviceIn

【Windows 8 Store App】学习:目录

原文http://www.cnblogs.com/java-koma/archive/2013/05/22/3093302.html 写在前面:我之前从事java开发,对MS的一整套东西还没入门哈,难免有写错的地方,欢迎大家指出我的错误.   简 介:据说MS想通过XAML一统手机/平板/PC开发,所以只要你学会了其中一种平台的开发,另外1个平台就会驾轻就熟,因为很多控件是共用的.这里要稍 微说明一下:Windows 8平板和PC的开发是一样的,发布到同一个Store,如果你开发了一款Windo