inital commit

This commit is contained in:
gabriel venberg 2021-03-26 22:39:35 -05:00
commit d1948b0e58
67 changed files with 5280 additions and 0 deletions

View file

@ -0,0 +1,3 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

View file

@ -0,0 +1,89 @@
/*
* Copyright (C) 2021 Gabriel Venberg
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
*
* @author Gabriel Venberg
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.swing.JOptionPane;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Client {
public static String fileToString(String filePath) throws FileNotFoundException{//helper function.
File file = new File(filePath);
Scanner input = new Scanner(file);
String output = "";
while(input.hasNextLine()){
output = output +'\n'+input.nextLine();
}
return output;
}
public static void main(String[] args) throws FileNotFoundException{
String[] functions = {"Harmonic", "sum", "find"};
String input;
while(true){
input = (String) JOptionPane.showInputDialog(null, "What function would you like to test?",
"Testing", JOptionPane.QUESTION_MESSAGE, null, functions, functions[1]);
switch(input){
case "Harmonic":
input = (String) JOptionPane.showInputDialog(null, "what harmonic number do you want?", "Harmonic", 0);
double hResult =Recursion.harmonic(Integer.parseInt(input));
JOptionPane.showMessageDialog(null, "the result is "+hResult);
System.out.println("tested harmonic, input was "+input+" and result was "+hResult);
break;
case "sum":
while(true){ //the loop is just to provide the option of continuing if you want
input = (String) JOptionPane.showInputDialog(null, "enter the file containing the array", "Sum", 0);
int sResult;
try{
sResult = Recursion.sum(new File(input));
JOptionPane.showMessageDialog(null, sResult);
System.out.println("testing sum, user entered "+input+" and file contained "+fileToString(input)+". result was "+sResult);
}
catch(FileNotFoundException e){
int reply = JOptionPane.showConfirmDialog(null, "file does not exit", "continue?", 0);
if(reply == 0){
continue;
}
break;
}
break;
}
break;
case "find": //you didnt say anything about how this loop should behave. Also, you spesifically said the find method has a void return type, so I cant use the dialog box for output.
input = (String) JOptionPane.showInputDialog(null, "Enter the directory you want to search", "Find", 0);
String input2 = JOptionPane.showInputDialog(null, "enter your seach term", 0);
try{
Recursion.find(input, input2);
System.out.println("tested find, start directory was "+input+" and search term was "+input2);
}
catch (IOException ex) {
JOptionPane.showMessageDialog(null, "cant find that file");
}
break;
}
int doAgain = JOptionPane.showConfirmDialog(null, null, "continue?", 0);
if(doAgain==1){break;}
}
}
}

View file

@ -0,0 +1,119 @@
/*
* Copyright (C) 2021 Gabriel Venberg
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
*
* @author Gabriel Venberg
*/
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;
import java.lang.StringBuilder;
public class Recursion {
public static int sum(File file) throws FileNotFoundException{
Scanner input = new Scanner(file);
int fileLength = 0;
//wont be using the singly linked list class from last time, as it was really incomplete. Ill hack this together with a proper array.
while(input.hasNext()==true){
if(input.hasNextInt()){
fileLength ++;
input.nextInt();
}
else{
input.next();
}
}
input.close();
input = new Scanner(file); //resetting the scanner.
int[] product = new int[fileLength];
for(int i=0; i<product.length; i++){
product[i]=input.nextInt();
}
return sumCalc(product);
}
public static double harmonic(double n){
if(n<=0){
throw new IllegalArgumentException("input must be > 1");
}
else if(n==1){
return 1;
}
else{
return (1.0/n)+harmonic(n-1.0);
}
}
//splitting up the code here, was to implement the sum by itself.
private static int sumCalc(int a[]){
/* It can actually be realy easy to check if a number is a power of 2 thanks to binary.
all powers of 2 take the form of 1 followed by a n 0's. If we sub 1 from this number,
it becomes 0 followed by n 0's. Something like this (for the number 16)
10000 (16)
01111 (15)
So taking a bitwise and will give us 0. (note that this only works with counting numbers, so no 0!)
Note that I dont have a proof that only powers of 2 do this, just a strong
suspicion and a brute force search of the first million integers in python.
I may have gotten a bit distracted...
*/
if((a.length&(a.length-1))==0){
if(a.length==1){return a[0];}
else{
int[] tmp = new int[a.length/2];
for(int i=0; i<tmp.length; i++){
tmp[i] = a[2*i]+a[2*i+1];
}
return sumCalc(tmp);
}
}
else{
throw new IllegalArgumentException("input must be a power of 2.");
}
}
public static void find(String startPath, String filename) throws IOException{
/*so, I spent an hour trying to write a (O(n!)(I think)) recursive substring search function,
rather than a find [startPath] -name 'filename' ... I can *totaly* read...
*/
File startFile = new File(startPath);
if(!startFile.isDirectory()){ //base case is a non-directory
if(startFile.getName().equals(filename)){
System.out.println(startFile.getCanonicalPath());
}
}
else{
String[] nextFiles = startFile.list(); //array of files to try next
for(int i=0; i<nextFiles.length; i++){
find(nextFiles[i], filename);
}
}
}
}