C语言经典题集合(三)

25.static定义静态变量的用法 (观察即可)

本题以看和了解为主
在定义变量的时候,在数据类型名之前添加static关键字,定义的变量就是静态变量。那么,可以包括“静态局部变量”和“静态全局变量”。

#include <stdio.h>
void varfunc()
{
    
    
    int var = 0;
    static int static_var = 0;
    printf("\40:var equal %d \n", var);
    printf("\40:static var equal %d \n", static_var);
    printf("\n");
    var++;
    static_var++;
}
void main()
{
    
    
    int i;
    for (i = 0; i < 3; i++)
        varfunc();

    return;
}

输出结果:在这里插入图片描述

26.学习使用auto定义变量的用法(观察即可)

auto函数:

#include <stdio.h>
int main()
{
    
    
    int i, num;
    num = 2;
    for (i = 0; i < 3; i++)
    {
    
    
        printf("\40: The num equal %d \n", num);
        num++;
        {
    
    
            auto  num = 1;
            printf("\40: The internal block num equal %d \n", num);
            num++;
        }
    }

    return 0;

}

运行结果在这里插入图片描述

27.小球下落问题

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?

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

int main()
{
    
    
    float high = 100;  //总高度
    float s, h;    //h代表当前高度,s代表总长度

    h = high * pow(0.5, 10); //0.5是这个里面的规律,一半,10代表十次
    s = 2 * (50 - h * 0.5 * 2) / (1 - 0.5) + 100;
    printf("第十次的高度为%f;总路程为%f", h, s);

    return 0;
}

28.找出1000以内所有完数

一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。

#include<stdio.h>//头文件 
int main()//主函数 
{
    
    
  int number,s,i;//定义变量 
  for(number=2;number<1000;number++)//for循环 
  {
    
    
    //直接从2开始
    s=0;
    for(i=1;i<number;i++)
    {
    
    
      //检查i是否是m的因子 
      if((number%i)==0)
      {
    
     
      //如果是的话 
        s=s+i;
      } 
      }
    if(s==number)
    {
    
    
      printf("%d的因子为:",number);
      for(i=1;i<number;i++)
      {
    
     
        if(number%i==0)
        {
    
     
          //判断是否是因子,是的话就输出 
          printf("%d ",i);
        }
      } 
        printf("\n");//换行 
      }
    }
  return 0;//主函数返回值为0 
}

29.猜数字

#include "time.h"
#include "stdlib.h"
#include "stdio.h"
main()
{
    
    char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf("do you want to play it.('y' or 'n') \n");
loop:
while((c=getchar())=='y')
{
    
    
i=rand()%100;
printf("\nplease input number you guess:\n");
start=clock();
a=time(NULL);
scanf("%d",&guess);
while(guess!=i)
{
    
    if(guess>i)
{
    
    printf("please input a little smaller.\n");
scanf("%d",&guess);}
else
{
    
    printf("please input a little bigger.\n");
scanf("%d",&guess);}
}
end=clock();
b=time(NULL);
printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2);
printf("\1: it took you %6.3f seconds\n\n",difftime(b,a));
if(var<15)
printf("\1\1 You are very clever! \1\1\n\n");
else if(var<25)
printf("\1\1 you are normal! \1\1\n\n");
else
printf("\1\1 you are stupid! \1\1\n\n");
printf("\1\1 Congradulations \1\1\n\n");
printf("The number you guess is %d",i);
}
printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
if((c=getch())=='y')
goto loop;
}

30.(第一个项目)通讯录设计

``坦白的说自己做的不太好(因为对于指针一类熟悉度不高),这里从网上引用了一个别人的,自己修改了一下。里面设计很多指针的应用,谢谢这位作者的代码。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct student     //定义结构体
{
    
    
    char name[20];    //姓名
    char num[15];      //学号
    char sex[10];     //性别
    char from[20];    //籍贯
    char political[10];    //政治面貌
    char phone[15];      //手机号
    char QQ[15];         //QQ号
    char dorm[10];     //宿舍
    struct student* next;  //结构体指针
}stu;
stu* head;

void print()    //主菜单
{
    
    
    system("cls");
    printf("\n\n\n");
    printf("      ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
    printf("      ***********************************************************\n");
    printf("      \t\t\t班级通讯录管理系统\n");
    printf("\n");
    printf("      \t\t1. 输入数据");
    printf("\t\t2. 显示数据\n");
    printf("      \t\t3. 插入数据");
    printf("\t\t4. 删除数据\n");
    printf("      \t\t5. 查看数据");
    printf("\t\t6. 修改数据\n");
    printf("      \t\t7. 保存数据");
    printf("\t\t8. 返回主菜单\n");
    printf("      ***********************************************************\n");
    printf("      ~~~~~退~~~~~~~~~~出~~~~~~~~~~请~~~~~~~~~~按~~~~~~~~~~9~~~~~\n");
    printf("      -----------------------------------------------------------\n\n");
}


void input(stu* p1)    //输入相关数据
{
    
    
    printf("姓名:");
    scanf("%s", &p1->name);
    printf("学号:");
    scanf("%s", &p1->num);
    printf("性别:");
    scanf("%s", &p1->sex);
    printf("籍贯:");
    scanf("%s", &p1->from);
    printf("政治面貌:");
    scanf("%s", &p1->political);
    printf("手机号:");
    scanf("%s", &p1->phone);
    printf("QQ号:");
    scanf("%s", &p1->QQ);
    printf("宿舍:");
    scanf("%s", &p1->dorm);
}


stu* inputdata()     //数据输入的函数
{
    
    
    stu* p1, * p2;
    int i = 1;
    p1 = (stu*)malloc(sizeof(stu));
    if (p1 != NULL)
    {
    
    
        head = p1;
        printf("\n\t\t\t☆☆☆输入数据☆☆☆\n");
        printf("------------------------------------------------------------------\n");
        printf("在姓名处输入“ok”代表输入数据结束\n");
        while (i)
        {
    
    
            printf("姓名:");
            scanf("%s", &p1->name);
            if (strcmp(p1->name, "ok") == 0)
            {
    
    
                printf("\n输入完毕!\n");
                printf("========================================================================\n");
                i = 0;
                p2->next = NULL;
                free(p1);
                p1 = p2;
            }
            else
            {
    
    
                printf("学号:");
                scanf("%s", &p1->num);
                printf("性别:");
                scanf("%s", &p1->sex);
                printf("籍贯:");
                scanf("%s", &p1->from);
                printf("政治面貌:");
                scanf("%s", &p1->political);
                printf("手机号:");
                scanf("%s", &p1->phone);
                printf("QQ号:");
                scanf("%s", &p1->QQ);
                printf("宿舍:");
                scanf("%s", &p1->dorm);
                printf("=====================================\n");
                p2 = p1;
                p1 = (stu*)malloc(sizeof(stu));
                if (p1 != NULL)
                {
    
    
                    p2->next = p1;
                }
            }
        }
        return(p1->next);
    }
}


stu* lookdata(stu* p1)     //查看数据的函数
{
    
    
    printf("\n\t\t\t☆☆☆显示数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    while (p1 != NULL)
    {
    
    
        printf("姓名:%s\n", p1->name);
        printf("学号:%s\t", p1->num);
        printf("性别:%s\t", p1->sex);
        printf("籍贯:%s\t", p1->from);
        printf("政治面貌:%s\t", p1->political);
        printf("手机号:%s\t", p1->phone);
        printf("QQ号:%s\t", p1->QQ);
        printf("宿舍:%s\n", p1->dorm);
        printf("======================================================================\n");
        p1 = p1->next;
    }
    return p1;
}


void insert()      //插入数据
{
    
    
    int i;
    char named[20];
    stu* p1, * p2, * p3;
    p1 = head;
    p3 = (stu*)malloc(sizeof(stu));
    p3->next = NULL;
    printf("\n\t\t\t☆☆☆插入数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入插入者的资料:\n");
    input(p3);
    printf("\n插入选项\n");
    printf("1.首位置插入\t2.尾位置插入\t3.前插\n");
    printf("请输入你的选择:");
    scanf("%d", &i);
    switch (i)
    {
    
    
    case 1:p3->next = p1;
        head = p3;
        break;
    case 2:while (p1->next != NULL)
    {
    
    
        p2 = p1;
        p1 = p1->next;
    }
          p1->next = p3;
          break;
    case 3:printf("请输入姓名(前插):");
        scanf("%s", named);
        while (strcmp(named, p1->name) != 0)
        {
    
    
            p2 = p1;
            p1 = p1->next;
        }
        p2->next = p3;
        p3->next = p1;
        break;
    }
    printf("插入成功!\n");
    printf("======================================================================\n");
    return;
}

void deleted()          //删除数据
{
    
    
    stu* p1, * p2;
    char Name[20];  //想要删除的人的姓名
    printf("\n\t\t\t☆☆☆删除数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入要删除的姓名:");
    scanf("%s", Name);
    p1 = head;
    if (head == NULL)
    {
    
    
        printf("内存空空神马都没有!\n");
        printf("======================================================================\n");
        return;
    }
    if (strcmp(Name, p1->name) == 0)
    {
    
    
        head = p1->next;
        printf("删除成功!\n");
        printf("======================================================================\n");
        return;
    }
    while (p1 != NULL && (strcmp(Name, p1->name) != 0))
    {
    
    
        p2 = p1;
        p1 = p1->next;
    }
    if (p1 == NULL)
    {
    
    
        printf("此人不存在!\n");
        printf("======================================================================\n");
        return;
    }
    if (p1->next != NULL)
    {
    
    
        p1 = p1->next;
        p2->next = p1;
        printf("删除成功!\n");
        printf("======================================================================\n");
        return;
    }
    else
    {
    
    
        p2->next = NULL;
        printf("删除成功!\n");
        printf("======================================================================\n");
        return;
    }
}


void find(stu* p2)        //通过姓名查找查看数据的函数
{
    
    
    char name[20];
    int b = 0;
    printf("\n\t\t\t☆☆☆查看数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入您想查找人的姓名:");
    scanf("%s", name);
    while (p2 != NULL)
    {
    
    
        if (strcmp(name, p2->name) == 0)
        {
    
    
            printf("你要找到的数据\n");
            printf("姓名:%s\n", p2->name);
            printf("学号:%s\t", p2->num);
            printf("性别:%s\t", p2->sex);
            printf("籍贯:%s\t", p2->from);
            printf("政治面貌:%s\t", p2->political);
            printf("手机号:%s\t", p2->phone);
            printf("QQ号:%s\t", p2->QQ);
            printf("宿舍:%s\n", p2->dorm);
            printf("======================================================================\n");
            b = 1;
        }
        p2 = p2->next;
    }
    if (b == 0)
    {
    
    
        printf("\n您要查找的人不存在!\n");
    }
}


void update(stu* p2)   //通过姓名查找修改数据
{
    
    
    char name[20];
    int b = 0, i;
    printf("\n\t\t\t☆☆☆修改数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("请输入将要修改人的姓名:");
    scanf("%s", name);
    while (p2 != NULL)
    {
    
    
        if (strcmp(name, p2->name) == 0)
        {
    
    
            printf("该同学的基本信息\n");
            printf("姓名:%s\n", p2->name);
            printf("学号:%s\t", p2->num);
            printf("性别:%s\t", p2->sex);
            printf("籍贯:%s\t", p2->from);
            printf("政治面貌:%s\t", p2->political);
            printf("手机号:%s\t", p2->phone);
            printf("QQ号:%s\t", p2->QQ);
            printf("宿舍:%s\n", p2->dorm);
            printf("\n请选择要修改的信息\n");
            printf("\t1.姓名\t2.学号\t3.性别\t4.籍贯\n\t5.政治面貌\t6.手机号\t7.QQ\t8.宿舍\n");
            printf("\n您的选择是(1~8):");
            scanf("%d", &i);
            printf("请输入修改之后的内容\n");
            switch (i)
            {
    
    
            case 1:printf("姓名:");
                scanf("%s", &p2->name);
                break;
            case 2:printf("学号:");
                scanf("%s", &p2->num);
                break;
            case 3:printf("性别:");
                scanf("%s", &p2->sex);
                break;
            case 4:printf("籍贯:");
                scanf("%s", &p2->from);
                break;
            case 5:printf("政治面貌:");
                scanf("%s", &p2->political);
                break;
            case 6:printf("手机号:");
                scanf("%s", &p2->phone);
                break;
            case 7:printf("QQ:");
                scanf("%s", &p2->QQ);
                break;
            case 8:printf("宿舍:");
                scanf("%d", &p2->dorm);
                break;
            }
            printf("\n修改成功!\n");
            printf("=========================================================================\n");
            b = 1;
        }
        p2 = p2->next;
    }
    if (b == 0)
    {
    
    
        printf("没有找到该人的资料!\n");
    }
}


void save(stu* p2)   //保存数据
{
    
    
    FILE* fp;
    char file[15];
    printf("\n\t\t\t☆☆☆保存数据☆☆☆\n");
    printf("----------------------------------------------------------------------\n");
    printf("输入文件名:");
    scanf("%s", file);
    if ((fp = fopen(file, "w")) == NULL)
    {
    
    
        printf("cannot open this file\n");
        exit(0);
    }
    fprintf(fp, "姓名\t学号\t性别\t籍贯\t政治面貌\t手机号\tQQ号\t宿舍\n");
    while (p2 != NULL)
    {
    
    
        fprintf(fp, "%s\t", p2->name);
        fprintf(fp, "%s\t", p2->num);
        fprintf(fp, "%s\t", p2->sex);
        fprintf(fp, "%s\t", p2->from);
        fprintf(fp, "%s\t", p2->political);
        fprintf(fp, "%s\t", p2->phone);
        fprintf(fp, "%s\t", p2->QQ);
        fprintf(fp, "%s\n", p2->dorm);
        p2 = p2->next;
    }
    printf("\n保存成功!\n");
    printf("======================================================================\n");
    fclose(fp);
}


void screen()
{
    
    
    int i;
    char s[251] = {
    
     "欢迎使用由ZM制作班级通讯录管理系统,\n\n\t\t\t本系统用于通讯录管理----排序,打印\n\n\n\t\tWelcome to use produced by ZM class address book\n\n\t\t management system,sorting,printing" };

    printf("\n================================================================================\n");
    printf("\n\n\n\t\t\t");
    for (i = 0; s[i] != NULL; i++)
    {
    
    
        Sleep(30);
        printf("%c", s[i]);
    }
    printf("\n\n\n\n\n\n\n\n\t\t ~ Hi~ o(* ̄▽ ̄*)ブ~ ~ ~祝您旅途愉快~ ~\n");
    printf("================================================================================\n");

}


void main()
{
    
    
    int i;
    system("color 4e");
    screen();
    Sleep(3000);
    print();
    while (1)
    {
    
    
        printf("请输入你的选择(1~9):");
    loop:scanf("%d", &i);
        if (i < 1 || i>9)
        {
    
    
            printf("输入有误,请在1~9中进行选择:");
            goto loop;
        }
        switch (i)
        {
    
    
        case 1:
            inputdata();
            break;
        case 2:
            lookdata(head);
            break;
        case 3:
            insert();
            break;
        case 4:
            deleted();
            break;
        case 5:
            find(head);
            break;
        case 6:
            update(head);
            break;
        case 7:
            save(head);
            break;
        case 8:
            print();
            break;
        case 9:
            exit(1);
            break;
        }
    }
}

31.求两个数组的和

已知一个数组a[5]={1,2,3,4,5}、b[5]={11,4,2,7,9}数组c[5]等于数组a、b对应元素之和。输出数组c中个元素的值。

#include<stdio.h>
`
int main()`
{
    
    
    int a[5] = {
    
     1,2,3,4,5 };
    int b[5] = {
    
     11,4,2,7,9 };
    int c[5];
    int i;
    for (i = 0; i < 5; i++)
    {
    
    
        c[i] = a[i] + b[i];

        printf("%d\n", c[i]);
    }

    return 0;
}

32.自定义函数逆序数组

写一个函数void change(int array[],int n),可以将数组array中的n个元素逆序存放。即array[0]与a[n-1]互换,array[1]与array[n-2]互换……

void change(int array[], int n)
{
    
    
    int i, temp;   //i在数组内,temp负责交换
    for (i = 0; i < n / 2; i++)
    {
    
    
        temp = array[i];
        array[i] = array[n - i - 1];
        array[n - i - 1] = temp;
    }
    for (i = 0; i < n; i++)
        printf("%4d", array[i]);
}

33.求两个矩阵的乘积c。已知矩阵a、b的值

#include<bits/stdc++.h>
using namespace std;

int main(){
    
    
    int a,b,c;
    cout<<"请输入两矩阵的行列:"<<endl;
    cin>>a>>b>>c;                           //分别录入第一个矩阵的行,两矩阵共同行列,第二个矩阵的列
    int X[a][b],Y[b][c],Z[a][c];            //开辟三个二维数组存储矩阵,注意相乘结果的行列值
    cout<<"请输入第一个矩阵:"<<endl;
    for(int i=0;i<a;i++){
    
                       //矩阵的行
        for(int j=0;j<b;j++){
    
                   //矩阵的列
            cin>>X[i][j];
        }
    }
    cout<<"请输入第二个矩阵:"<<endl;
    for(int i=0;i<b;i++){
    
                       //矩阵的行
        for(int j=0;j<c;j++){
    
                   //矩阵的列
            cin>>Y[i][j];
        }
    }
    memset(Z,0,sizeof(Z));          //将二维数组Z初始化为0
    //int temp=0;
    cout<<"矩阵相乘的结果为:"<<endl;
    for(int i=0;i<a;i++){
    
    
        for(int j=0;j<c;j++){
    
    
            for(int k=0;k<b;k++){
    
    
                Z[i][j]=Z[i][j]+X[i][k]*Y[k][j];      //行与列的乘积和为相应结果值
                //temp=temp+X[i][k]*Y[k][j];
            }
            cout<<Z[i][j]<<" ";                  //计算完一个后输出      
            //cout<<temp<<" ";
            //temp=0;
        }
        cout<<endl;                   //计算完一列后输出换行

    }
    return 0;
}


34.应用数组实现输入年year、月month、日date,计算该日期是这年的第几天。

要求:定义二维数组求总天数

#include<stdio.h>

int day_of_year(int year, int month, int day); //自定义函数
int main()
{
int year, month, day;
scanf(“%d %d %d”, &year, &month, &day);
printf(“%d”, (day_of_year(year, month, day)));
return 0;
}
int day_of_year(int year, int month, int day)

int i, leap;   //i指输入月份-1,其他月的天数遍历,leap根据闰年平年切换一维二维
int tab[2][13] = {
    {0,31,28,31,30,31,30,31,31,30,31,30,31},//非 
    {0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年 
};
leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);//1为闰年 0为非 
for (i = 1; i < month; i++) {
    day += tab[leap][i];
}


return day;

}

35.按照平均成绩从高到低的顺序输出学号和平均分。

提示:对平均分排序,当元素互换时,学号元素对应互换。在这里插入图片描述

思路:冒泡排序,冒泡排序算法样例如下:

#include <stdio.h>
int main()
{
    
    
    int i,j,t,a[11];    //定义变量及数组为基本整型
    printf("请输入10个数:\n");
    for(i=1;i<11;i++)
        scanf("%d",&a[i]);    //从键盘中输入10个数
    for(i=1;i<10;i++)    //变量i代表比较的趟数
        for(j=1;j<11-i;j++)    //变最j代表每趟两两比较的次数
            if(a[j]>a[j+1])
            {
    
    
                t=a[j];    //产利用中间变童实现两值互换
                a[j]=a[j+1];
                a[j+1]=t;
            }
            printf("排序后的顺序是:\n");
            for(i=1;i<=10;i++)
                printf("%5d",a[i]);    //将胃泡排序后的顺序输出
        printf("\n");
    return 0;
}

因此
本题代码为:

#include<stdio.h>
struct student
{
    
    
    int num;  //学号
    char name[20];   //姓名
    float score;     //分数
};  //先构造结构体,把需要的东西放一起,方便同时排序调换
int main()
{
    
    

    struct student stu[5] = {
    
     {
    
     17,"keen",97.5 }, {
    
     18,"tom",59 }, {
    
     19,"wangli",31 }, {
    
     20,"lihua",54 }, {
    
     21,"yuzhou",98 }
    };
    struct student t;
    int i, j, k;
    printf("成绩由大到小的顺序:\n");
    for (i = 0; i < 4; i++)   //代表的比较趟数
    {
    
    
        k = i;
        for (j = i + 1; j < 5; j++)
        {
    
    
            if (stu[j].score > stu[k].score)
            {
    
    
                k = j;
            }
            t = stu[k];
            stu[k] = stu[i];
            stu[i] = t;
        }
        for (i = 0; i < 5; i++)//循环输出5个人的成绩 
        {
    
    
            printf("%d,%10s,%6.2f分\n", stu[i].num, stu[i].name, stu[i].score);//输出结果 
        }
        return 0;//主函数返回值为0 

    }
}

36.编写一个函数,实现str中的字符的互换。如”abcde”换成”edcba”。

关于数组逆序的几种做法

1.非递归做法
已有字符串逆序

#include <stdio.h>
int main()
{
    
    
    char arr[] = "abcdef";
    int sz = sizeof(arr) / sizeof(arr[0]); //求的是数组包含的元素个数,'\0'也包括在内
    int left = 0;
    int right = sz - 2;   //减2是因为求得的sz包含了'\0'这个元素。
    while (left < right)
    {
    
    
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
    printf("%s", arr);
    return 0;
}

自己输入逆序

#include <stdio.h>
#include <string.h>
int main()
{
    
    
    char arr[101] = {
    
     0 };     //要给字符数组一定的内存大小,如果写成char arr[] = { 0 };,当在给数组输入的时候就会造成越界访问。
    scanf("%s", arr);
    int sz = strlen(arr);    //在给定字符数组的大小为101的情况下,只能用strlen求输入字符串长度。
                           //用sizeof(arr)/sizeof(arr[0])求出来的是数组大小,为101。
    int left = 0;
    int right = sz - 1;
    while (left < right)
    {
    
    
        char tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
    printf("%s", arr);
    return 0;
}

封装成函数

#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
    
    
    if (left < right)
    {
    
    
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        reverse(str, left + 1, right - 1);
    }

}
int main()
{
    
    
    char arr[101] = {
    
     0 };
    scanf("%s", arr);
    int left = 0;
    int right = strlen(arr) - 1;
    reverse(arr, left, right);
    printf("%s\n", arr);
    return 0;
}

2.递归做法

#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
    
    
    if (left < right)
    {
    
    
        char tmp = str[left];
        str[left] = str[right];
        str[right] = tmp;
        reverse(str, left + 1, right - 1);
    }

}
int main()
{
    
    
    char arr[101] = {
    
     0 };
    scanf("%s", arr);
    int left = 0;
    int right = strlen(arr) - 1;
    reverse(arr, left, right);
    printf("%s\n", arr);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/C214574728/article/details/127210784
今日推荐