关于程序设计语言实习题目的题解

2021-12-28 23:56
1、统计各年龄段人数。N个年龄通过调用随机函数获取,编写函数把0~9岁年龄段的人数放入数组下标[0]中,把10~19岁年龄段的人数放入数组下标[1]中,以此类推,把100~120岁年龄段的人数放入数组下标[10]中。


#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int a[100000];
int b[11];
int main()
{
    int N;
    scanf("%d",&N);
    srand(time(0));
    int i;
    for(i=0;i<N;i++)
    {
        a[i]=rand()%121;
    }
    for(i=0;i<N;i++)
    {
        if(a[i]<=120&&a[i]>=100)b[10]++;
        else b[a[i]/10]++;
    }
    for(i=0;i<11;i++)printf("%d ",b[i]);
    return 0;
}
 2、求素数。编写一个函数,将大于整数m且紧靠m的k个素数存入数组中,在命令行输入m和k。如输入17和5,输出19,23,29,31,37。

#include <stdio.h>
 
int fun(int n)  //定义函数
{
    int i, l;
    for (i = n + 1; ; i++)  //第一层循环,从给的数一个个往上推
    {
        for (l = 2; l < i; l++)  //对每一个从第一层循环输入的数,开始从2除到i-1
        {
            if (i % l == 0)  //如果有可以整除的
                break;  //就退出这个循环,返回第一个循环
        }  //然后i自增1,循环再次开始
        if (l >= i)  //当i是一个素数,第二层循环不会熔断,就进行到这里
            return i;  //返回这一个i的值
    }  //结束循环
}
 
int main()
{
    int m;
    int k;
    int a[100];//新建一个数组来存放这一系列的数据
 
    printf("请输入整数m:");
    scanf("%d",&m);  //输入一个数,这个数的值同时给到i和k
 
    printf("请输入k:");
    scanf("%d", &k);
 
    a[0] = fun(m);
    for (int i = 1; i <= k; i++)
    {
        a[i] = fun(a[i - 1]);//在k这一范围内反复迭代算出后面一个素数
    }
 
    for (int i = 0; i < k; i++)
    {
        printf("%3d", a[i]);  //输出fun(m)的返回值
    }
 
 
    return 0;
 
}
 10、编写合并整数数组的函数。数组a[M]中有m个元素(m<M),数组b[N]中有n个元素(n<N),且m+n≤M,将a、b两个数组按存放的整数升序排序并合并放入数组a中。

#include<stdio.h>
const int N=1e5,M=1e5;
int a[N],b[M];
void add(int a[],int b[],int n,int m)
{
    for(int i=n,j=0;j<m;j++,i++)a[i]=b[j];
    for(int i=0;i<n+m-1;i++)
    {
        for(int j=0;j<n+m-i-1;j++)
        {
            if(a[j]>a[j+1])
            {
                int t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<m;i++)scanf("%d",&b[i]);
    add(a,b,n,m);
    for(int i=0;i<n+m;i++)printf("%d ",a[i]);
    return 0;
    
}
12、 数组插入问题。生成一个10元素构成的一维数组,数组元素由用户随机输入。要求:先按照升序排列并输出。再输入一个数,按照升序的规律将其插入并输出。

#include<stdio.h>
int a[11];
void quick_sort(int a[],int l,int r)
{
    if(l>=r)return ;
    int i=l-1,j=r+1;
    int x=a[l+r>>1];
    while(i<j)
    {
        do i++;while(a[i]<x);
        do j--;while(a[j]>x);
        if(i<j)
        {
            int t=a[j];
            a[j]=a[i];
            a[i]=t;
        }
    }
    quick_sort(a,l,j);
    quick_sort(a,j+1,r);
}
int main()
{
    printf("请输入十个元素:");
    for(int i=0;i<10;i++)scanf("%d",&a[i]);
    quick_sort(a,0,9);
    for(int i=0;i<10;i++)printf("%d ",a[i]);
    printf("请再输入一个元素:");
    scanf("%d",&a[10]);
    quick_sort(a,0,10);
    for(int i=0;i<11;i++)printf("%d ",a[i]);
    return 0;
    
}
14、链表操作。建立单向int链表,连续输入5个结点创建链表,并实现在原链表中插入数字、删除数字、查找数字的功能。

#include<stdio.h>
#include<stdlib.h>
 
typedef struct node
{
    int data;//数据部分
    struct node* next;//指针部分
}Node;
 
typedef Node List;
 
//初始化链表
List* initList();
 
//销毁链表
void destoryList(List* list);
 
//插入数据
void insertData(List* list, int Data);
 
//删除数据
void removeData(List* list, int Data);
 
//查找数据
Node* findData(List* list, int Data);
 
//打印链表内容
void printList(List* list);
 
int main()
{
    //初始化链表
    List* list = initList();
    //插入数据
    for (int i = 0; i < 5; i++)
    {
        printf("请输入链表第%d个元素:", i+1);
        int ins; scanf("%d", &ins);
        insertData(list, ins);
    }
loop:
    printf("链表内容为:");
    printList(list);
    printf("请选择你想要进行的功能\n1.插入\n2.查找\n3.删除\n4.退出\n请输入你的选择(1-4):");
    int ipt=0; scanf("%d", &ipt); //输入字符会出错
    switch (ipt)                  //建立一个switch选择结构来选择功能
    {
    case 1:goto Ins;
        break;
    case 2:goto Find;
        break;
    case 3:goto Del;
        break;
    case 4:goto End;
        break;
    default:printf("输入错误!");
        system("pause");         //显示错误信息
        system("cls");           //清屏
        goto loop;
        break;
    }
Ins://插入数据
    int k; printf("请输入要在结尾插入的数:");
    scanf("%d", &k);
    insertData(list, k);
    printf("插入后的链表内容为:");
    printList(list);
    system("pause");
    system("cls"); 
    goto loop;
Find://查找数据
    int n; printf("请输入要查找的位置");
    scanf("%d", &n);
    printf("%d的地址:%p\n", n,findData(list, n));
    system("pause");
    system("cls");
    goto loop;
Del://删除数据
    int m; printf("请输入要删除的位置:");
    scanf("%d", &m);
    removeData(list, m);
    printf("删除后的链表内容为:");
    printList(list);
    system("pause");
    system("cls");
    goto loop;
End:
    //销毁链表
    destoryList(list);
    return 0;
}
 
//初始链表
List* initList()
{
    List* list = (List*)malloc(sizeof(Node));
    list->data = 0;
    list->next = NULL;
    return list;
}
 
//销毁链表
void destoryList(List* list)
{
    Node* pHead = list;//用来记录初始化的链表头结点
    while (list != NULL)
    {
        //先移到下一个结点
        list = list->next;
        //释放头结点
        free(pHead);
        //记录新的头结点
        pHead = list;
    }
}
 
//插入数据(一般都在表尾插入数据)
void insertData(List* list, int Data)
{
    //先分配一个新的结点
    Node* pNode = (Node*)malloc(sizeof(Node));
    pNode->data = Data;
    pNode->next = NULL;
    //将新结点链接到到尾部
    while (list->next != NULL)
    {
        list = list->next;//先找到链表的尾结点
    }
    list->next = pNode;//将新结点链接到尾结点
}
 
//删除数据(头结点不可删除,不然后面的结点就无法再进行遍历了)
void removeData(List* list, int Data)
{
    //1.查找结点,并记录上一个结点
    //Node *pPre = NULL;
    Node* pPre = list;
    list = list->next;//跳过头结点
    while (list != NULL)
    {
        if (list->data == Data)
        {
            break;
        }
        pPre = list;
        list = list->next;
    }
    if (list != NULL)
    {
        //2.找到后,将上一个结点和当前结点的下一个结点链接
        pPre->next = list->next;
        //3.删除当前结点
        free(list);
    }
}
 
//查找数据
Node* findData(List* list, int Data)
{
    while (list != NULL)
    {
        if (list->data == Data)
        {
            break;
        }
        list = list->next;
    }
    return list;
}
 
//打印链表内容
void printList(List* list)
{
    list = list->next;//跳过头结点
    while (list != NULL)
    {
        printf("%5d", list->data);
        list = list->next;
    }
    printf("\n");

16、统计频率。读入一个文件,文件中包含字母,数字,空格,标点符号等。请统计文件中的字母,数字,空格和其他符号的数目,在屏幕上显示。

#include<stdio.h>
int a[4];
int main()
{
    FILE *fp;
    fp=fopen("D:\\a.txt","r");
    char s[100];
    while( fgets (s, 100 , fp)!= NULL )
    fclose(fp);
     for(int j=0;s[j];j++)
     {
         int i=s[j]-'\0';
         if(i==32)a[2]++;
         else if((i>=65&&i<=90)||(i>=97&&i<=122))a[0]++;
         else if(i>=48&&i<=57)a[1]++;
         else a[3]++;
    }
    printf("字母个数:%d\n",a[0]);
    printf("数字个数:%d\n",a[1]);
    printf("空格个数:%d\n",a[2]);
    printf("其他符号个数:%d\n",a[3]);
    return 0; 
 
}
 

17、 字符串次数问题。编写函数统计给定字符串在文中出现的次数,如文件中内容为asd asasdfg asd as zx67 asd mklo,给定字符串为as,则函数返回6。文件名和给定字符串由命令行输入得到。

#include <stdio.h>
#include <string.h>
 
int check(char* a, char* b) {
    int count = 0;
    for (int i = 0; i < strlen(a); i++)  //第一层循环遍历a数组
    {
        for (int j = 0; j < strlen(b); j++)  //第二层循环遍历b数组
        {
            if (a[i] == b[j]) //在a中找到和b第一个字符一样的位置
            {
                do
                {
                    count++;    //计数器+1
                    i++, j++;    
                } while (a[i] != b[j]);//验证a[i+1]和b[i+1]是否相等,若相等继续循环,不相等退出循环
            }
        }
    }
    return count;
}
 
int main() {
 
    char sourceName[100] = { '\0' };//从命令行输入源文件名 
    printf("输入源文件文件名:");
    scanf("%s", sourceName);
 
    char a[100] = { '\0' };//安全地初始化字符数组
    char b[] = { '\0' };
    printf("请输入要查找的字符串:");
    scanf("%s", &b);
 
    FILE* fp1;  //建立一个file类型的指针
 
    fp1 = fopen(sourceName, "r");  //以只读方式打开源文件
    fscanf(fp1, "%[^\n]%*c", a); //将文件中的字符串读取到数组中, "%[^\n]%*c" 可以让scanf读取空格 
    fclose(fp1);  //关闭外部文件
 
 
    printf("%d", check(a,b));  //输出计数器中的值
 
    return 0;

18、统计字母个数。读取文件中的字符串,统计从“a”到“z”26个字母各自出现的次数,并将结果放入数组中。如文件中有字符串abcdefgabcdeabc,输出33322110000000000000000000。

#include<stdio.h>
int a[26];
int i;
int main()
{
    FILE *file;
    file=fopen("D:\\a.txt","r");
    char ch[100000],c;
    fscanf(file,"%s",ch);
    for(int i=0;ch[i];i++)a[ch[i]-'a']++;
    for(int i=0;i<26;i++)printf("%d",a[i]);
    fclose(file)
    return 0;
}
22、 删除字符。从源文件中读取字符,编写函数将指定字符从文件中删除,结果写入目标文件中,文件中的字母不区分大小写。源文件文件名、目标文件文件名、指定字符均从命令行得到。如源文件中内容为source.txt,指定字符为n,目标文件中内容为output.txt。注意需要用命令行输入参数。

#include <stdio.h>
#include <string.h>
 
void delchar(char* str, char ch)  //删去指定字符
{
    char* p = str;
    while (*str)  //遍历字符串 
    {
        if (*str != ch)   //跳过 指定字符 
            *p++ = *str;
        str++;
    }
    *p = '\0';
}
 
char trans(char ch)  //大小写转换
{
    if (ch >= 'a' && ch <= 'z')//如果是小写换成大写 
        ch = ch - 32;
 
    else if (ch >= 'A' && ch <= 'Z')//如果是大写换成小写 
        ch = ch + 32;
 
    return ch;
}
 
int main() {
 
    char sourceName[100] = { '\0' };//从命令行输入源文件名 ,初始化为换行符
    printf("输入源文件文件名:");
    scanf("%s", sourceName);
 
    char outputName[100] = { '\0' };  //从命令行 输入目标文件名  ,初始化为换行符
    printf("输入目标文件文件名:");
    scanf("%s", outputName);
 
    char a[100] = { '\0' };//初始化为换行符 以免strlen()计算长度错误 
    char b;
    printf("请输入指定字符:");//从命令行输入指定字符 
    scanf("%s", &b);
 
    FILE* fp1;  //建立两个file类型的指针
    FILE* fp2;
 
    fp1 = fopen(sourceName, "r");  //以只读方式打开源文件
    fscanf(fp1, "%[^\n]%*c", a); //将文件中的字符串读取到数组中, "%[^\n]%*c" 可以让scanf读取空格 
    fclose(fp1);  //关闭外部文件
 
    delchar(a, b);       //删去对应输入字符
    delchar(a, trans(b));//删去对应字符的大/小写转置
 
    fp2 = fopen(outputName, "wt+");//新建并以读写方式打开目标文件 
    for (int i = 0; i < strlen(a); i++)//将字符数组写入文件中 
    {
        fprintf(fp2, "%c", *(a + i));
    }
    fclose(fp2);//关闭外部文件
    return 0;
24、哥德巴赫猜想验证。验证1000以内的正偶数都能够分解为两个素数之和 

#include<stdio.h>
int a[1000];
int idx;
int main()
{
    for (int i = 2; i <= 1000; i++)
    {
        int  t = 1;
        for (int j = 2; j <= i / 2; j++)
        {
            if (i % j == 0)
            {
                t = 0; break;
            }
        }
        if (t)a[++idx] = i;
    }
    a[0]=1;
 
    int  b = 1,l,r;
    for (int i = 2; i <= 1000; i += 2)
    {
        for(l=0,r=idx;l<=idx&&r>=0;l++)
        {
            while(a[l]+a[r]>i)r--;
            if(a[l]+a[r]==i)break;
        }
        if(l>r)
        {
            b=0;
            break;
        }
    
    }
    if (b)printf("1000以内的正偶数都能够分解为两个素数之和");
    else printf("错误");
    return 0;
}
 25、分数比较问题。比较两个分数的大小。

#include<stdio.h>
int main()
{
    int a,b,c,d;
    printf("请按照a/b的格式输入两个分式\n");
    scanf("%d/%d",&a,&b);
    scanf("%d/%d",&c,&d); 
    int m=a*d;
    int n=b*c;
    if(m>n)printf("%d/%d>%d/%d",a,b,c,d);
    else if (m<n)printf("%d/%d<%d/%d",a,b,c,d);
    else printf("%d/%d=%d/%d",a,b,c,d);
    return 0;
}
 笔者写下这篇文章以帮助同学们完成程序设计实习题目,由于时间关系来不及写注释。

另在此感谢于学长提供的部分题目的题解。

希望各位同学能够完美地完成此次实习。

如文章中的题解有错误或者有不懂得地方,可以联系qq:3357607649。

感谢各位同学的支持。
 
分享到:
文章评论 · 所有评论
评论请遵守当地法律法规
点击加载更多
本月点击排行
精彩图片
京ICP备14056871号
Copyright ©2022 USN, All Rights Reserved