C语言笔记(六)

作用域和存储类型

作用域:变量的作用范围,每一个变量都有一个作用域,变量在自己的作用域内是有效的,离开自己的作用域后就无效

1:文件作用域:变量定义开始到文件结束

例子:全局变量

全局变量:函数外定义的变量

2:函数作用域:函数体中有效

例子:函数的形参

3:块{}作用域:变量定义开始,到}结束

例子:局部变量

局部变量:函数体中定义的变量

#include <stdio.h>

int c = 0;//全局变量,具有文件作用域

void add(int a, int b)//a,b函数行参,具有函数作用域

{

return a+b;

}

int d = 0;

int main(int argc, const char *argv[])

{

int e = 0;//局部变量,具有块作用域

return 0;

}

#include <stdio.h>

int main(int argc, const char *argv[])

{

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

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

}

printf("i = %d\n", i);//i是局部变量,具有块作用域

return 0;

}

同名标识符隐藏规则:就近原则

#include <stdio.h>

int a = 0;

int main(int argc, const char *argv[])

{

int a = 3;

printf("a = %d\n", a);

return 0;

}

变量的完整定义:

修饰符  存储类型  符号类型  数据类型  变量名

变量:存储数据

数据类型:决定了变量的大小

符号类型:决定最高位用来保存数据还是符号

存储类型:变量保存在哪里

1:自动存储auto:内存栈中

2:静态存储static:数据段

3:寄存器存储register:寄存器中

4:外部声明extern:只是声明变量,没有开辟存储空间

修饰符:const,volatile

内存分布图:

#include <stdio.h>

#include <stdlib.h>

int b = 0;//已经初始化的全局变量

static int c = 0;//已经初始化的static修饰的变量

int e;//未始化的全局变量

static int f;//未初始化的static修饰的变量

int main(int argc, const char *argv[])

{

//只读存储区

char *a = "abcd";

static int d = 0;//已经初始化的static修饰的变量

static int g;//未初始化的static修饰的变量

char *h = malloc(10);//堆

int i = 0;//局部变量,栈

printf("只读存储区 = %p\n", a);

printf("已经初始化的全局变量 = %p\n", &b);

printf("已经初始化的static修饰的变量 = %p\n", &c);

printf("已经初始化的static修饰的变量 = %p\n", &d);

printf("未初始化的全局变量 = %p\n", &e);

printf("未初始化的static修饰的变量 = %p\n", &f);

printf("未初始化的static修饰的变量 = %p\n", &g);

printf("堆 = %p\n", h);

printf("栈 = %p\n", &i);

return 0;

}

特点:

栈:局部变量,栈上的空间是由系统自动开辟,并且由系统自动释放(当发生函数调用时,系统会为局部变量在栈上开辟空间,函数调用结束后自动释放)

堆:程序员通过malloc开辟,free释放(整个程序运行结束后由系统释放,不建议)

数据段:数据段上数据在整个程序运行过程中一直存在,当程序结束后由系统释放

1、什么是地址(指针)

scanf——>&取出变量地址

数组名——>地址常量,等于数组首元素的地址

函数名——>地址常量,等于函数的入口地址

什么是地址?

内存中最小的单位是字节

2的64次方

地址:内存中每个字节前面都有一个编号,这个编号就是地址

变量的地址:变量在内存中某个字节的编号

什么是指针:地址就是指针,指针就是地址

2、如何去保存(指针)

思考:

整数——>整型变量

字符——>字符变量

指针——>指针变量

结论:通过指针变量来保存指针

3、指针变量的定义

格式:数据类型  *变量名;

变量名:满足标识符命名规则

*:表示该变量是一个指针变量

数据类型:指针所指向的变量的数据类型

为什么要这样定义?

变量名:变量的名字

*:表示该变量是指针变量

数据类型:

1:决定该指针所能指向的变量的数据类型

2:当指针指向一个数组时,数据类型决定指针加1(p+1),1的大小

int arr[5];

int *p = &arr[0];

p+1——>4个字节

char buf[10];

char *p = &buf[0]

p+1——>1个字节

int a = 0;

int (*p) = &a;

练习:

定义出两个指针变量,分别指向整型变量和字符型变量

int c=0;int *a=&c;

char d=‘e‘;char *b=&d;

4、指针变量的大小

计算方式:sizeof(变量名)

char *p=NULL;sizeof(p); 大小8个字节

int *p=NULL;sizeof(p); 大小8个字节

#include <stdio.h>

int main(int argc, const char *argv[])

{

int a = 0;

char ch = 0;

int *pa = &a;

char *pCh = &ch;

printf("sizeof(pa) = %lu\n", sizeof(pa));

printf("sizeof(pCh) = %lu\n", sizeof(pCh));

return 0;

}

指针变量的大小:指针变量的大小是由当前操作系统位数决定64位操作系统下的指针变量都是8个字节(32位是4个字节)

5、指针变量的赋值

1:初始化

int a=0;

int *p=&a;

2:赋值语句

int a=0;

int *p=NULL;

p=&a;

练习:定义出两个指针变量,分别指向整型变量和字符型变量,分别使用初始化和赋值语句的方式对变量进行赋值

6、指针变量的作用

1:保存指针

2:另一种操作数据的方式

#include <stdio.h>

int main(int argc, const char *argv[])

{

int a = 5;

int *pa = &a;

printf("&a = %p\n", &a);

printf("pa = %p\n", pa);

printf("a = %d\n", a);

printf("*pa = %d\n", *pa);

return 0;

}

`

7、与指针相关的基本操作

1:&

作用:取出变量的地址

2:*

1:*地址=

作用:向该地址中存数据

2:=*地址

作用:从该地址中取数据

3:p+n:当p指向一个数组时,p+1指向下一个元素

p——>&arr[0]

p+1——>&arr[1]

#include <stdio.h>

#define NUM 5

int main(int argc, const char *argv[])

{

int arr[NUM] = {};

int (*p) = &arr[0];

int i = 0;

for (i=0; i<NUM; i++){

printf("&arr[%d] = %p\n", i, &arr[i]);

printf("p+%d = %p\n", i, p+i);

}

return 0;

}

4:p-q:p和q指向同一个数组

int arr[5];

int *p = &arr[0];——>p+0

int *q = &arr[4];——>p+4

q-p————>4———>p和q之间相隔元素的个数

#include <stdio.h>

#define NUM 5

int main(int argc, const char *argv[])

{

int arr[NUM] = {};

int *p = &arr[0];

int *q = &arr[4];

printf("q - p = %ld\n", q-p);

return 0;

}

5:关系运算(p,q,p>q,p<q,p>=q,p<=q,p==q,p!=q)

#include <stdio.h>

#define NUM 5

int main(int argc, const char *argv[])

{

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

int *p = NULL;

for (p=arr; p<(arr+5); p++){

printf("*p = %d\n", *p);

}

return 0;

}

8、指针和其他数据类型的结合

1:指向基本数据类型变量的指针

例子:

int a = 3;

int *p = &a;

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

prntf(“*p = %d\n”, *p);

两个数的交换

int a = 3;

int b = 5;

int *pa = &a;

int *pb = &b;

int tmp = 0;

#include <stdio.h>

int main(int argc, const char *argv[])

{

int a = 3;

int b = 5;

int *pa = &a;

int *pb = &b;

int *pTmp = NULL;

int tmp = 0;

printf("a = %d\n", a);

printf("b = %d\n", b);

#if 0

tmp = a;

a = b;

b = tmp;

#endif

#if 0

tmp = *pa;

*pa = *pb;

*pb = tmp;

#endif

pTmp = pa;

pa = pb;

pb = pTmp;

printf("*pa = %d\n", *pa);

printf("*pb = %d\n", *pb);

// printf("a = %d\n", a);

// printf("b = %d\n", b);

return 0;

}

2:指向数值型数组首元素的指针

1:指向数组首元素指针的定义

例子:int arr[5];//arr等价于&arr[0]

初始化:

int *p = &arr[0];//int *p = arr;

赋值语句:

int *p = NULL;

p = &arr[0];//p = arr;

2:数组成员的引用://p等价于arr

下标法:arr[i], p[i]

指针法:   *(arr+i), *(p+i)

思考:arr和p是否完全等价

数组名是一个地址常量,不能够被修改(arr++不可以的)

指针变量是一个地址变量,可以被修改(p++可以的)

int arr[5];

int brr[5];

int *p = arr;

{

p操作arr

}

p = brr;

{

p操作brr

}

定义一个数组并初始化,用四种方式打印数组成员的值

#include <stdio.h>

#define NUM 5

int main(int argc, const char *argv[])

{

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

int *pArr = arr;

int i = 0;

for (i=0; i<NUM; i++){

printf("%d ", arr[i]);

}

printf("\n");

for (i=0; i<NUM; i++){

printf("%d ", pArr[i]);

}

printf("\n");

for (i=0; i<NUM; i++){

printf("%d ", *(arr+i));

}

printf("\n");

for (i=0; i<NUM; i++){

printf("%d ", *(pArr+i));

}

printf("\n");

return 0;

}

练习:

1:找出数组arr中值最大的数组成员,打印值(比较和查找)

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define NUM 10

int main(int argc, const char *argv[])

{

int arr[NUM] = {};

int i = 0;

int max = 0;

srand(time(NULL));

for (i=0; i<NUM; i++){//输入

*(arr+i) = rand()%100;

printf("%d ", *(arr+i));

}

printf("\n");

for (max=*(arr+0),i=0; i<NUM; i++){

if (max < *(arr+i)){

max = *(arr+i);

}

}

printf("max = %d\n", max);

return 0;

}

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define N 10

int main(int argc,
const char * argv[])

{

int a[N]={};

int *p=a;

int i,k=0;

srand(time(NULL));

for (; p<(a+N); p++) {

*p=rand()%100;

printf("%d ",*p);

}

printf("\n");

p=a;

for (; p<(a+N); p++) {

if (*p>k) {

k=*p;

i=p-a;

}

}

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

}

2:冒泡排序(排序)

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define NUM 10

int main(int argc, const char *argv[])

{

int arr[NUM] = {};

int i = 0;

int tmp = 0;

int j = 0;

srand(time(NULL));

for (i=0; i<NUM; i++){//输入

*(arr+i) = rand()%100;

printf("%d ", *(arr+i));

}

printf("\n");

for (j=0; j<NUM; j++){//冒泡执行的次数

for (i=0; i<NUM-1; i++){//相邻成员比较

if (*(arr+i) > *(arr+i+1)){//交换

tmp = *(arr+i);

*(arr+i) = *(arr+i+1);

*(arr+i+1) = tmp;

}

}

}

for (i=0; i<NUM; i++){//输入

printf("%d ", *(arr+i));

}

printf("\n");

return 0;

}

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define N 10

int main(int argc,
const char * argv[])

{

int a[N]={};

int *p=a;

int i,j,k=0;

srand(time(NULL));

for (; p<(a+N); p++) {

*p=rand()%100;

printf("%d ",*p);

}

printf("\n");

p=a;

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

for (j=0; j<N-i-1; j++) {

if (*(p+j)>*(p+j+1)) {

k=*(p+j);

*(p+j)=*(p+j+1);

*(p+j+1)=k;

}

}

}

for (; p<(a+N); p++) {

printf("%d ",*p);

}

printf("\n");

}

3:将数组a中的成员按相反顺序存放(逆序)

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define NUM 10

int main(int argc, const char *argv[])

{

int arr[NUM] = {};

int i = 0;

int tmp = 0;

srand(time(NULL));

for (i=0; i<NUM; i++){//输入

*(arr+i) = rand()%100;

printf("%d ", *(arr+i));

}

printf("\n");

for (i=0; i<(NUM/2); i++){//逆序

tmp = *(arr+i);//交换

*(arr+i) = *(arr+NUM-1-i);

*(arr+NUM-1-i) = tmp;

}

for (i=0; i<NUM; i++){//输入

printf("%d ", *(arr+i));

}

printf("\n");

return 0;

}

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define N 10

int main(int argc,
const char * argv[])

{

int a[N]={};

int *p=a;

int i=0,k=0;

srand(time(NULL));

for (; p<(a+N); p++) {

*p=rand()%100;

printf("%d ",*p);

}

printf("\n");

p=a;

for (; p<(a+N/2); p++) {

k=*p;

*p=*(p+N-i-i-1);

*(p+N-i-i-1)=k;

i++;

}

p=a;

for (; p<(a+N); p++) {

printf("%d ",*p);

}

printf("\n");

}

4:在有序的数组中插入整数n

5:在有序的数组中删除整数n

3:指向字符型数组首元素的指针

字符串的常见表示形式:

1:字符数组保存字符串

例子:char buf[5] = “abcd”;

2:指向字符串首地址的指针

例子:char *p = “abcd”;

3:指向数组首元素的指针

例子:char buf[5] = “abcd”;char *p = buf;

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

#if 0

char buf[SIZE] = "abcd";

buf[0] = ‘h‘;

printf("%s\n", buf);

char *p = "abcd";

*p = ‘h‘;//"abcd"是字符串常量,不能被修改

printf("%s\n", p);

#endif

char buf[SIZE] = "abcd";

char *p = buf;

buf[0] = ‘h‘;

p[1] = ‘S‘;

printf("%s\n", buf);

printf("%s\n", p);

return 0;

}

1:实现字符串处理函数strlen

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

int i = 0;

gets(buf);

for (i=0; *(buf+i); i++);

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

return 0;

}

3:实现字符串处理函数strcat

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf1[SIZE] = "";

char buf2[SIZE] = "";

int i = 0;

int j = 0;

gets(buf1);

gets(buf2);

for (i=0; *(buf1+i); i++);

for (j=0; *(buf2+j); j++){

*(buf1+i+j) = *(buf2+j);

}

printf("buf1 = %s\n", buf1);

printf("buf2 = %s\n", buf2);

return 0;

}

4:实现字符串处理函数strcpy

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf1[SIZE] = "";

char buf2[SIZE] = "";

int i = 0;

gets(buf2);

for (i=0; *(buf2+i); i++){

*(buf1+i) = *(buf2+i);

}

printf("buf1 = %s\n", buf1);

printf("buf2 = %s\n", buf2);

return 0;

}

5:实现字符串处理函数strcmp

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf1[SIZE] = "";

char buf2[SIZE] = "";

int i = 0;

int j = 0;

gets(buf1);

gets(buf2);

for (i=0; *(buf1+i) && *(buf2+i); i++){

if (*(buf1+i) != *(buf2+i)){

break;

}

}

printf("*(buf1+%d)-*(buf2+%d) = %d\n", i, i, *(buf1+i)-*(buf2+i));

return 0;

}

6:实现字符串处理函数strchr

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

char ch = 0;

int i = 0;

gets(buf);

ch = getchar();

for (i=0; *(buf+i); i++){

if (*(buf+i) == ch){

break;

}

}

if(*(buf+i)==0){

printf("null\n");

} else {

printf("%s\n", buf+i);

}

return 0;

}

8:给定一个英文句子,单词之间用1个空格分开,求其中所有单词的数量

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

int i = 0;

int t = 0;

gets(buf);

for (i=0; *(buf+i); i++){

if (*(buf+i) == ‘ ‘){

t++;

}

}

printf("t = %d\n", t+1);

return 0;

}

a b c d e f

p = strchr , p++

#include <stdio.h>

#include <string.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

char *p = NULL;

int t = 0;

gets(buf);

for (p=buf; (p=strchr(p, ‘ ‘)); t++, p++);

printf("t = %d\n", t+1);

return 0;

}

9:删除字符串中的数字字符

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

int i = 0;

int j = 0;

gets(buf);

for (i=0; *(buf+i); i++){//遍历buf

if ((*(buf+i)>=‘0‘) && (*(buf+i)<=‘9‘)){//在buf中找到数组字符

for (j=i; *(buf+j); j++){//循环前移

*(buf+j) = *(buf+j+1);

}

i--;//重复

}

}

printf("buf = %s\n", buf);

return 0;

}

10:将字符串中连续出现的空格(两个以上)合并成一个

strstr(p, “  ”)

a******b

#include <stdio.h>

#include <string.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

char *p = buf;

char *pCp = NULL;

int i = 0;

int j = 0;

gets(buf);

for (; (p = strstr(p, "  ")); p++){//遍历连续空格

for (pCp=p; *(pCp); pCp++){//循环前移

*pCp = *(pCp+1);

}

p--;//重复

}

printf("buf = %s\n", buf);

return 0;

}

11:找出字符串中首次只出现一次的字符

abcabc

abcdabc

flag = 1;

if (flag == 1){

break;

}

#include <stdio.h>

#define SIZE 100

int main(int argc, const char *argv[])

{

char buf[SIZE] = "";

int i = 0;

int j = 0;

int flag = 0;

gets(buf);

for (i=0; *(buf+i); i++){//取出buf中的每个字符

for (j=0, flag=0; *(buf+j); j++){//查找每个字符出现的次数

if (*(buf+i) == *(buf+j)){

flag++;//计数

}

}

if (flag == 1){//判断出现的次数

break;

}

}

if (*(buf+i) == 0){

printf("没有\n");

} else {

printf("%c\n", *(buf+i));

}

return 0;

}

4:指向指针的指针

int a = 3;

int (*p) = &a;

int *(*pp) = &p;

int **(*ppp) = &pp;

printf(&a);

printf(p);

printf(*pp);

printf(**ppp);

printf(a);

printf(*p);

printf(**pp);

printf(***ppp);

#include <stdio.h>

int main(int argc, const char *argv[])

{

int a = 3;

int *p = &a;

int **pp = &p;

int ***ppp = &pp;

printf("&a = %p\n", &a);

printf("p = %p\n", p);

printf("*pp = %p\n", *pp);

printf("**ppp = %p\n", **ppp);

printf("a = %d\n", a);

printf("*p = %d\n", *p);

printf("**pp = %d\n", **pp);

printf("***ppp = %d\n", ***ppp);

return 0;

}

5:指向函数的指针

6:指向结构体变量的指针

7:指向结构体数组的指针

9、const修饰指针

常见const修饰的指针:

1:const int *p;//*p不能变

2:int const *p;//*p不能变

3:int *const p;//p不能变

4:const int *const p;//*p和p都不能变

const修饰谁谁不能变

const离谁近谁就不能变

10、指针数组

思考:

大量整型变量———>整型数组

大量字符变量———>字符数组

大量指针变量(指向的变量的数据类型相同)———>指针数组

指针数组:本质是数组,数组的成员是指针

int *pArr[5];

pArr——>&pArr[0]

指针数组的定义:

格式:数据类型 *数组名[常量];

数组名:地址常量,等于数组首元素的地址,数组名是二级指针

常量:数组成员的个数

数据类型 *:数组成员的类型

数据类型:数组成员指向变量的数据类型

例子:

int *pArr[5] = {int*p0, int *p1…..};

int *

int

练习:

1:通过比较,找出五个字符串中最大的字符串并输出

char *pArr[5] = {“bei”, “jing”, “huan”,”ying”, “nin”}

char buf0[100] = “bei”;

char buf1[100] = “jing”

……

char *pArr[5] = {buf0, buf1, buf2, buf3, buf4};

char *pMax = pArr[0];

if (strcmp(pMax, pArr[i]) < 0){

pMax = pArr[i];

}

printf(“%s”, pMax);

#include <stdio.h>

#include <string.h>

#define NUM 5

int main(int argc, const char *argv[])

{

char *pArr[NUM] = {"bei", "jing", "huan", "ying", "nin"};

char *pMax = NULL;

int i = 0;

for (pMax=pArr[0],i=0; i<NUM; i++){//遍历数组

if (strcmp(pMax, pArr[i]) < 0){//将pMax和数组成员比较

pMax = pArr[i];

}

}

printf("pMax = %s\n", pMax);

return 0;

}

2:实现五个字符串的排序

#include <stdio.h>

#include <string.h>

#define NUM 5

int main(int argc, const char *argv[])

{

char *pArr[NUM] = {"bei", "jing", "huan", "ying", "nin"};

int i = 0;

char *pTmp = NULL;

int j = 0;

for (j=0; j<NUM; j++){

for (i=0; i<(NUM-1); i++){//冒泡

if (strcmp(pArr[i], pArr[i+1]) > 0){//相邻成员比较

pTmp = pArr[i];//交换

pArr[i] = pArr[i+1];

pArr[i+1] = pTmp;

}

}

}

for (i=0; i<NUM; i++){

printf("%s\n", pArr[i]);

}

return 0;

}

11、malloc和free

malloc在堆上开辟存储空间

free释放存储空间,把该存储空间的使用权还给系统

数据类型 数组名[常量];

数组名:数组首元素的地址

int arr[5];//可以//栈上开辟了一个数组,数组成员5个每个成员大小4个字节

int n;

scanf(“%d”, &n);

int arr[n];//不可以的

int *pArr = malloc(sizeof(int)*5);//4*5

int n = 0;

scanf(“%d”, &n);

int *pArr = malloc(sizeof(int)*n);//可以的

char *p = malloc(sizeof(char)*100);

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main(int argc, const char *argv[])

{

int n = 0;

scanf("%d", &n);

char *p = malloc(sizeof(char)*n);

strcpy(p, "bei jing huan ying nin");

printf("p = %s\n", p);

return 0;

}

课后练习:(指针实现)

1.
给定某个字符数组,统计数组中所有英文字符的个数,比如“123fdd”中有3个。

2.
给定某个字符数组,统计数组中所有英文字符和阿拉伯数字的个数,比如“123fdd”中有英文字符有3个,数字3个。

3.
给定某个拥有5个元素的字符数组,数组的成员都有阿拉伯字符构成,试着将该数组转换成一个整数,比如字符数组的内容是:{‘1’,’2’,’3’,’3’,’2’}
则将被转换成12332。

4.
给定一个完全由英文字符构成的数组,将数组中的小写字母转换成大写字母,大写字母转换成小写字母并输出。例如“abcGGG”转化为“ABCggg”。

5.
给定一个完全由英文字符构成的数组,将数组中下标为偶数的字符都转换为大写(如果原来是大写则不变)。

6.
给一个完全由英文字符构成的字符数组加密,加密原则如下,除了字符‘Z’和‘z’之外,每个字符变成ASCII码值比它大1的字符,也就是‘A’变成‘B’。‘Z’或者‘z’转化为‘A’或者‘a’。

7.
计算某个由英文、数字以及标点符号构成的数组的总宽度,其中英文字符的宽度为1cm,数字宽度为0.5cm、标点符号宽度为0.8cm。

8.
接上题,如果规定行的宽度为10cm,将某个字符长度超过50的字符串截断,恰好使10cm宽的行能容纳。输出这个被截断的子数组。

9.
给定某个整型数组,计算该数组所有偶数的合。

10.
给某个整型数组赋值,赋值规律如下,下标能被3整除的都赋值为1,能被5整除的都赋值为2,能被7整除的都赋值为3,其余都赋值为0.

11.
通过终端输入10个整数并将其保存在一个整型数组中,数字保存在数组中的顺序与下标正好相反,也就是第一个被输入的数放在数组最后一个元素中,最后一个输入的数字放到第一个元素中。

12.
通过终端输入10个整数,计算10个整数中所有能被3整除的数的合。

13.
给定一个5个元素构成的整型数组,每个元素的值都在0-9之间,按照位置将其组成一个5位数并输出,例如int
a[5] = {1,2,2,3,7};则输出73221。

14.
给定2个大小一样的整型数组,将某个数组作为源数组,另一个作为目的数组,然后将源数组的内容拷贝到目的数组。

15.
给定一个整型数组,将第一个跟最后一个元素的内容交换。

16.
给定一个整型数组,从第1个元素开始将相邻的两个元素分别相互交换。交换完后,第1个元素将变成最后一个元素,其余元素都前进一位。

17. 给定一个有10个整形数的元素,将前5个元素跟后5个元素做整体交换,比如{1,1,1,1,1,2,3,2,2,2}->{2,3,2,2,2,1,1,1,1,1}。

18. 判断一个整型数组是否是对称数组,例如{1,2,3,3,2,1}和{1,6,8,1,8,6,1}都是对称数组。

19.
给定两个大小一样的整型数组,交换这两个数组的内容。

20.
给定两个大小一样的整型数组,将两个数组中下标一样的元素两两相加,相加后的结果作为这两个数组对应下标的新值,也就是操作完毕后两个数组的内容完全相同。

21.
给定一个能容纳10个元素的整型数组,现有9个元素,现在第5个元素的位置插入一个数字88,后面的数字顺序后移。

22.
给定一个10个元素的整型数组,现在将第2个元素删除,后面的数组顺序前移。

23.
给定一个有100个元素的数组,查询数组中是否有元素的值等于某个数n。

24.
给定一个整型数组,求该数组元素中最大值的下标。

25.
给定一个整型数组,求该数组中第二大的数的下标。

26.
给定一个整型数组,求该数组中数值小于10的元素的个数。

27.
给定一个整型数组,计算大于该数组平均值的元素的个数。

28.
给定一个整型数组,找到数组中的最小值,并将其放到数组的首元素中,原来首元素的内容放到最小值所在的元素中。

29.
给定一个整型数组,统计某个整数在数组中出现的次数。

30.
给定一个英文句子,单词之间用1个空格分开,求出第2个单词的偏移位置。例如“Professor du comes from
Korea”的偏移位置是10。

31.
给定一个英文句子,单词之间用1个空格分开,求其中所有单词的数量。

32.
给定两个字符数组,将这两个拼接起来放在第一个数组中(假定第一个数组足够长),比如“abc”和“123”构成“abc123”。

10:将一个字符串进行逆序

例如:逆序前:abcdefg
逆序后:gfedcba

11: 一个字符串,其中有多个单词,单词之间用空格分开,将每个单词进行逆序

例如:逆序前:abc defg heitf
逆序后:cba gfed ftreh

12输入10个数,找出出现次数最多的数
(如果多个并列,则按数字出现顺序分别输出)

13:有m个人围成一圈,开始顺序报数,报到n退出,问最后剩下的是几号。(从1号开始)

14:将字符串中连续出现的空格(两个以上)合并成一个

课后练习:

1:用数组来处理Fibonacci数列的前20个成员的值。

2:有一篇文章,共有三行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。

3:有一行电文,已按下面的规律译成密码:

A-Z a-z

B-Y b-y

C-X c-x

… …

即第一个字母编程第26个字母,第i个字母编程第(26-i+1)个字母。非字母字符不变,要求编程序将密码译回原文,并输出密码和原文。

时间: 2024-11-26 22:42:26

C语言笔记(六)的相关文章

C++语言笔记系列之十六——赋值兼容规则&amp;多继承的二义性

1.赋值兼容规则 (1)派生类对象可以给基类对象赋值,这种情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:但是不允许将一个基类的对象赋值给一个派生类. (2)可以将派生类对象的地址赋给基类指针,使基类指针指向派生类对象,通过基类指针引用成员时只可以引用派生类从基类继承而来的成员,而不允许引用派生类的新成员. (3)引用与指针相同. 2.多继承 (1)一个派生类从两个以上的基类中去继承. (2)说明: class 派生类名:继承方式 基类1, 继承方式 基类2,...... {派生类成员

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

C语言笔记1--类型、运算符与表达式

 C语言笔记1--类型.运算符与表达式 总论: 变量和常量是程序处理的两种基本的数据对象.声明语句说明变量的名字和类型,也可以指定变量的初值.运算符指定将要进行的操作.表达式则把变量与常量组合起来生成新的值.对象的类型决定该对象可取值的集合以及可以对该对象执行的操作. 一.变量与常量的名字 1.名字是由字母.下划线和数字组成的序列,其第一个字符必须为字母:下划线"_"被看做是字母,但一般不要以下划线"_"开头. 2.名字区分字母大小写,变量名使用小写字母.符号常量

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

C++语言笔记系列之十二——C++的继承

C++的继承 1.继承方式 public(公有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象只能访问基类的public成员. protected(保护继承),private(私有继承) 派生类中的成员可以访问基类的public成员和protected成员,但不能访问基类的private成员. 派生类的对象不能访问基类的任何成员. 2.例子 example 1: #include <iostream.h> clas

C语言笔记

C语言笔记 基础知识 数据类型 序号 类型与描述 1 基本类型: 它们是算术类型,包括:整数类型.浮点类型 2 枚举类型: 也是算术类型,被用来定义只能使用某些整型值的变量,使用时需要程序员先使用eumn关键字来声明定义 3 Void类型: 用于函数,指明函数的返回值或参数.作用于变量会发生编译错误 4 派生类型: 包括:指针类型.数组类型.结构类型.联合体类型.函数类型 补充:1.函数类型是指函数返回值的类型,数组类型与结构类型统称为聚会类型. 2.除了基本类型,其他的类型都是程序员使用相关关

嵌入式linux C++语言(六)——运算符重载

嵌入式linux C++语言(六)--运算符重载 运算符重载的本质是函数重载. 一.重载基础 1.运算符重载的语法 返值类型 operator 运算符名称(形参表列){    重载实体;} 2.友元重载 可以将运算符重载函数声明位友元函数 #include <iostream> using namespace std; class Complex { public:     Complex(float x=0, float y=0)         :_x(x),_y(y){}     voi

C++语言笔记系列之十七——虚基类

1.虚基类 考虑这样一种情况:当某个类的部分或者全部直接基类是另一个共同基类派生而来,这些直接基类从上一级基类继承而来的成员就一定拥有相同的名称,这样就会产生二义性问题. 解决办法:当派生类和直接基类产生了二义性问题-->加类的作用域. 当派生类和间接基类产生了二义性问题-->虚基类. 2.虚基类的说明: class 派生类名:virtual 访问权限 基类名 {派生类定义}; 注意:在定义派生类时将需要继承的基类进行虚化声明,虚基类的说明在派生类的定义中完成. 作用:将基类说明为虚基类之后,

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与