c语言实习报告

1. 利用公式π/4=1-1/3+1/5-1/7+……求π的近似值,直到最后一项的绝对值小于10-6为止。

#include <stdio.h>
#include "math.h"

int main() {
    float s = 0, x = 1.0, PI;
    int i = 1;
    for (; fabs(1 / x) >= 1e-6; x += 2,i++)
        s += pow(-1, i+1) * (1 / x);
    PI = 4 * s;
    printf("PI=%f", PI);
    return 0;
}

运行结果:
image

2. 输出三角形的九九乘法口诀表

#include <stdio.h>

int main() {
    int i,j;
    for (i=1;i<10;i++){
    for (j=1;j<10;j++)
        if(i>=j) printf("%dx%d=%2d ",j,i,j*i);
        putchar('\n');
    }
    return 0;
}

运行结果:
image

3. 键盘输入整数n(3<=n<=10),编写函数输出n阶螺旋矩阵。

#include<stdio.h>
#include<math.h>
#define max 21
int a[max][max],i,j,c=1,count=1;
void Fun(int n,int N,int b)
{
    if(c<=c+n-1&&c<=N)//对框架上侧边的输出
        {
        for(j=count;j<=n;j++)
        {
            a[count][j]=c;
            c++;
        }
        }
    if(c<=c+n-2&&c<=N)//对框架右侧边的输出
        {
        for(i=count+1;i<=n-1;i++)
        {
            a[i][n]=c;
            c++;
        }
        }
    if(c<=c+n-2&&c<=N)//对框架下侧边的输出
        {
        for(j=n;j>=count;j--)
        {
            a[n][j]=c;
            c++;
        }
        }
    if(c<=c+n-3&&c<=N)//对框架左侧边的输出
        {
        for(i=n-1;i>=count+1;i--)
        {
            a[i][count]=c;
            c++;
        }
        }
    count++;//让框架缩小为里边一层
    if(c<=N) Fun(n-1,N,b);
    //输出矩阵
    else
    {
        for(i=1;i<=sqrt(N);i++)
        {
            for(j=1;j<=sqrt(N);j++)
                if(b>0)
                    printf("%3d    ",a[i][j]);//右旋的螺旋矩阵
                    else
                        printf("%3d    ",a[j][i]);//左旋的螺旋矩阵(以右旋的螺旋矩阵为基础,将行与列交换即可)
                        printf("\n");
        }
    }
}

int main()
{
    int n,N,b;//N代表矩阵中的最大值
    printf("请输入一个n值:");
    while(~scanf("%d",&n))
    {
        c=1;count=1;
        N=n*n;
        b=n;
        if(n<0) n=-n;
        if(n==0) break;
        else
            Fun(n,N,b);
        printf("请输入一个n值,若结束请输入0:");
    }
    return 0;
}

运行结果:
image

4. 编写递归函数,输出斐波那契数列的前30项。斐波那契数列递推函数如下所示。

#include<stdlib.h>
#include<stdio.h>

#define Length 30
//输出这个数字的斐波那契数列的前30项
//规律为:从第三项开始,每一项都是前两项之和
void main(void)
{
    int Nums[Length] = { 0 },i;
    for (i = 0; i < Length; i++)
    {
        if(i<2)
        {
            Nums[i] = 1;
        }
        else
        {
            Nums[i] = Nums[i-1] + Nums[i-2];
        }
        printf(" %d \r\n",Nums[i]);
    }
    system("pause");
}

运行结果
image

5. 编写递归函数,求解汉诺塔问题。假设输入盘子数为3,则输出如下,其中A、B、C为柱子编号。

#include<Windows.h>
#include<stdio.h>
#pragma warning(disable:4996)
void hanio(int n, char a, char b, char c)
{
    if (n == 1)
    {
        printf("把第%d个盘子从%c--->%c\n",n, a, c);
    }
    else
    {
        hanio(n - 1, a, c, b);
        printf("把第%d个盘子从%c--->%c\n",n, a, c);
        hanio(n - 1, b, a, c);

    }
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    char a = 'A';
    char b = 'B';
    char c = 'C';
    hanio(n,'A','B','C');
    system("pause");
    return 0;
}

运行结果:
image

6. 编写一个函数print,打印学生的成绩数组,该数组中包含5个学生的数据记录,每个记录包括num、name、score[3](分别表示学号、姓名、三门课的成绩),用主函数输入这些记录,用print函数输出这些记录。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 5
struct student {
    int num;
    char name[1024];
    int score[3];
};
typedef struct student stu;
void print(stu* p) {
    printf("学号\t姓名\t成绩1\t成绩2\t成绩3\n");
    for (int i = 0; i < N; ++i) {
        printf("%d\t", (p + i)->num);
        printf("%s\t", (p + i)->name);
        for (int j = 0; j < 3; ++j) {
            printf("%d\t", (p + i)->score[j]);
        }
        printf("\n");
    }
}
void main() {
    stu arr[N];
    stu* p = arr;
    //输入
    for (int i = 0; i < N; ++i) {
        printf("请输入第%d个学生的信息\n", i + 1);
        printf("请输入num\n");
        scanf("%d", &(p + i)->num);
        printf("请输入姓名\n");
        scanf("%s", &(p + i)->name);
        for (int j = 0; j < 3; ++j) {
            printf("请输入score%d\n", j + 1);
            scanf("%d", &(p + i)->score[j]);
        }
    }
    //输出
    print(p);
    system("pause");
}

运行结果:
image
image

7. 设有一长度为10 的整形数组{33,68,33,11,77,33,66,33,99},编程完成下列题目

  1. 编写函数,计算并输出各元素之和。

  2. 编写函数,输出最大元素及其位置。

  3. 编写函数,在第4个位置插入元素98,然后输出数组。

  4. 编写函数,删除第5个元素,然后输出数组。

  5. 编写函数,删除最小的元素,然后输出数组。。

  6. 编写函数,删除所有值为33的元素,然后输出数组。

#include<stdio.h>

//编写函数,计算并输出各元素之和。
int addAll(int a[],int aSize){
    int sum=0;
    //int iMax=sizeof(a) / sizeof(a[0]);
    for (int i = 0; i < aSize; ++i) {
        sum+=a[i];
    }
    return sum;
}

//编写函数,输出最大元素及其位置。
int maxNum(int a[],int aSize){
    int maxI=0;
    for (int i = 1; i < aSize; ++i) {
        if(a[maxI]<a[i]) maxI=i;
    }
    return maxI;
}

//在第四位置插入一数字
int ord(int a[],int n,int i,int b)
{
    int c,m,l;
    c=a[i];
    a[i]=b;
    for(m=i+1;m<=n;m++)
    {
        l=a[m];
        a[m]=c;
        c=l;
    }
    return 0;
}

//编写函数,删除第5个元素,然后输出数组。
int jianjian(int a[],int aSize){
    for (int i = 4; i < (aSize-1); ++i) {
        a[i]=a[(i+1)];
    }
    return 0;
}

//编写函数,删除最小的元素,然后输出数组
int deleteMin(int a[],int aSize){
    int minI=0;
    for (int i = 0; i < aSize; ++i) {
        if(a[minI]>a[i]) minI=i;
    }
    for (int i = minI; i < (aSize-1); ++i) {
        a[i]=a[(i+1)];
    }
    return 0;
}

//编写函数,删除所有值为33的元素,然后输出数组。
int delete33(int a[],int aSize){
    for (int i = 0; i < aSize; ++i) {
        if(a[i]==33){
            for(int j = i; j<aSize; j++)//依次前移一位。
                a[j] = a[j+1];
            aSize--;//总长度减一。
        }
    }
    return aSize;
}

void main() {
    int a[]={33,68,33,11,77,33,66,33,99},*p;

    printf("%d\n",addAll(a,(sizeof(a) / sizeof(a[0]))));

    int maxI=maxNum(a,(sizeof(a) / sizeof(a[0])));
    printf("%d-->%d\n", maxI,a[maxI]);

    ord(a,10,4,98);
    for (int i = 0; i < 10; ++i) {
        printf("%d,",a[i]);
    }

    jianjian(a,(sizeof(a) / sizeof(a[0])));
    int maxsize=sizeof(a) / sizeof(a[0]);
    for (int i = 0; i < maxsize; ++i) {
        printf("%d,",a[i]);
    }

    maxsize=sizeof(a) / sizeof(a[0]);
    deleteMin(a,(sizeof(a) / sizeof(a[0])));
    for (int i = 0; i < maxsize; ++i) {
        printf("%d,",a[i]);
    }

    int aSizeDelete33=delete33(a,(sizeof(a) / sizeof(a[0])));
    for (int i = 0; i < aSizeDelete33; ++i) {
        printf("%d,",a[i]);
    }
}

运行结果:
image

8. 设数组a={11,33,44,68,77},数组b={22,33,77,88,99},编程完成下列题目。

  1. 编写函数,求a和b的并集,返回并集中元素的个数。
  2. 编写函数,求a和b的交集,返回交集中元素的个数。
	#include<stdio.h>

	//编写函数,求a和b的并集,返回并集中元素的个数。
	int Union(int a[],int b[],int tArray[],int aAndBSize){
		//int testArray[aAndBSize];
		int t=0;
		for (int i = 0; i < aAndBSize; i+=2) {
			tArray[i]=a[t];
			tArray[i+1]=b[t];
			t++;
		}
		return 0;
	}

	//排序
	void sort(int uArray[],int size){
		int t=0;
		for (int i = 0; i < size; ++i) {
			for (int j = i+1; j < size; ++j) {
				if(uArray[i]>uArray[j]){
					t=uArray[i];
					uArray[i]=uArray[j];
					uArray[j]=t;
				}
			}
		}
	}

	//编写函数,求a和b的交集,返回交集中元素的个数。
	void intersection(int a[],int b[],int uArray[],int iArray[],int aAndBSize){
		Union(a,b,uArray,aAndBSize);//计算并集
		sort(uArray,aAndBSize);//排序
		int iArrayI=0;
		for (int i = 0; i < (aAndBSize-1); ++i) {//将排序好的并集左右看是否有一样的有的话就是交集
			if(uArray[i]==uArray[i+1]){
				iArray[iArrayI]=uArray[i];
				iArrayI++;
			}
		}
	}

	void main() {
		int a[]={11,33,44,68,77};
		int b[]={22,33,77,88,99};
		int aAndBSize=(sizeof(a) / sizeof(a[0]))+(sizeof(b) / sizeof(b[0]));
		int uArray[aAndBSize];
		int iArray[5]={-1,-1,-1,-1,-1};

		Union(a,b,uArray,aAndBSize);
		for (int i = 0; i < aAndBSize; ++i) {
			printf("%d,",uArray[i]);
		}

		printf("\n");
		intersection(a,b,uArray,iArray,aAndBSize);
		int iArraySize=sizeof(iArray) / sizeof(iArray[0]);
		for (int i = 0; i < iArraySize; ++i) {
			if(iArray[i]==-1) break;
			printf("%d,",iArray[i]);
		}
	}

运行结果
image

9. 输入一个由数字和和非数字组成的字符串,例如“A123W45k9876??TAB5876”,编写函数,将其中连续的数字作为一个整数,一次存入到数组a中,例如123存入a[0],45存入a[1],9876存入a[2],5876存入a[3]……,统计共有多少个整数,并输出这些数。

#include <stdio.h>
#include <math.h>
#define N 100                                //N为字符串的长度
int main()
{
    int record(char *p,int q[]);             //声明record函数(记录连续数字,返回值为有效元素个数)
    int a[N],i,k;                            //a[N]为存放连续数字的数组
    char s[N];
    gets(s);
    k=record(s,a);                            //k为数组a中有效元素个数
    printf("共有%d个整数\n分别为:",k);
    for(i=0;i<k;i++) printf("%d ",a[i]);
    return 0;
}
int record(char *p,int q[])
{
    int number(int x[],int m,int n);         //声明number函数(返回值就是连续的数字的值)
    int i=0,j=0,l,f[N];                      //f[N]数组记录字符串中出现的数字
    while (*p!='\0')
    {
        l=i;                                 //l表示数组q的第j个元素的首位数字在数组f中的起始位置
        if (*p<'0'||*p>'9') {p++;continue;}
        else {while (*p>='0'&&*p<='9')
            {f[i]=*p-48;p++;i++;}          //用ASCII码值的关系给数组f赋值
            q[j]=number(f,i,l);            //调用number函数给数组q赋值
            j++;
        }
    }
    return j;
}
int number(int x[],int m,int n)
{
    int total=0,i;                           //total为连续的数字的值
    for(i=0;n<m;n++)
    {total=total+pow(10,i)*x[m-1-i];i++;}
    return total;
}

运行结果:
image

10. 编写程序,建立一个有5名学生数据的单向动态链表,每个数据记录包括num、name、score(分别表示学号、姓名、成绩),然后顺序输出这5条记录,最后输出成绩最高的学生的学号、姓名、成绩。

#include<stdio.h>
#include<stdlib.h>

typedef struct StudentLink{
    int num;//学号
    char name[1024];//姓名
    int score;//成绩
    struct StudentLink * next;//代表指针域,指向直接后继元素
}link;

link * initLink(){
    link * p=(link*)malloc(sizeof(link));//创建一个头结点
    link * temp=p;//声明一个指针指向头结点,用于遍历链表
    //生成链表
    for (int i=0; i<5; i++) {
        link *a=(link*)malloc(sizeof(link));
        printf("请输入第%d个学生的信息\n", i + 1);
        printf("请输入num\n");
        scanf("%d", &a->num);
        printf("请输入姓名\n");
        scanf("%s", &a->name);
        printf("请输入score\n");
        scanf("%d", &a->score);
        a->next=NULL;
        temp->next=a;
        temp=temp->next;
    }
    return p;
}

int main(){
    struct StudentLink *pt;
    pt = initLink()->next;//函数返回链表第1个结点的地址
    struct StudentLink *maxpt;
    maxpt=pt;
    while (1){
        printf("%d\t", pt->num);
        printf("%s\t", pt->name);
        printf("%d\t", pt->score);
        printf("\n");
        if(pt->score>maxpt->score){//求最大的成绩的指针
            maxpt=pt;
        }
        if(pt->next==NULL){
            printf("成绩最高的学生为:\n");
            printf("%d\t", maxpt->num);
            printf("%s\t", maxpt->name);
            printf("%d\t", maxpt->score);
            break;
        }
        pt=pt->next;
    }
    return 0;
}

运行结果:
image

posted @   RainbowMagic  阅读(167)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示