提示

  • 以下为C上机实验解析,一般提供了多种解题思路,希望大家不要盲目复制粘贴,过于简单的题还是就只给出一种。
  • 题目解析一般都在代码注释里,可能手机体验不会很好。
  • 虽然我已经尽力了,但是难免还是会有代码不精简的问题,所以以下的代码仅用于思路参考。
  • 毕竟要期末考试的嘛,了解基本的解题思路是必要的。
  • 以上给我班里那几个不会写代码题的憨憨,也让自己复习一下2个月没看的C。

项目地址

Music!

C基本知识复习视频

点击下载(共1.03G)

  1. C语言基本语句(上)
  2. C语言基本语句(下)
  3. 选择语句
  4. 循环语句
  5. 数组
  6. 函数
  7. 指针(上)
  8. 指针(下)
  9. 结构体

上机实验八:简单的函数调用

1. 利用函数求整数n的阶乘和

  1. 利用函数求整数n的阶乘和(如n=3,阶乘和=3!+2!+1!)。注:在主函数中调用阶乘和函数。
  • 注意:题目中要求调用阶乘和函数。

①解题思路1-直接在函数里面计算阶乘和

//解题思路1-直接在函数里面计算阶乘和
//n的阶乘和 = 1!+……+n!
//计算原理: n! = (n-1)! * n

#include <stdio.h>
long facs(int n)//定义阶乘和函数 facs()
{
    long i ;
    long ret = 1;
    long sum = 0;//定义输出的阶乘和 sum
    for (i = 1; i <= n; i++)//定义一个从1到n的循环
    {
        ret = ret * i;//计算阶乘 n! = (n-1)! * n
        sum = sum + ret;//累加计算好的阶乘
    }
    return sum;//返回计算好的阶乘和 sum
}

int main()//下面简单的输出阶乘和sum就可以了
{
    int n;
    printf("请输入整数n:\n");
    scanf("%d", &n);
    printf("阶乘和=%d\n", facs(n));
    return 0;
}

②解题思路2-通过递归计算阶乘和

//解题思路2-通过递归计算阶乘和
//这里用了两个函数,一个阶乘函数,一个阶乘和函数

#include <stdio.h>
long fac(int n)//通过递归计算的阶乘函数 
{
    if (n >= 1)//如果输入的 n 正确,则计算 n的阶乘
    {
        return n * fac(n - 1);
    }
    else//输入错误,则不计算/计算到0时返回
    {
        return 1;
    }
}

long facs(int x)//基于上面阶乘函数得出的阶乘和函数
{
    int sum = 0;
    int i;
    for (i = 1; i <= x; i++)//定义一个从1到n的循环
    {
        sum = sum + fac(i);//累加计算好的阶乘
    }
    return sum;//返回计算好的阶乘和 sum
}

int main()//同样在下面简单的输出阶乘和sum就可以了
{
    int n;
    printf("请输入整数n:\n");
    scanf("%d", &n);
    printf("阶乘和=%d\n", facs(n));
    return 0;
}

√标准答案-无解析

  • 很明显,题目改过了,对比答案,细节少了很多
#include <stdio.h>
double fun(int n)
{
    int i;
    double k = 1, sum = 0;
    for (i = 1; i <= n; i++)
    {
        k = k * i;
        sum = sum + k;
    }
    return sum;
}
int main()
{
    double jche;
    int num;
    printf("请输入一个整数num:\n");
    scanf_s("%d", &num);
    jche = fun(num);
    printf("阶乘的和为:%.2f\n", jche);
    return 0;
}

2.编写函数求表达式:s=x…x-……-xx-x

  1. 编写函数求表达式:s=xx…xx-……-xxx-xx-x(此处xx…xx表示n个x,x和n的值在1~9之间)。例如x=6,n=5,则上面表达式为:s=66666-6666-666-66-6
  • (1) 确定函数类型,因为s的值可能超出整型的取值范围,所以要定义为长整型,因函数类型跟返回值类型要一致。所以fun函数定义为long类型。
  • (2) 确定函数参数,因求结果需要两个值x和n,所以有两个形参。
  • (3) 找出表达式规律,将表达式变为s=66666-(6666+666+66+6),先求和,最后做减法。
  • (4) 主函数中输入数据,调用子函数求结果。

①解题思路1-在函数中通过循环来计算

//解题思路1-在函数中通过循环来计算
//x…xx = x…x * 10 + x

#include<stdio.h>

long fun(int x, int n)//按题目要求定义 函数fun() 为 long型、有两个形参 x 和 n
{
    long int s = 0;//按题目要求定义 s 为 长整型(long int型)
    long int y = 0;//中间变量
    long int z[9] = { 0 };//储存 x ~ x…x ;并初始化z[0]为 0
    int i;

    for (i = 1; i <= n; i++)//依次计算出 x ~ x…x 
    {
        z[i] = z[i - 1] * 10 + x;
    }
    for (i = 1 ; i < n; i++)//按题意,先求和;并且计算出最大的 x…x 赋值给 s
    {
        y = y + z[i];

    }
    s = z[n] - y;//按题意,最后做减法
    return s;
}

int main()//简单的输入输出x、n、s
{
    int x, n;
    printf("请输入x的值和x的个数n,x和n的值在1~9之间,用空格隔开:\n");
    scanf_s("%d %d", &x, &n);
    printf("s=%ld\n", fun(x, n));//长整型(long int型)s 输出
    return 0;
}

√标准答案-无解析

  • 原答案还打了中文的,XD
#include <stdio.h>
int main()
{
    long fun(int x, int n);                                  /*函数声明*/
    int x, n;
    long s;
    printf("请输入x和n的值:\n");
    scanf_s("%d%d", &x, &n);
    s = fun(x, n);                                       /*调用函数*/
    printf("表达式的值为:%ld\n", s);
    return 0;
}
long fun(int x, int n)                                  /*函数定义*/
{
    int j;
    long s = 0, t = x;
    for (j = 1; j < n; j++)
    {
        s = t + s;
        t = t * 10 + x;
    }
    s = t - s;
    return(s);
}

上机实验九:复杂的函数调用

1.判断素数

  1. 在主函数中输入一个整数,调用判别函数判别一个数是否为素数,并输出是否为素数的信息。
  • 素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数

①解题思路1-函数内判断

//解题思路1-直接在函数内判断
//素数,指在大于1的自然数中,除了1和该数自身外,
//无法被其他自然数整除的数

#include<stdio.h>
int jud(int x)//判断素数函数
{
    int i;
    for (i = 2; i <= x; i++)//从2开始到x,判断是否可以被整除
    {
        if (x % i == 0 && i != x)//可以被整除
        {
            printf("%d不是素数\n", x);
            break;//跳出循环,输出
        }
    }
    if (x == i - 1)//未发现x可以被整除
    {
            printf("%d是素数\n", x);
    }
}

int main()//简简单单主函数
{
    int n;
    printf("请输入一个整数:\n");
    scanf("%d", &n);
    jud(n);
    return 0;
}

√标准答案-无解析

  • 答案里的算法明显比我的简便一点,其实这个是数学题,大家可以去看看素数的算法

#include <stdio.h>
#include <math.h>
int prime(int n)                  //素数判断函数
{
    int i, m;
    m = sqrt(n);
    for (i = 2; i <= m; i++)              //for(i=2;i<n;i++)亦可(素数定义)
        if (n % i == 0)
            return 0;
    return 1;                     //不是素数返回0,是素数返回1
}
int main()
{
    int m;
    scanf("%d", &m);
    if (prime(m))                  //调用判断素数函数
        printf("%d is a prime.", m);
    else
        printf("%d is not a prime.", m);
    return 0;
}

2.倒序输出

  1. 编写函数实现将一个正整数以相反的顺序输出,如输入123,则输出321。

①解题思路1-运用递归进行倒序输出

//解题思路1-运用递归进行倒序输出
//对于一个大于10 的数,在逻辑上可以将它分为两部分
//:个位上的数和个位以前的数全部数字
//步骤1:输出个位上的数字
//步骤2:逆序输出个位以前的全部数字

#include <stdio.h>
int rev(int m)//定义反向函数
{
    printf("%d", m % 10);//输出个位数字
    if ((m / 10) != 0)//如果剩余数字不为0则继续输出剩余的数
    {
        rev(m / 10);
    }
    return 0;
}

int main()//简简单单主函数
{
    int n;
    printf("请输入一个正整数:\n");
    scanf("%d", &n);
    rev(n);//依次倒序输出
    printf("\n");
    return 0;
}

②解题思路2-直接进行倒序输出

//解题思路2-直接进行倒序输出
//对于一个大于10 的数,在逻辑上可以将它分为两部分
//:个位上的数和个位以前的数全部数字
//步骤1:输出个位上的数字
//步骤2:逆序输出个位以前的全部数字

#include<stdio.h>
long int rev(long int n)
{
    long int x = 0;//用于记录首位数
    while (n / 10 > 0)//一个无限循环,除非 n 为 0
    {
        printf("%d", n % 10);//输出个位数字
        n = n / 10;//整除10,直接抹去个位
        x = n;//最后用于储存首位数
    }
    printf("%ld\n",x);//输出首位数
    return 0;
}

int main()//普普通通主函数
{
    long int n;
    printf("请输入一个正整数:\n");
    scanf("%ld", &n);
    rev(n);
    return 0;
}

√标准答案-无解析

#include <stdio.h>
void printn(int n)
{
    if((n>=0)&&(n<=9))          //若为个位数,直接输出
        printf("%d",n);
    else
    {
        printf("%d",n%10);         //若不为个位数,输出改数的末位
        printn(n/10);              //递归调用
    }
}
int main()
{
    int m;
    printf("Please input m:");                //可省略
    scanf("%d",&m);
    printf("\nReverse output m:");             //可省略
    printn(m);
    return 0;
}

上机实验十:简单的指针应用

奇数加1、偶数减1

  1. 从键盘输入10个正整数放入数组,使用指针方式访问数组元素并实现数组元素值奇数加1、偶数减1的操作,最后输出数组的所有元素。

①解题思路1-循环/判断+按题意用指针

//解题思路1-循环/判断+按题意用指针
//输入+判断+操作
//(顺序任意,只要可行)(判断方式有很多)

/*指针方式访问数组元素方式一
int a[10] = {1};
int* p;//先声明指针变量
p = &a[0];//然后将指针赋予地址
*/
/*指针方式访问数组元素方式二
int a[10]={1};
int *p;//先声明指针变量
p=a;//然后将指针赋予首元素地址
*/
/*指针方式访问数组元素方式三(最精简)
int a[10]={1};
int *p=a;//一步代替两步,声明并赋值地址
*/
#include<stdio.h>

int main()
{
    int * a;
    int b[10];
    int i;
    a = &b[0];//指针方式访问数组元素
    for (i = 0; i < 10; i++)
    {
        scanf("%d", a + i);
    }
    for (i = 0; i < 10; i++)
    {
        if (*(a + i) % 2 == 0)
        {
            *(a + i) -= 1;
        }
        else 
        {
            *(a + i) += 1;
        }
        printf("%d ", *(a + i));
    }
    return 0;
}

√标准答案-无解析

#include <stdio.h>
int main()
{
    int a[10],*p;  // 定义数组和指针变量
    printf("请输入10个正整数:\n");
    for (p=a;p<a+10;p++)
        scanf("%d",p);
    for (p=a;p<a+10;p++)
    {
        if(*p%2==0)
            (*p)--;
        else
            (*p)++;
    }
    printf("经过处理后的数组为:\n");
    for (p=a;p<a+10;p++)
        printf("%d\t",*p);
    return 0;
}

由小到大顺序输出

  1. 输入3个整数,通过定义交换函数和定义指针变量的方式实现由小到大的顺序输出。

①解题思路1-冒泡排序/选择排序

//解题思路1-冒泡排序/选择排序
//改变指针指向/改变指针指向的值
//随便选(冒泡排序/选择排序)

#include<stdio.h>

int sw(int* a, int* b, int* c)//定义交换函数
{
    int i = 0;
    if (*b > *c)
    {
        i = *b;
        *b = *c;
        *c = i;
    }
    if (*a > *c)
    {
        i = *a;
        *a = *c;
        *c = i;
    }
    if (*a > *b)
    {
        i = *a;
        *a = *b;
        *b = i;
    }
}

int main()
{
    int* a, * b, * c;
    int x, y, z;
    a = &x;
    b = &y;
    c = &z;
    scanf("%d %d %d", &x, &y, &z);
    sw(a, b, c);
    printf("%d %d %d\n", x, y, z);
    return 0;
}

√标准答案-无解析

#include <stdio.h>
int main()
{
    void swap(int *p1,int *p2);                // 声明自定义函数swap
    int n1, n2, n3;
    int *p1, *p2, *p3;                        // 定义3个指向整型变量的指针变量
    printf("请输入3个整数n1,n2,n3:\n");
    scanf("%d%d%d",&n1,&n2,&n3);
    p1=&n1;                              // p1指向n1
    p2=&n2;                              // p2指向n2
    p3=&n3;                              // p3指向n3
    if (n1>n2)
        swap(p1,p2);
    if (n1>n3)
        swap(p1,p3);
    if (n2>n3)
        swap(p2,p3);
    printf("由小到大分别为%d,%d,%d\n",n1,n2,n3);
    return 0;
}
void swap(int *p1,int *p2)  // 定义swap函数,形参为两个整型指针变量
{
    int temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}

此帖完结φ(゜▽゜*)♪


shall I compare thee to a summers day?