1. 干什么用函数?

    函数就是职能的卷入。

29:ISBN号码

  • 查看
  • 提交
  • 统计
  • 提问

总归时限制: 
1000ms

内存限制: 
65536kB

描述
诸一样仍标准出版的图书都发一个ISBN号码跟的相应,ISBN码包括9各类数字、1各项认识别码和3各分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分开隔符(键盘上的减号),最后一位是认识别码,例如0-670-82162-4不怕是一个标准的ISBN码。ISBN码的首各类数字代表书籍的问世语言,例如0代表英语;第一只分隔符“-”之后的老三个数字代表出版社,例如670代表维京出版社;第二单分隔后的五号数字代表该书于出版社的号子;最后一各类为识别码。

认识别码的乘除办法如下:

首各类数字就以1抬高次位数字就以2……以此类推,用所得的结果mod
11,所得的余数即为识别码,如果余数为10,则识别码为好写字母X。例如ISBN号码0-670-82162-4蒙受之辨识码4是这么得到的:对067082162马上9独数字,从左至右,分别就以1,2,…,9,再求和,即0×1+6×2+„„+2×9=158,然后抱158
mod 11底结果4用作识别码。

您的任务是编写程序判断输入的ISBN号码中识别码是否科学,如果没错,则单纯输出“Right”;如果误,则输出你当是对的ISBN号码。

输入
但发生一行,是一个字符序列,表示同样本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出
手拉手一行,假如输入的ISBN号码的认识别码正确,那么输出“Right”,否则,按照确定之格式,输出正确的ISBN号码(包括分隔符“-”)。

样例输入
样例 #1:
0-670-82162-4

样例 #2:
0-670-82162-0

样例输出
样例 #1:
Right

样例 #2:
0-670-82162-4

来源
NOIP2008复赛 普及组 第一题

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5 int t=0,sum=0;
 6 char n[15];
 7 scanf("%s",n);
 8 int len=strlen(n);
 9 for(int i=0;i<len-1;++i)
10 {
11 if(n[i]>='0'&&n[i]<='9')sum+=(++t)*(n[i]-'0');
12 }
13 if(sum%11==n[len-1]-'0'||sum%11==10&&n[len-1]=='X')printf("Right");
14 else{
15 n[len-1]='\0';
16 printf("%s",n);
17 if(sum%11!=10)printf("%d",sum%11);
18 else printf("X");
19 }
20 return 0;
21 }

 

函数就是以贯彻有意义而编写的如出一辙截代码

scanf()    ,  printf()

2.函数优点:

代码更精简

代码复用

一旦工作逻辑变化,只拿相应的函数修改一下即使得

  1. 岂定义一个函数

    void start () {

    ….

    }

    函数名为就是是函数在代码段被之输入地址

  2. 函数调用

经过函数名调用一个函数,程序执行到这儿后,就见面超越反到函数的中间去实践

  1. 函数的分类:库函数和从定义函数

  2. 函数参数,

于概念函数时声称的参数为形参,在调用函数时之参数为实参。

实参和形参是片只单身的变量,在函数中对形参所做的修改不影响实参。

7.以函数中,可以由此return语句子结束函数的实行,也可以通过return语句返回一个价

8.函数之递归调用,

在函数内部以调用函数它自己

 

 

 

指针

int a, b, c;

scanf(“%d%d%d”, &a, &b, &c);

printf(“a=%d, b=%d, c=%d\n”, a, b, c);

printf(“&a = %p, &b=%p, &c=%p\n”, &a, &b, &c);

 

0x33332222 是一个地址

通过变量名访问该存储空间

概念变量后,可能是编译器,也恐怕是操作系统,会拿变量名和地点之应和关系保留至内存分配表中

 

内存的每个字节单元都发生一个数字编号,称为地址

  占8个字节

 

内存分配表

 

int * p = &a;

 

保留地址的变量称为指针变量, p就是一个指针变量,它指向a变量, int *
是数据类型

p = &b;

 

printf(“%ld, %ld, %ld\n” , sizeof(p), sizeof(int *) , sizeof(*p));

 

scanf(“%d”, a);  //error, 需要指定数据类型int *, 而不是int

 

printf(“%lu”, pa) ;
//pa变量中的始末以10上前制输出 

printf(“%p”, pa) ;
//pa变量中之情节仍地址(十六进制)输出

 

 

int *pa = &a;

char *pc = &c;

?? pa多少字节, pc多少字节

MAC ,iphone 5S后是64各类,地址占8字节, iPhone
5s前的手机是32各之,地址占4个字节

据此指针变量保存之就算是地方,其尺寸及地方一样好,占8字节要么4字节

 

 

二、 *p 是什么

int a = 10;

int *pa = &a;

// &a, &取地址操作,表示到a的地方,
pa指向a变量

// *pa,
*取值操作,找到pa所记的地址单元进行取值

// *&a == a

*pa = 20;

printf(“%d\n”, *pa);

printf(“%d\n”, a);

 

练:声明整型变量a,存储数字5,定义一个指南针变量指向a,通过指针变量修改a变量的价。

 

其三、为什么采取指针?

两单数之置换swap()函数

void swap( int x , int y) {

  int t = x;

x = y;

y = t;

}

 

swap(a, b);

//在swap函数中交换了x和y,
并无影响实参a和b,是形参和实参是少数只单身的变量。

 

指南针就是为了看不以现阶段栈(堆)里的数额

 

void swap2( int *p , int *q) { //p = &a, q = &b

int t = *p;
// *p == a

*p = *q; //
*q == b

*q = t;

}

 

swap( &a, &b);

需要留意的凡,这儿并无改动形参,
形参是p和q ,而未是*p和*q,对形参p和q的修改并无影响实参

 

作业:编写函数,交换两独变量的价值

编纂函数,求三只变量的最好要命价值,在函数中将变量的价值清0

修函数,修改变量的值,将变量的价值改呢原来值的老三糟在

 

scanf(“%d”, &a); 
实际上即便是在scanf函数中修改变量a的价,所以要是用指针,传递一个地方

 

季、指针与数组

  1. 指针加1

    int a = 10;

    int *p = &a;

    printf(“%p\n”, p);

    printf(“%p\n”, p+1 ); //指针加1,相当给在本来地址的根底及加一个(int
    )的长度,或者说加一个(*p)的长度 

 

例:

int a = 10, b = 20;

    int *pb = &b;

    printf(“%d\n”, *pb); //20

    printf(“%d\n”, *(pb +1)); //10

 

  1. 指南针与数组

    int arr[5] = {1 ,2 ,3, 4, 5 };

    int *p = &arr[0]; //p指向第0个元素

    printf(“%d\n”, *(p+1));

    //输出2, p+1表示针对下一个数组元素, *(p+1) 就一定于arr[1]

 

数组名就是几度组的首地址,即 arr ==
&arr[0],访问数组的有元素arr[3]不时,就是经过反复组的首地址的基本功及,进行加3访问这个因素

 

int arr2[5] = {1,2,3,4,5};

int *p = a;

p+1 指向arr2[1]这个因素,
*(p+1)就是arr2[1]

a+2指向arr2[2]这元素,
*(a+2)就是arr2[2]

同样

arr2[3]凡是寻找引值3的因素

p[3] == arr2[3];  //是等价的

需要留意的凡:

p++; //正确,相当于p = p+1

a++; //错误,因为a数组名不能够修改

 

  1. 数组参数

    数组参数本质上即是一个指针

    倘若:编写一个函数打印数组的每因素

    void
    printArr( int *p ,int  length) {

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

    printf(“%d\t”, p[i] ) ;

    }

    printf(“\n”);

    p[2] = 110;
    //在这儿修改会潜移默化及主调函数的数组

    }

 

int arr[5] = {32,54,55,65,76};

printArr( arr, 5 );

printArr( &arr[0], 5);

printArr( &arr[2], 3);

 

习:编写函数,将任意长整型数组逆序列。

 

五.泛型指针和空指针

1.泛型指针

void *p;
//可以对任何变量,即好储存任何变量的地方;

int a;

char c;

int *pa = &a;

char *pc = &c;

p = pa;

p = pc;

需要注意的是,泛型指针不克得*操作,不可知加减操作

 

2.空指针:

而一个指针不初始化,指针可能凭借于不可预知的地点单元,这种指针称为野指针。如果下野指针,可能会见生出不可预知的错误

int *p;

*p = 123;
//危险

为了以防野
指针,如果创建指针时没有确定性的针对性,需要将指针设置为空指针

int * p = NULL;

 

六 const关键字

const修饰变量a,则变量a不克让改动

const int a = 5; 

a++;
//error, a不可知吃涂改

const修饰指针变量

const int *p = &a;

int const *q = &a;

q或者q可以本着任何的变量,但是,*p和*q是常量,不能够叫涂改,即:

*p = 30; 错误

  *(p+1) = 23; //也不对, *p是一个const
int常量,则*(p+1)也是一个const int常量

可以开展强制类型转换如下:

*(((int *) p) + 1) = 34;

 

int * const p = &a;  
表示指针变量p是一个常量,不可知修改p,即

p = &b;
//错误,

*p = 444;
//正确

 

学业:编写函数,求任意长度整形数组的平均数

编辑函数,求任意长度整形数组中第二百般的往往

修函数,传入一个字符串数组,找来最为丰富的英文单词,返回最丰富单词的起点索引

编函数,传入一个字符数组,返回数组中率先独冒出的假名,如果没字母返回0

修函数,传入一个字符数组,无需要回到值,将数组中字符压缩打印,如传入helloworld,打印h1e1l3o2w1r1d1

修函数,传入两独浮点数和一个字符(+、-、*、/),返回计算结果,如果除数是0,返回-9999

 

 

 1. 分析 int a; int * p = &a;

  1. 分析 *p

  2. 分析 p++;

  3. 分析(*p)++;

  4. 浅析函数传地址。

  5. 写图分析函数中改变*p,就是反本体。

  6. 动用指针,写点儿个照应的函数完成:

  int a, b, c;

char d, e, f;

整型求和后,将a,b, c置-1,

d, e, f 中字符,大小写转换。

  1. 分析int * p = 5;是可的;int b = &a;也是可以的;int b = &a;int *
    p = b也是得的,到底是怎么个过程。

 

 1.函数兑现输入一实行字符,另一样部数实现各自统计出里面英文字母、空格、数字和任何字符的个数。

2.函数贯彻输入一个曾经排好序的数组。再输入一个屡屡,要求仍原来的规律将她插入数组中。

3.函数贯彻将一个数组逆序。(并非逆序输出,是数组本身逆序)

4.函数实现有n个整数,使该前面各数顺序为后移m个岗位,最后m个数变成极前头的m个数

5.函数实现输入一实践字符,最深尺寸为90,统计有里面起小个字符串,不算是标点。例如:

输入:Hi, Welcome to Qianfeng!!

输出:4

6.编纂一个函数,时分秒,输出该时空的产一致秒。如输入23时59分开59秒,则输出0时0分0秒(**)

输入格式为    23:59:59

输出格式为    0:0:0

  1. 编纂函数将一个n*n矩阵转置,例如:(****)

  1 2 3 4     1 5 3 4

  5 6 7 8 ->  2 6 2 7  

  3 2 5 9     3 7 5 2

  4 7 2 3     4 8 9 3

8.函数贯彻,字符串排序,以main函数参数形式输入9个字符串,然后将字符串按字母顺序进行排序,如果首只假名相同则再次于下一个字母,以此类推。比如:

  “abcdefg”, “yusdfsdf”, “bsdf”, “bjiiig”, “zddd”,排序后也:

  “abcdefg”, “bbjiiig”, “bsdf”, “yusdfsdf”, “zddd”。