IOS开发之路-C 学习笔记7.23


今天实在不想写什么,感觉好累.简单copy了.

我有一个很坏的毛病,就是不喜欢写注释.

以后一定改正!

掌握指针的声明和使用方法
理解数组的指针及指针和字符串间的关系
掌握值传递,地址传递的特点
了解指针数组的声明和使用方法
掌握使用指针处理字符串的方法
一个内存中的地址称为指针
对指针变量赋值
int i=10;  int *p ; p = &i;
int i = 10;  int *p = &i;

p  = arr[0] 错误
p = &arr[0] 正确
p = &arr[3] ;正确
p = arr;正确
int *p1 = arr; 正确
int *p2 = &arr[n]; 正确

字符串指针变量的声明
char str[] = "hello world"; char *p;p = str;
也可以写成如下形式
char *p = "hello world";
取得字符型指针变量所指向的字符串
printf("%s",p);
使用NULL('\0')作为结束标示符

数组指针与
指针数组
char* str[3] = {"hello","world","!!!!"};
*str  取出值为: "hello"
*str+1  取出值为:"world"
*(*(str+1)+1) 取出的值为:'o'
 C语言规定,它是一种地址计算方法,表示数组a第i行首地址。由此,我们得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也
可 以看成是a[0]+0是一维数组a[0]的0号元素的首地址, 而a[0]+1则是a[0]的1号元素首地址,由此可得出a[i]+j则是一维数组a[i]的j号元素首地址,它等于&a[i][j]。由 a[i]=*(a+i)得a[i]+j=*(a+i)+j,由于*(a+i)+j是二维数组a的i行j列元素的首地址。该元素的值等于*(* (a+i)+j)。

给定两个数组,然后编写一个数组拷贝函数,有两个参数,形式为数组类型。函数中实现将第二个数组的内容复制到第一个数组中。

void myStrCpy(char s1[],char s2[])
{
    // int i = 0;
    int len1 = (int)strlen(s1);
    int len2 = (int)strlen(s2);
    printf("%d %d\n",len1,len2);
    if(s2 == NULL )
    {
        printf("对不起,复制为空");
    }
    else if(len2>len1)
    {
        for (int i = 0; i<len1; i++)
        {
            s1[i] = s2[i];
        }
    }
    else if(len2 <= len1)
    {

        int i = 0;
        while ( (s1[i] = s2[i]) != '\0' )
        {
            i++;
        }
        for (int j = len2 ; j<len1 ; j++)
        {
            s1[j] ='0';
        }
    }
    printf("复制后为:%s",s1);
}

给定几种商品的名称,价格以及购买数量,然后打印购物小票清单。要求有每种商品的明细以及总金额。


void superMarketShop()
{
    char top[][20] = {{"商品名  "},{"单价    "},{"购买数量"},{"价格小计"}};
    char name[][20] = {{"冰红茶  "},{"绿茶    "},{"百事    "},{"红牛    "},{"统一老坛"}};
    float price[count] = {3.0 , 3.0 , 3.0 , 5.0 , 3.5};
    int  quantity[count] = {3 , 5 , 2 , 1 ,5};
    float total[count] = {'\0'};
    float *p_p = price;
    int *p_q = quantity;
    float *sum = total;
    float tSum = 0;
    for(int i = 0 ; i<count-1;i++)
    {
        printf("%s\t",top[i]);
        if(i>=(count-2))
            printf("\n");
    }
    for(int i = 0; i<42;i++)
    {
        printf("-");
        if(41 <= i)
            printf("\n");
    }
    for (int i = 0; i<count; i++)
    {
        *(sum + i) = (*(p_p+i) * *(p_q + i));
        printf("%s\t",name[i]);
        printf("%.1f\t\t",*(p_p+i));
        printf("%d\t\t",*(p_q + i));
        printf("%.1f\n",*(sum+i));
        tSum += *(sum + i);
    }
    printf("\t\t\t\t总金额:\t%.1f",tSum);
}

编写一个自己的字符串比较函数,有两个参数,每一个参数都是字符指针类型,如果第一个字符串大于第二个字符串的话返回一个正数,如果第一个字符串小于第二个字符串则返回一个负数,如果第一个字符串完全等于第二个字符串则返回0。返回的正数或负数是第一个不同字符的ASCII码差值


int myStrcmp(char *s1,char *s2)
{
    //int i = 0;
    int n = 0 ;
    int value = 0;
    for (int i = 0; *(s1+i) != '\0' || *(s2+i) != '\0' ; i++)
    {
       value =  *(s1+i) - *(s2+i) ;
        if(value == 0)
        {
          //  printf("%c", *(s1+i));
            n = 0;
            continue;
        }
        else if(value > 0)
        {
           //printf("%c小\n", *(s1+i));
            n = 1;
            break;
        }
        else
        {
            n = -1;
            //printf("%c大\n", *(s2+i));
            break;
        }
    }
    return n;
    //printf("ASCII差值为:%d",n);
}

由控制台输入5个字符串,然后排序整理,按照字母顺序来排序整理。然后输出排序后的结果,要求使用指针实现。

(以下是两种方法,数组和指针方法)

void strSort()
{
    char str[5][30]={'\0'};
    char (*s_str)[30];
    int value = 0;
    s_str = str;
    
    for(int i = 0 ;i < 5 ;i++)
    {
        printf("请输入第[%d]个字符串:",i+1);
        scanf("%s",str[i]);
    }
    printf("排序后:\n");
    for(int i = 0 ;i < 5 ;i++)
    {
        for(int j = i+1;j<5 ;j++)
        {
            char *s1 = str[i];
            char *s2 = str[j];
            value = myStrcmp(s1,s2);
            if(value == 0)
            {
                continue;
            }
            else if(value > 0)
            {
                char temp[30];
                strcpy(temp , str[i]);
                strcpy(str[i],str[j]);
                strcpy(str[j], temp);
            }
//        for(int j  = 0 ; *(*(s_str+i)+j) != '\0' ;j++)
//        {
//            printf("%c",*(*(s_str+i)+j));
//            //printf("%d ",value);
//        }	
//        printf("\n");
        }
//        printf("%s\n",str[i]);
    }
    for (int i = 0;  i < 5; i++)
    {
        printf("%s\n", str[i]);
    }
}
void strSort2()
{
    char str[5][30]={0};
    int value = 0;
    for(int i = 0 ;i < 5 ;i++)
    {
        printf("请输入第[%d]个字符串:",i+1);
        scanf("%s",str[i]);
    }
    printf("排序后:\n");
    for(int i = 0 ;i < 5 ;i++)
    {
        for(int j = 0;j<5-i-1 ;j++)
        {
            char *s1 = str[j];
            char *s2 = str[j+1];
            value = myStrcmp(s1,s2);
            if(value == 0)
            {
                continue;
            }
            else if(value > 0)
            {
                char temp[30];
                strcpy(temp , str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1], temp);
            }
        }
    }
    for (int i = 0;  i < 5; i++)
    {
        printf("%s\n", str[i]);
    }
}



main方法里面:

//    char str1[20] = {'\0'};
//    char str2[20] = {'\0'};
//    printf("请输入一个字符串:");
//    scanf("%s",str1);
//    getchar();
//    printf("请再输入一个字符串:");
//    scanf("%s",str2);
//    getchar();
//
//    myStrCpy(str1, str2);
    
    
   // 2
    //superMarketShop();
    // 3
//    char str1[] = "aba";
//    char str2[] = "abcfgd";
//    myStrcmp(str1 , str2);
    // 4
    strSort();
    // 5
//    int num1 = 10;
//    int num2 = 5;
//    int num3 = 15;
//    sort3(&num1, &num2, &num3);
//    printf("%d %d %d",num1,num2,num3);
    // 6
//    int nArr[20]={'\0'};
//    int *p = nArr;
//    int i = 0;
//    printf("请输入一些数字(0为结束):\n");
//    for(;i < 20;i++)
//    {
//        scanf("%d",&*(p+i) );
//        if(*(p+i) == 0)
//        {
//            break;
//        }
//    }
//    getsSort(p,i);
    // 7
//   
//    char s1[20]={'\0'};
//    char s2[20]= {'\0'};
//    int len = 0;
//    
//    printf("请输入一段字符串:");
//    scanf("%s",s1);
//    printf("请输入要剪切的位数:");
//    scanf("%d",&len);
//    printf("请再输入一个字符串:");
//    scanf("%s",s2);
//    char *p = strCopy( s1, &len , s2);
//    printf("\n%s",p);
//    free(p);
    // 8
    //twoSort();



编写一个C程序,输入三个数字,然后按照从小到大输出,要求使用指针实现

void sort3(int *v1, int *v2 ,int *v3)
{
    printf("%d %d %d\n",*v1,*v2,*v3);
    if(*v1 > *v2)
    {
        *v1 = *v1+ *v2 - (*v2 = *v1);
    }
    if(*v1 > *v3)
    {
        *v1 = *v1 + *v3 - (*v3 = *v1);
    }
    if(*v2 > *v3)
    {
        *v2 = *v2 + *v3 - (*v3 = *v2);
    }
}

编写一个C程序,输入一些数字,然后按照从大到小的方式输出,要求使用指针实现


void getsSort(int *p,int size)
{
    printf("排序后为:\n");
    for ( int i = 0 ; i<size; i++)
    {
        for (int j = i+1; j<size; j++)
        {
            if( *(p+i)>*(p+j) )
            {
                *(p+i) = *(p+i) + *(p+j) - (*(p+j) = *(p+i)) ;
            }
        }
        printf("%d ",*(p+i) );
    }
}

编写一个C函数,有三个参数,第一个参数输入一个字符串,第二个参数是一个长度值,第三个参数仍然是一个字符串,函数功能为从第一个字符串中复制第二个参数长度个字符到第三个参数的字符串中。然后编写main函数进行调用和输出。

char* strCopy(char *getStr ,int *len , char *setStr)
{
    char *p = (char *)malloc(20 * sizeof(char) );
    for( int i = 0 ; i<*len ;i++)
    {
        *(setStr+i) = *(getStr+i);
        *(p+i) = *(setStr+i);
    }
    int j = *len;
    while ( (*(p+j) = *(setStr+j)) != '\0' )
    {
        j++;
    }
    return p;
}

编写一个C程序,给定一个二维数组,然后赋给一些数值。然后从这些数据中找到最大值和最小值,要求使用指针来实现。

void twoSort()
{
    int nArr[3][3] = {{2,5,6},{84,48,56},{16,24,6}};
    int max = *(*(nArr));
    int min = *(*(nArr));
    //printf("%d",max);
    for(int i = 0 ; i<3 ;i++)
    {
        for (int j = 0 ; j<3; j++)
        {
            if(max < *(*(nArr+i)+j) )
            {
                max = *(*(nArr+i)+j) + max - ( *(*(nArr+i)+j)  = max  );
            }
            if(min > *(*(nArr+i)+j))
            {
                min = *(*(nArr+i)+j) +min - (  *(*(nArr+i)+j) = min );
            }
        }
    }
    printf("max:%d min:%d\n",max,min);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值