C简单例题

一、求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字

分析:比如输入2,比较22和2,222和22,得出22=2+2*10,222=22*10+2.所以下一项为n_=n_()*10+a

求和采用累加法。

#include<stdio.h>
void main(){
    int i,a,n,s=0,k=0;
    scanf("%d%d",&a,&n);
    for(i=0;i<n;i++)
    {
        k=k*10+a;
        s+=k;
        printf("s=%d \n",s);

    }
}

————————————————————————————————————————————————————————

二、输入一行字符,分别统计出其中应为字母、空格、数字和其他字符的个数。

分析:大致思路就是,输入的字符中含有英文字母,空格,数字和其他字符。在while循环中通过isdigit,isalpha,空格和其他检测并记录各自出现的次数。这里以ctrl+z结束字符输入。

(可能对于C熟练者,这个很简单,甚至略有啰嗦。但我C忘记了很多,借此来复习知识点)

#include <stdio.h>

/*

stdio 就是指 “standard input & output"(标准输入输出

*/
#include <ctype.h>

/*

ctype.h 头文件提供了一些函数,可用于测试和映射字符。这些函数接受 int 作为参数,它的值必须是 EOF 或表示为一个无符号字符。如果参数 c 满足描述的条件,则这些函数返回非零(true)。如果参数 c 不满足描述的条件,则这些函数返回零。

*/
int main(void)
{
    int digit_count = 0, alpha_count = 0, blank_count = 0, other_count = 0;

//分别定义数字,字母,空格,其他字符变量。
    int ch;

    while( (ch = getchar()) != EOF )

/*getchar()只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符.*/

/* C标准函数库中表示文件结束符(end of file)*/
    {
        if(isdigit(ch)){

/*isdigit主要用于检查其参数是否为十进制数字字符*/
            digit_count++;
            continue;
        }
        if(isalpha(ch)){

/*isalpha用来判断字符ch是否为英文字母,当ch为英文字母a-z或A-Z时,返回非零值(不一定是1),否则返回零。*/
            alpha_count++;
            continue;
        }
        if( (ch == '\n') || (ch == ' ') || (ch == '\t') ){

//这里把换行,空字符,制表符都算作空格
            blank_count++;
            continue;
        }

        other_count++;

        //putchar(ch);
    } 

    putchar('\n');
    printf("数字字符个数: %d\n", digit_count);
    printf("字母字符个数: %d\n", alpha_count);
    printf("空白字符个数: %d\n", blank_count);
    printf("其他字符个数: %d\n", other_count);

    return 0;

三、/*一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? */

分析:记地面为0.从100开始,弹起来到50米的高度,第一次总路程为:100+50

         从50落下,弹起来到25米的高度,第二次总路程为50+25=100/2 +100/4

         从25落下,弹起来到25米的高度,第二次总路程为25+25/2=100/4 +100//8

        球每次从当前的初始点,落下弹起,总路程为当前高度+当前高度/2

#include<stdio.h>
void main(){ 
float sn=100.0,hn=sn/2; 
int n; 
for(n=2;n<=10;n++) 

sn=sn+2*hn;/*第n次落地时共经过的米数*/ 
hn=hn/2; /*第n次反弹高度*/ 

printf("the total of road is %f\n",sn); 
printf("the tenth is %f meter\n",hn); 
    
}

 

四、题目:如何引用一个已经定义过的全局变量?

参考答案:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

 

         extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。

补充问题:在一个 源文件里定义了一个 数组:char a;在另外一个文件里用下列语句进行了声明:extern char *a;

这样可以吗?

1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的 指针并不等价于类型T的 数组。extern char *a声明的是一个 指针变量而不是字符 数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。

2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 ( 数组的起始地址),而*a是重新定义了一个 指针变量,a的地址可能是0x87654321,直接使用*a是错误的.

3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。

4)、extern用在 变量声明中常常有这样一个作用:你要在*.c文件中引用另一个文件中的一个全局的变量,那就应该放在*.h中用extern来声明这个全局变量。

在定义( 函数)的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说:

尤其是对于变量来说。

extern int a;//声明一个全局变量a

int a; //定义一个全局变量a

extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。

int a =0;//定义一个全局变量a,并给初值,

声明之后你不能直接使用这个变量,需要定义之后才能使用。

第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。

虽然它们很相似,但是 定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个 extern int a可以出现很多次。

当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值