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");
}
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]);
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,
感謝各位同學的支持,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395057.html
標籤:其他
