函数和数组习题

简介: 函数和数组习题

知识点

1.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝。

2.函数可以传址调用,传址调用的时候,可以通过形参操作实参。

3.函数可以嵌套调用,但是不可以嵌套定义。

4.形参和实参可以同名。

5.函数定义是说明函数是怎么实现的。

6.形参在函数调用的时候才实例化,才开辟内存空间。

7.函数调用如果采用传值调用,改变形参不影响实参。

8.函数设计应追求高内聚低耦合(即模块化)。是衡量程序的模块之间独立性的标准。要保证模块(函数,方法)内部高内聚,之间低耦合。比如一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要仍然可以不需要修改,这就说明程序的函数之间保持了较好的独立性,即:低耦合。同时各个模块的变量也是和自己模块保持着紧密的联系。说明也是高内聚的。可以这样理解,一个企业的管理, 最理想的情况就是各个部门各司其职,井然有序,互不干涉, 但是需要沟通交流的时候呢, 各个部门都可以找到接口人专门负责部门沟通以及对外沟通。

9.要尽量少的使用全局变量。(因为全局变量在整个工程中哪里、到处都可以使用,这个地方可以改,那个地方也可以改,此时就乱套了。少的去使用全局变量不至于让代码失控。)

10.函数的参数不易过多。

11.设计函数时,尽量做到谁申请的资源就由谁来释放。

12.库函数的使用必须包含对应的头文件。

13.在不同的函数中可以使用相同名字的变量。

14.函数中的形式参数是在栈中保存的。

15.在一个函数内定义的变量只能在本函数范围内有效。

16.在一个函数内复合语句中定义的变量在本函数范围内无效。


习题

1.函数调用fun((v1,v2),(v3,v4),v5,v6)中,实参的个数是4。(逗号表达式算一个)。


2.实现一个整型数组的冒泡排序(编程体)。

//冒泡排序
void bubble_sort(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz - 1; i++)
  {
  int j = 0;
  for (j = 0; j < sz - 1 - i; j++)
  {
    if (arr[j] > arr[j + 1])
    {
    int tmp = 0;
    tmp = arr[j];
    arr[j] = arr[j + 1];
    arr[j + 1] = tmp;
    }
  }
  }
}
#include<stdio.h>
int main()
{
  int arr[] = { 4,5,6,3,7,2,8,1,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  //进行排序
  bubble_sort(arr, sz);
  //打印数据
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  return 0;
}


3.编程题:创建一个整型数组,完成对数组的操作

1.实现函数Init()初始化为全0。

2.实现Print()打印数组的每一个元素

3.实现reverse()函数完成数组元素的逆置。



#include<stdio.h>
void Init(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  arr[i] = 0;
  }
}
void Reverse(int arr[], int sz)
{
  int left = 0;
  int right = sz - 1;
  while (left < right)
  {
  int tmp = arr[left];
  arr[left] = arr[right];
  arr[right] = tmp;
  left++;
  right--;
  }
}
void Print(int arr[], int sz)
{
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  printf("%d ", arr[i]);
  }
  printf("\n");
}
int main()
{
  int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int sz = sizeof(arr) / sizeof(arr[0]);
  //Init(arr, sz);//把数组初始化为0
  Print(arr, sz);//打印
  Reverse(arr,sz);//实现数组逆置
  Print(arr, sz);//打印
  return 0;
}


4.编程题:将数组A的内容和数组B中的内容进行交换(数组一样大)。

//交换数组
//通过创建临时变量的方式
#include<stdio.h>
int main()
{
  int arr1[5] = { 1,2,3,4,5 };
  int arr2[5] = { 6,7,8,9,10 };
  int tmp = 0;
  int sz = sizeof(arr1) / sizeof(arr1[0]);
  int i = 0;
  for (i = 0; i < sz; i++)
  {
  tmp = arr1[i];
  arr1[i] = arr2[i];
  arr2[i] = tmp;
  }
  return 0;
}

4.png


5.下列程序的运行结果是什么?

#include<stdio.h>
int i;//全局变量-不初始化-默认是0
int main()
{
  i--;
  if (i > sizeof(i))//sizeof()-计算变量/类型所占内存的大小
  {
  printf(">\n");
  }
  else
  {
  printf("<\n");
  }
  return 0;
}

5.png

6.编写一个函数实现n的k次方(使用递归实现)

#include<stdio.h>
double Pow(int n, int k)
{
  if (k == 0)
  return 1;
  else if (k > 0)
  {
  return n * Pow(n, k - 1);
  }
  else
  {
  return 1.0 / Pow(n, -k);
  }
}
int main()
{
  int n = 0;
  int k = 0;
  double ret = 0.0;
  scanf("%d %d", &n, &k);
  ret = Pow(n, k);
  printf("%lf", ret);
  return 0;
}


8.写一个递归函数Digitsum(n),输入一个非负整数,返回组成它的数字之和。

#include<stdio.h>
int Digitsum(n)
{
  if (n > 9)
  {
  return Digitsum(n / 10) + n % 10;
  }
  else
  {
  return n;
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int sum = Digitsum(n);
  printf("%d", sum);
  return 0;
}


9.编写一个函数reverse_string(char * string),用递归实现。

#include<stdio.h>
#include<string.h>
void reverse_string(char arr[])
{
  int l = 0;
  int r = strlen(arr) - 1;
  while (l < r)
  {
  char tmp = arr[l];
  arr[l] = arr[r];
  arr[r] = tmp;
  l++;
  r--;
  }
}
int main()
{
  char arr[] = "abcdef";
  reverse_string(arr);
  printf("%s", arr);
  return 0;
}

9.png




#include<stdio.h>
#include<string.h>
int Strlen(char *str)
{
  int count = 0;
  while ((*str) != '\0')
  {
  count++;
  str++;
  }
  return count;
}
void reverse_string(char *str)
{
  int l = 0;
  int r = Strlen(str) - 1;
  while (l < r)
  {
  char tmp = *(str + l);//char tmp = str[l];
  *(str + l) = *(str + r);//str[l]=str[r];
  *(str + r) = tmp;//str[r]=tmp;
  l++;
  r--;
  }
}
int main()
{
  char arr[] = "abcdef";
  reverse_string(arr);
  printf("%s", arr);
  return 0;
}


10.写一个函数返回参数二进制中1的个数

//注意此算法不能解决n是负数的问题
#include<stdio.h>
int count_bit_one(int n)
{
  int count = 0;
  while (n)
  {
  if (n % 2 == 1)
  {
    count++;
  }
  n /= 2;
  }
  return count;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int count = count_bit_one(n);
  printf("%d", count);
  return 0;
}

10.png


当输入为负数时:


法一:

#include<stdio.h>
int count_bit_one(unsigned int n)
{
  int count = 0;
  while (n)
  {
  if (n % 2 == 1)
  {
    count++;
  }
  n /= 2;
  }
  return count;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int count = count_bit_one(n);
  printf("%d", count);
  return 0;
}

10.1.png


法二:

#include<stdio.h>
int count_bit_one(int n)
{
  int count = 0;
  int i = 0;
  for (i = 0; i < 32; i++)
  {
  if (((n >> i) & 1) == 1)
  {
    count++;
  }
  }
  return count;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int count = count_bit_one(n);
  printf("%d", count);
  return 0;
}


法三(推荐):

#include<stdio.h>
int count_bit_one(int n)
{
  int count = 0;
  while (n)
  {
  n = n & (n - 1);
  count++;
  }
  return count;
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  int count = count_bit_one(n);
  printf("%d", count);
  return 0;
}


11.求二进制位中不同位的个数

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

输入样例:

1999 2299

输出样例:

7

//求二进制位中不同位的个数
#include<stdio.h>
int get_diff_bit(m, n)
{
  int tmp = m ^ n;
  return count_bit_one(tmp);
}
int count_bit_one(int n)
{
  int count = 0;
  while (n)
  {
  n = n & (n - 1);
  count++;
  }
  return count;
}
int main()
{
  int m = 0;
  int n = 0;
  scanf("%d %d", &m, &n);
  int count = get_diff_bit(m, n);
  printf("%d", count);
  return 0;
}


12.打印二进制中的奇数和偶数位。

获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。


//12.打印二进制中的奇数和偶数位。
#include<stdio.h>
void print(int n)
{
  int i = 0;
  printf("奇数位:\n");
  for (i = 30; i >= 0; i -= 2)
  {
  printf("%d ", (n >> i) & 1);
  }
  printf("\n偶数位:\n");
  for (i = 31; i >= 1; i -= 2)
  {
  printf("%d ", (n >> i) & 1);
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  print(n);
  return 0;
}

12.png


13.交换两个变量(不创建临时变量)

#include<stdio.h>
int main()
{
  int m = 0;
  int n = 0;
  scanf("%d %d", &m, &n);
  m = m ^ n;
  n = m ^ n;
  m = m ^ n;
  printf("%d %d", m, n);
  return 0;
}

14.函数判断素数

实现一个函数,判断一个数不是素数

利用上面的函数打印100到200之间的素数。


//函数判断素数
#include<stdio.h>
#include<math.h>
int is_prime(int n)
{
  int i = 2;
  for (i = 2; i <= sqrt(n); i++)
  {
  if (n % i == 0)
    return 0;
  }
  return 1;
}
int main()
{
  int i = 0;
  for (i = 100; i <= 200; i++)
  {
  if (is_prime(i) == 1)
  {
    printf("%d ", i);
  }
  }
  return 0;
}


14.png


15.乘法口诀表

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。

如:输入9,输出9^9口诀表,输入12,输出,…

//实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。
#include<stdio.h>
void print_table(int n)
{
  int i = 0;
  for (i = 1; i <= n; i++)
  {
  int j = 0;
  for (j = 1; j <= i; j++)
  {
    printf("%-2d*%-2d=%-3d ", i, j, i * j);
  }
  printf("\n");
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  print_table(n);
  return 0;
}

15.png

目录
相关文章
|
6月前
|
存储 C语言 索引
C语言数组求和,零基础也能轻松学会!
C语言数组求和,零基础也能轻松学会!
|
传感器 算法 C语言
C语言基础算法---从数组中找最大最小值的实际应用
C语言基础算法---从数组中找最大最小值的实际应用
88 0
|
6月前
|
C语言
C语言期末习题之数组逆序存放
C语言期末习题之数组逆序存放
88 0
|
6月前
|
C语言
C语言期末习题之二维数组转置
C语言期末习题之二维数组转置
48 0
|
5月前
|
存储 C语言
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m
|
存储
指针和数组简单填空题合集(纯刷题:60道)
指针和数组简单填空题合集(纯刷题:60道)
96 0
|
6月前
|
存储 C语言 索引
C语言数组求和方法
C语言数组求和方法
293 0
|
6月前
|
C语言
c语言编程练习题:7-54 求阶乘序列前N项和
c语言编程练习题:7-54 求阶乘序列前N项和
66 0