苏嵌实训——day5(下)

简介: 苏嵌实训——day5(下)

练习: 实现mystrcmp函数的功能


#include <stdio.h>
int Mystrcmp(const char *p,const char *q)
{
  while(*p != '\0' && *q != '\0')
  {
  if(*p > *q)
  {
    return 1;
  }
  else if(*p < *q)
  {
    return -1;
  }
  p++;
  q++;
  }
  if(*p == '\0' && *q != '\0')
  {
  return -1;
  }
  else if(*p != '\0' && *q == '\0')
  {
  return 1;
  }
  else if(*p == '\0' && *q == '\0')
  {
  return 0;
  }
}
int main(int argc, const char *argv[])
{
  char s1[] = "hellworld";
  char s2[] = "hello z";
  int ret = Mystrcmp(s1,s2);
  if(ret == 0)
  {
  printf("s1 = s2\n");
  }
  else if(ret > 0)
  {
  printf("s1 > s2\n");
  }
  else
  {
  printf("s1 < s2\n");
  }
  return 0;
}


8.3 函数的参数


#include <stdio.h>
int i = 100;
int j = 200;
void myadd1();  
void myadd2();
void myadd3(int a,int b);
int main(int argc, const char *argv[])
{
  myadd1();
  myadd2();
  myadd3(1,2);
  return 0;
}
void myadd1()
{
  int sum = i+j;
  printf("sum = %d\n",sum);
  return;
  //return 1;
}
void myadd2()
{
  i = 300;
  j = 400;
  return;
}
void myadd3(int a,int b)   //形参,参数之间用逗号隔开
{
  int sum = a + b;
  printf("sum = %d\n",a+b);
}


8.4 函数的返回值


#include <stdio.h>
int add(int a,int b);
int main(int argc, const char *argv[])
{
  int a = 1,b = 2; //实参
  int ret = add(a,b);
  return 0;
}
//函数名左边的是返回值类型,要与返回值的类型一致
int add(int a,int b)
{
  int sum = a+b;
  //函数的返回值:含税执行结束的时候,如果需要将有些值返回
  //给其他函数,那么就需要有返回值,反之不需要返回值
  return sum;  //将结果返回
}


练习:


编写一个函数,返回a的n次幂


#include <stdio.h>
int myPow(int a,int n);
int main(int argc, const char *argv[])
{
  printf("%d\n",myPow(3,5));
  return 0;
}
int myPow(int a,int n)
{
  if(a == 0)
  {     
  return 0;
  }
  int num = 1;
  while(n != 0)
  {
  num = num *a;
  n--;
  }
  return num;
}


8.5 函数的传参方式


8.5.1 传参方式


一般分为三种:

全局变量传参:

一般不用,因为全局变量本身就可以在函数内部直接使用,不需要专门传参

值传参:将实参的值传递给形参

地址传参:将实参的地址传给形参


#include <stdio.h>
void Swap(int *a,int *b);
int main(int argc, const char *argv[])
{
  int a = 100,b = 200;
  printf("a = %d,b = %d\n",a,b);
  Swap(&a,&b);
  printf("a = %d,b = %d\n",a,b);
  return 0;
}
void Swap(int *a,int *b)
{
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}


8.5.2 一维数组传参


#include <stdio.h>
//一维数组作为参数传给函数,有两种方法
//第一种:传int a[]
//第二种:传 int *a  //常用
//第三种:传 int a[100]
//void myOrder(int *arr,int n)
//void myOrder(int arr[],int n)
void myOrder(int arr[1000],int n)
{
  int i;
  printf("sizeof(arr) = %ld\n",sizeof(arr));//arr只是一个指针变量,不是数组名,所以无法通过这个指针变量获取数组所占空间大小
  for(i = 0 ; i < n;i++)
  {
  printf("%d ",arr[i]);
  }
  putchar(10);
}
int main(int argc, const char *argv[])
{
  int a[] = {1,2,3,4,5,6,7,8,9,10};
  myOrder(a,sizeof(a)/sizeof(a[0]));
  return 0;
}


练习:编写函数,实现冒泡排序


#include <stdio.h>
void Sort(int a[],int length)
{
  int i,j;
  for(i = 0 ; i < length - 1;i++)
  {
  for(j = 0 ; j < length - 1 - i;j++)
  {
    if(a[j] < a[j+1])
    {
#if 0
    int t = a[j];
    a[j] = a[j+1];
    a[j+1] = t;
#endif
    a[j] = a[j] + a[j + 1];
    a[j + 1] = a[j] - a[j + 1];
    a[j] = a[j] - a[j + 1];
    }
  }
  }
}
void Print(int a[],int length)
{
  int i;
  for(i = 0 ; i < length;i++)
  {
  printf("%d ",a[i]);
  }
  putchar(10);
}
int main(int argc, const char *argv[])
{
  int a[10] = {0};
  printf("请输入10个数字:\n");
  int i;
  int length = sizeof(a)/sizeof(a[0]);
  for(i = 0 ; i < length;i++)
  {
  scanf("%d",&a[i]);
  }
  Sort(a,length);
  Print(a,length);
  return 0;
}


8.5.3 二维数组的传参


#include <stdio.h>
//二维数组传参
//方法1:直接传int a[3][4]
//方法2:传数组指针
void ArrayOrder(int a[3][4])
{
  int i,j;
  for(i = 0 ; i < 3;i++)
  {
  for(j = 0 ; j < 4;j++)
  {
    printf("%-5d",a[i][j]);
  }
  putchar(10);
  }
}
int main(int argc, const char *argv[])
{
  int a[3][4] = {1,2,3,4,5,6,7,8,9,10,12,11};
  ArrayOrder(a);
  return 0;
}


8.5.4 指针数组传参


#include <stdio.h>
//指针数组传递:
//方式1:直接传指针数组
//方式2: 传二级指针
void PointArrayOrder(char *s[],int n)
{
  int i;
  for(i = 0 ; i < n;i++)
  {
  printf("s[%d] = %s\n",i,s[i]);
  }
}
int main(int argc, const char *argv[])
{
  char *s[4];
  char s1[] = "hello world";
  char s2[] = "hello nanjing";
  char s3[] = "hello beijing";
  char s4[] = "hello shanghai";
  s[0] = s1;
  s[1] = s2;
  s[2] = s3;
  s[3] = s4;
  PointArrayOrder(s,4);
  return 0;
}


8.6 main的参数


#include <stdio.h>
//main的参数可以不谢,也可以只有一个argc,也可以有两个argc和argv,
//argc:int类型变量,用于保存命令行参数的个数
//argv:是一个指针数组,用来保存多个字符串,用来保存命令行传入的每一个字符串
int main(int argc, const char *argv[])
{
  printf("argc = %d\n",argc);
  int i;
  for(i = 0; i < argc;i++)
  {
  printf("argv[i] = %s\n",argv[i]);
  }
  return 0;
}


8.7 指针函数


指针函数:本质是一个函数,函数的返回值是一个地址


#include <stdio.h>
#include <string.h>
//返回值是指针的函数,叫指针函数
char *find_sub(char *str,const char *sub)
{
  int str_len = strlen(str);
  int sub_len = strlen(sub);
  int i;
  for(i = 0 ; i < str_len - sub_len + 1 ;i++)
  {
  if(strncmp(str + i,sub,sub_len) == 0)
  {
    return str + i;
  }
  }
  return NULL;
}
int main(int argc, const char *argv[])
{
  char str[] = "helloworld";
  char sub[] = "worl";
  char *s = find_sub(str,sub);
  if(NULL == s)
  {
  printf("不存在!\n");
  return -1;
  }
  printf("s = %s\n",s);
  return 0;
}


8.7.1 malloc/free


头文件:#include 
原型:void *malloc(size_t size);
      void free(void *ptr);
功能:malloc用于在堆上手动申请size个字节大小的空间
     free用于手动释放malloc申请的空间
参数:(malloc):size表示申请size个字节
      (free):ptr:表示申请空间的首地址
返回值:(malloc):
  成功:返回申请空间的首地址,类型为void*(万能指针)
  失败:返回NULL
        (free):无返回值


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//返回值是指针的函数,叫指针函数
char *find_sub(char *str,const char *sub)
{
  int str_len = strlen(str);
  int sub_len = strlen(sub);
  int i;
  for(i = 0 ; i < str_len - sub_len + 1 ;i++)
  {
  if(strncmp(str + i,sub,sub_len) == 0)
  {
    return str + i;
  }
  }
  return NULL;
}
void InitMemory(char **str,char **sub)
{
  *str = (char *)malloc(sizeof(char)*128);
  *sub = (char *)malloc(sizeof(char)*32);
}
int main(int argc, const char *argv[])
{
  //char str[] = "helloworld";
  //char sub[] = "worl";
  char *str = NULL,*sub = NULL;
  InitMemory(&str,&sub);
  scanf("%s%s",str,sub);
  char *s = find_sub(str,sub);
  if(NULL == s)
  {
  printf("不存在!\n");
  return -1;
  }
  printf("s = %s\n",s);
  free(str);
  free(sub);
  str = NULL;
  sub = NULL;
  return 0;
}


作业:所有代码至少敲2遍

相关文章
|
3月前
|
Java 关系型数据库 MySQL
|
Ubuntu API 数据库
苏嵌实训——day19
苏嵌实训——day19
101 0
苏嵌实训——day19
|
网络协议 安全 网络安全
苏嵌实训——day18
苏嵌实训——day18
苏嵌实训——day18
|
存储 自然语言处理 C语言
苏嵌实训——day2(上)
苏嵌实训——day2(上)
128 0
苏嵌实训——day2(上)
|
存储
苏嵌实训——day9(上)
苏嵌实训——day9(上)
苏嵌实训——day9(上)
|
存储 Ubuntu 固态存储
苏嵌实训——day1
苏嵌实训——day1
136 0
苏嵌实训——day1