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

本文深入探讨了C语言中的逻辑运算符优先级、数组操作、回文数验证、数的倒转与和运算、日期计算及金额分解等核心概念与实践案例。
C语言中使用0作为假,非0即为真
&& 与 同真为真 同假为假 其中有一个为假  即为假
||  或 同真为真 同假为假 有真即真
!   非 非真即假 反之亦然
运算符优先级                              综合性
()                             从左到右
算数,单目运算符-,++,-- ,!       从右到左
算术,单目运算符*,/,%              从左到右
算数,双目运算符 + - */ %         从左到右
关系运算符 < <= > >=             从左到右
关系运算符 ==  !=                    从左到右
逻辑运算符 &&  ||                 从左到右

赋值运算符  +=  -= *= /= =      从右到左

逻辑运算符都在什么情况下会发生短路?

在逻辑与运算中如果前半部分为0的情况下,将不在去计算右边的情况.这就会发生短路.

例: int a=0 ; b = 6;

int c = (a++ && b++)

输出的结果为:a ==1  b ==6;

 对一个行列都为N的数组进行行列交换

void array_change()
{
    int n = 0;
    printf("请输入要生成几行的2维数组:");
    scanf("%d",&n);
    int b[n][n];
    if(n>=3)
    {
        int nArray[n][n];
        printf("生成的【%d】行【%d】列数组行列交换前:\n",n,n);
        printf("列行");
        for (int i =0 ; i<n; i++) {
            printf("%5d",i+1);
        }
        printf("\n");
        for (int i = 0 ; i<n; i++)
        {
            printf("%-7d",i+1);
            for (int j = 0; j<n; j++)
            {
                scanf("%5d",&nArray[i][j]);
                //printf("%d ",nArray[i][j]);
            }
            //printf("\n");
        }
        printf("转换后:\n");
        for (int i = 0 ; i<n; i++)
        {
            for (int j = 0; j<n; j++)
            {
//                int temp = 0;
//                temp = nArray[i][j];
//                nArray[i][j] = nArray[j][i];
//                nArray[j][i] = temp;
                b[i][j] = nArray[j][i];
                printf("%5d",b[i][j]);
            }
            printf("\n");
        }

    }
    else
    {
        printf("输入的行数必须大于3\n");
        array_change();
    }
}


如果有一个正整数从左、右来读都是一样的,则称为回文式数(简称回数);

 比如101,32123,
 999都是回数。数学中有名的“回数猜想”之迷,至今未解决。
 回数猜想: 任取一个数,再把它倒过来,并把这两个数相加,然后把这个和数再倒过来,与原和数相加,重复此过程,一定能获得一个回数。 例:
 68倒过来是86
 68+86= 154
 154+541= 605
 605+506=1111 (回数)
 编程,输入任意整数,按上述方法产生一个回数,为简便起见,最多计算7步,看是否能得到一个回数。
 要求:
 主函数中接收键盘数据,必须用scanf(“%ld”,&变量名)接收整型变量,
 显示该数与其倒数的和,输出每一步计算步骤。
 子函数1,计算该数的倒数。
 子函数2,验证和是否为回数,

 是则主函数打印“经过n次计算,得到回数”,超过7次未能得到回数,显示,“经过n次计算,未得到回数”

这个程序写了好久,可是最后还是有问题...

int recCount(int num)
{
    int count = 1;
    while (num>=10) {
        num = num/10;
        count++;
    }
    return count;
}
int recNum(int num)
{
    int n = 0;
    int count = recCount(num);
    while (num>=10)
    {
        int ram = num%10;
        num = num/10;
        int temp = 0;
            temp = pow(10, (count-1));
        count--;
        n = n+ram*temp;
    }
    n = n+num;
    return n;
}
int recSum(int num1,int num2)
{
    return num1 + num2 ;
}
int Judeg(int num)
{
    int num_len = recCount(num);
    int nm = num;
    char _num[100] ;
    char right_num[50];
    char left_num[50];
    int i = 0;
    int flog = 1;
    int ram =0;
        while (num>=10)
        {
            ram = num%10;
            num = num /10 ;
            _num[i] = ram;
            i++;
        }
    _num[num_len-1] = num;
    if(num_len%2==0)
    {
        int i = 0;
        for ( ; i<num_len/2; i++)
        {
            left_num[i] = _num[i];
            //printf("left_num[%d]:%d\n",i,left_num[i]);
        }
        i=0;
        for (int j=num_len-1; j>=num_len/2; j--)
        {
            right_num[i] = _num[j];
            //printf("right_num[%d]:%d\n",i,right_num[i]);
            i++;
        }
    }
    else
    {
        int i = 0;
        for (; i<(num_len-1)/2; i++)
        {
            left_num[i] = _num[i];
            //printf("left_num[%d]:%d\n",i,left_num[i]);
        }
        i= 0 ;
        for (int j=num_len-1; j>=(num_len+1)/2; j--)
        {
            right_num[i] = _num[j];
            //printf("right_num[%d]:%d\n",i,right_num[i]);
            i++;
        }
    }
    flog = strcmp(left_num,right_num);
    //printf("%d\n",flog);
    if (flog==0) {
        printf("\n%d是回文串\n",nm);
    }
    else{
        printf("%d不是回文串\n",nm);
   }
    int k = 0 ;
    while(_num[k++]!= '\0')
    {
        _num[k-1] = '\0';
    }
    k=0;
    while (left_num[k++]!='\0') {
        left_num[k-1] = '\0';
    }
    k = 0 ;
    while (right_num[k++]!='\0') {
        right_num[k-1] = '\0';
    }
    printf("--%s",right_num);
    return flog;
}
int main(int argc, const char * argv[])
{
    int number = 0;
    int count = 0;
    printf("请输入一个正整数:");
    scanf("%d",&number);
    int recnum =  recNum(number);   //number 的倒数
    int numsum = recSum(number, recnum);  // number 和倒数的和
    int flog = 1;
    printf("%d 的倒数为: %d\n",number,recnum);
    printf("两数之间的和为:%d + %d = %d\n",number,recnum,numsum);
    while (flog != 0) {
        flog = Judeg(numsum);
        number = numsum;
        recnum = recNum(number);
        numsum = recSum(recnum,numsum);
        // 判断是否是回数
        printf("%d 的倒数为: %d\n",number,recnum);
        printf("两数之间的和为:%d + %d = %d\n",number,recnum,numsum);
        count++;
        printf("%d\n",flog);
    }
    if(flog == 0)
        {
        count++;
        printf("%d是回数!\n",numsum);
        printf("经过%d次计算,得到回数.",count);
        }


    return 0;
}

输入某年某月某日,判断这一天是这一年的第几天。

提示:需要考虑闰年的情况,闰年的算法:能被400整除的是闰年,能被4整除并且不能被100整除的是闰年。

int getRun(int year)
{
    int y = 0;
    if((year%4==0 && year%100!=0) || year%400==0  )
    {
        y = 1;
    }
    else
    {
        y = 0;
    }
    return y;
}
void getDate()
{
    int getRun();
    int year = 0;
    int month = 0;
    int day = 0;
    int sum_Day = 0;
    int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    printf("please inpue Year Month Day:");
    scanf("%d%d%d",&year,&month,&day);
    int y = getRun(year);
    if(y==1)
    {
        printf("%d是闰年!\n",year);
        month_day[1] =29;
        for (int i = 0 ; i<month; i++)
        {
            sum_Day += month_day[i];
        }
    }
    else
    {
        printf("%d是平年!\n",year);
        for (int i = 0 ; i<month; i++)
        {
            sum_Day += month_day[i];
        }
    }
    printf("%d月%d日是%d的第%d天.\n",month,day,year,sum_Day);
}

编写一个C程序,输入一个金额(整数金额),然后打印该金额中可以包括多少张100元,50元,20元,10元,5元,1元。

void money()
{
    int money = 0;
    printf("input to money:");
    scanf("%d",&money);
    int m_100 = money/100;
    money -= (100*m_100);
    
    int m_50  = money / 50;
    
    money -= (50*m_50);
    
    int m_20  = money / 20;
    money -= (20 * m_20);
    int m_10 = (money) /10 ;
    money -= (10 * m_10);
    int m_5 = (money ) /5 ;
    money -= (5 * m_5);
    int m_1 = (money) /1 ;
    printf("100 :%d \n 50 :%d \n 20:%d \n10:%d \n5:%d \n1:%d \n",m_100,m_50,m_20,m_10,m_5,m_1);
}


输入一段字符串,再输入一个删除字符串位数的数。然后从输入的字符串中删除指定位数的字符串.

void put_s()
{
    char str[41];
    char *p = str;
    int local_index = 0;
    int len = 0;
    printf("请输入一段字符串:");
    gets(p);
    printf("请输入要删除字符串的位数:");
    scanf("%d",&local_index);
    char str_index[local_index];
    len = (int)strlen(p);
    printf("源字符串为:%s\n",p);
    printf("指定位置之后的字符串为:");
    for (int i = 0 ; i<local_index; i++)
    {
        printf("%c",*(p+i));
        str_index[i] = *(p+i);
    }
    printf("\n删除指定位置字符串的后字符串为:");
    for (int i =local_index ; i<len; i++) {
        printf("%c",*(p+i));
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值