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;
}
运行结果:
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;
}
运行结果:
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;
}
运行结果:
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");
}
运行结果
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;
}
运行结果:
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");
}
运行结果:
7. 设有一长度为10 的整形数组{33,68,33,11,77,33,66,33,99},编程完成下列题目
-
编写函数,计算并输出各元素之和。
-
编写函数,输出最大元素及其位置。
-
编写函数,在第4个位置插入元素98,然后输出数组。
-
编写函数,删除第5个元素,然后输出数组。
-
编写函数,删除最小的元素,然后输出数组。。
-
编写函数,删除所有值为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]);
}
}
运行结果:
8. 设数组a={11,33,44,68,77},数组b={22,33,77,88,99},编程完成下列题目。
- 编写函数,求a和b的并集,返回并集中元素的个数。
- 编写函数,求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]);
}
}
运行结果
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;
}
运行结果:
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;
}
运行结果:
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律